/*
- * Copyright (C) 2012
+ * Copyright (C) 2012, 2013
* Wolfgang Bumiller
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
size_t count;
ast_value* *params;
uint32_t flags;
+ /* void foo(string...) gets varparam set as a restriction
+ * for variadic parameters
+ */
+ ast_expression *varparam;
/* The codegen functions should store their output values
* so we can call it multiple times without re-evaluating.
* Store lvalue and rvalue seperately though. So that
#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_INCLUDE_DEF (1<<5)
+#define AST_FLAG_IS_VARARG (1<<6)
+#define AST_FLAG_ALIAS (1<<7)
+#define AST_FLAG_TYPE_MASK (AST_FLAG_VARIADIC | AST_FLAG_NORETURN)
/* Value
*
ast_expression_common expression;
const char *name;
+ const char *desc;
+
+ const char *argcounter;
/*
int vtype;
bool ast_compare_type(ast_expression *a, ast_expression *b);
ast_expression* ast_type_copy(lex_ctx ctx, const ast_expression *ex);
#define ast_type_adopt(a, b) ast_type_adopt_impl((ast_expression*)(a), (ast_expression*)(b))
-bool ast_type_adopt_impl(ast_expression *self, const ast_expression *other);
+void ast_type_adopt_impl(ast_expression *self, const ast_expression *other);
void ast_type_to_string(ast_expression *e, char *buf, size_t bufsize);
+typedef enum ast_binary_ref_s {
+ AST_REF_LEFT = 1 << 1,
+ AST_REF_RIGHT = 1 << 2,
+ AST_REF_ALL = (AST_REF_LEFT | AST_REF_RIGHT)
+} ast_binary_ref;
+
+
/* Binary
*
* A value-returning binary expression.
int op;
ast_expression *left;
ast_expression *right;
+ ast_binary_ref refs;
+
};
ast_binary* ast_binary_new(lex_ctx ctx,
int op,
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*);
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*);
ast_expression_common expression;
ast_expression *func;
ast_expression* *params;
+ ast_expression *va_count;
};
ast_call* ast_call_new(lex_ctx ctx,
ast_expression *funcexpr);
};
ast_block* ast_block_new(lex_ctx ctx);
void ast_block_delete(ast_block*);
-bool ast_block_set_type(ast_block*, ast_expression *from);
+void ast_block_set_type(ast_block*, ast_expression *from);
bool ast_block_codegen(ast_block*, ast_function*, bool lvalue, ir_value**);
void ast_block_collect(ast_block*, ast_expression*);
char labelbuf[64];
ast_block* *blocks;
+
+ ast_value *varargs;
+ ast_value *argc;
+ ast_value *fixedparams;
};
ast_function* ast_function_new(lex_ctx ctx, const char *name, ast_value *vtype);
/* This will NOT delete the underlying ast_value */