Skip to content
This repository has been archived by the owner on Nov 17, 2020. It is now read-only.

Commit

Permalink
giscanner: special case G_GINT64_CONSTANT and G_GUINT64_CONSTANT + misc
Browse files Browse the repository at this point in the history
This let the macro expands to its value as gint64/guint64.

Also
- fix lexer identifier/typdef detection for macro and misc

- do not discard cast
  • Loading branch information
prahal authored and tomeuv committed Aug 3, 2012
1 parent d0ffee9 commit beb5c82
Show file tree
Hide file tree
Showing 5 changed files with 34 additions and 4 deletions.
4 changes: 3 additions & 1 deletion giscanner/scannerlexer.l
Expand Up @@ -147,7 +147,9 @@ stringtext ([^\\\"])|(\\.)
"__typeof" { if (!parse_ignored_macro()) REJECT; }
"_Bool" { return BOOL; }

[a-zA-Z_][a-zA-Z_0-9]* { if (scanner->macro_scan) return IDENTIFIER; else REJECT; }
"G_GINT64_CONSTANT" { return INTL_CONST; }
"G_GUINT64_CONSTANT" { return INTUL_CONST; }
[a-zA-Z_][a-zA-Z_0-9]* { if (scanner->macro_scan) return check_identifier(scanner, yytext); else REJECT; }

"asm" { if (!parse_ignored_macro()) REJECT; }
"auto" { return AUTO; }
Expand Down
23 changes: 21 additions & 2 deletions giscanner/scannerparser.y
Expand Up @@ -150,6 +150,7 @@ out:

%token INTEGER FLOATING CHARACTER STRING

%token INTL_CONST INTUL_CONST
%token ELLIPSIS ADDEQ SUBEQ MULEQ DIVEQ MODEQ XOREQ ANDEQ OREQ SL SR
%token SLEQ SREQ EQ NOTEQ LTEQ GTEQ ANDAND OROR PLUSPLUS MINUSMINUS ARROW

Expand Down Expand Up @@ -377,6 +378,20 @@ unary_expression
break;
}
}
| INTL_CONST '(' unary_expression ')'
{
$$ = $3;
if ($$->const_int_set) {
$$->base_type = gi_source_basic_type_new ("gint64");
}
}
| INTUL_CONST '(' unary_expression ')'
{
$$ = $3;
if ($$->const_int_set) {
$$->base_type = gi_source_basic_type_new ("guint64");
}
}
| SIZEOF unary_expression
{
$$ = gi_source_symbol_new (CSYMBOL_TYPE_INVALID, scanner->current_filename, lineno);
Expand Down Expand Up @@ -419,8 +434,12 @@ cast_expression
: unary_expression
| '(' type_name ')' cast_expression
{
ctype_free ($2);
$$ = $4;
if ($$->const_int_set || $$->const_double_set || $$->const_string != NULL) {
$$->base_type = $2;
} else {
ctype_free ($2);
}
}
;

Expand Down Expand Up @@ -588,7 +607,7 @@ logical_or_expression

conditional_expression
: logical_or_expression
| logical_or_expression '?' expression ':' conditional_expression
| logical_or_expression '?' expression ':' expression
{
$$ = gi_source_symbol_get_const_boolean ($1) ? $3 : $5;
}
Expand Down
5 changes: 4 additions & 1 deletion giscanner/transformer.py
Expand Up @@ -719,7 +719,10 @@ def _create_const(self, symbol):
typeval = ast.TYPE_STRING
value = unicode(symbol.const_string, 'utf-8')
elif symbol.const_int is not None:
typeval = ast.TYPE_INT
if symbol.base_type is not None:
typeval = self._create_type_from_base(symbol.base_type)
else:
typeval = ast.TYPE_INT
value = '%d' % (symbol.const_int, )
elif symbol.const_double is not None:
typeval = ast.TYPE_DOUBLE
Expand Down
5 changes: 5 additions & 0 deletions tests/scanner/Regress-1.0-expected.gir
Expand Up @@ -44,6 +44,11 @@ and/or use gtk-doc annotations. -->
c:type="REGRESS_DOUBLE_CONSTANT">
<type name="gdouble" c:type="gdouble"/>
</constant>
<constant name="G_GINT64_CONSTANT"
value="1000"
c:type="REGRESS_G_GINT64_CONSTANT">
<type name="gint64" c:type="gint64"/>
</constant>
<constant name="INT_CONSTANT" value="4422" c:type="REGRESS_INT_CONSTANT">
<type name="gint" c:type="gint"/>
</constant>
Expand Down
1 change: 1 addition & 0 deletions tests/scanner/regress.h
Expand Up @@ -259,6 +259,7 @@ GQuark regress_atest_error_quark (void);
#define REGRESS_DOUBLE_CONSTANT 44.22
#define REGRESS_STRING_CONSTANT "Some String"
#define REGRESS_Mixed_Case_Constant 4423
#define REGRESS_G_GINT64_CONSTANT (G_GINT64_CONSTANT (1000))

/* structures */
typedef struct _RegressTestStructA RegressTestStructA;
Expand Down

0 comments on commit beb5c82

Please sign in to comment.