/*
- * Copyright (C) 2012
+ * Copyright (C) 2012, 2013
* Wolfgang Bumiller
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
bool side_effects;
} ast_node_common;
-#define ast_delete(x) ( ( (ast_node*)(x) ) -> node.destroy )((ast_node*)(x))
+#define ast_delete(x) (*( ((ast_node*)(x))->node.destroy ))((ast_node*)(x))
#define ast_unref(x) do \
{ \
if (! (((ast_node*)(x))->node.keep) ) { \
} ast_expression_common;
#define AST_FLAG_VARIADIC (1<<0)
#define AST_FLAG_NORETURN (1<<1)
+#define AST_FLAG_INLINE (1<<2)
+#define AST_FLAG_INITIALIZED (1<<3)
+#define AST_FLAG_DEPRECATED (1<<4)
+#define AST_FLAG_TYPE_MASK (AST_FLAG_VARIADIC | AST_FLAG_NORETURN)
/* Value
*
ast_expression_common expression;
const char *name;
+ const char *desc;
/*
int vtype;
ast_value *next;
*/
- bool cvq; /* const/var qualifier */
+ int cvq; /* const/var qualifier */
bool isfield; /* this declares a field */
bool hasvalue;
union {
ast_expression *owner;
unsigned int field;
const char *name;
+ bool rvalue;
};
ast_member* ast_member_new(lex_ctx ctx, ast_expression *owner, unsigned int field, const char *name);
void ast_member_delete(ast_member*);
+bool ast_member_set_name(ast_member*, const char *name);
bool ast_member_codegen(ast_member*, ast_function*, bool lvalue, ir_value**);
struct ast_breakcont_s
{
ast_expression_common expression;
- bool is_continue;
+ bool is_continue;
+ unsigned int levels;
};
-ast_breakcont* ast_breakcont_new(lex_ctx ctx, bool iscont);
+ast_breakcont* ast_breakcont_new(lex_ctx ctx, bool iscont, unsigned int levels);
void ast_breakcont_delete(ast_breakcont*);
bool ast_breakcont_codegen(ast_breakcont*, ast_function*, bool lvalue, ir_value**);
const char *name;
ir_block *irblock;
ast_goto **gotos;
+ /* means it has not yet been defined */
+ bool undefined;
};
-ast_label* ast_label_new(lex_ctx ctx, const char *name);
+ast_label* ast_label_new(lex_ctx ctx, const char *name, bool undefined);
void ast_label_delete(ast_label*);
void ast_label_register_goto(ast_label*, ast_goto*);
ir_function *ir_func;
ir_block *curblock;
- ir_block *breakblock;
- ir_block *continueblock;
+ ir_block **breakblocks;
+ ir_block **continueblocks;
#if 0
/* In order for early-out logic not to go over