if (!self) { \
return NULL; \
} \
- ast_node_init((ast_node*)self, ctx); \
+ ast_node_init((ast_node*)self, ctx, TYPE_##T); \
( (ast_node*)self )->node.destroy = (ast_node_delete*)destroyfn
/* It must not be possible to get here. */
}
/* Initialize main ast node aprts */
-static void ast_node_init(ast_node *self, lex_ctx ctx)
+static void ast_node_init(ast_node *self, lex_ctx ctx, int nodetype)
{
self->node.context = ctx;
self->node.destroy = &_ast_node_destroy;
self->node.keep = false;
+ self->node.nodetype = nodetype;
}
/* General expression initialization */
mem_d(self);
}
+ast_member* ast_member_new(lex_ctx ctx, ast_expression *owner, unsigned int field)
+{
+ ast_instantiate(ast_member, ctx, ast_member_delete);
+ if (field >= 3) {
+ mem_d(self);
+ return NULL;
+ }
+
+ ast_expression_init((ast_expression*)self, (ast_expression_codegen*)&ast_member_codegen);
+
+ self->expression.vtype = TYPE_FLOAT;
+ self->expression.next = NULL;
+
+ self->owner = owner;
+ self->field = field;
+
+ return self;
+}
+
+void ast_member_delete(ast_member *self)
+{
+ ast_unref(self->owner);
+ ast_expression_delete((ast_expression*)self);
+ mem_d(self);
+}
+
ast_ifthen* ast_ifthen_new(lex_ctx ctx, ast_expression *cond, ast_expression *ontrue, ast_expression *onfalse)
{
ast_instantiate(ast_ifthen, ctx, ast_ifthen_delete);
}
ast_store* ast_store_new(lex_ctx ctx, int op,
- ast_value *dest, ast_expression *source)
+ ast_expression *dest, ast_expression *source)
{
ast_instantiate(ast_store, ctx, ast_store_delete);
ast_expression_init((ast_expression*)self, (ast_expression_codegen*)&ast_store_codegen);
return true;
}
+bool ast_member_codegen(ast_member *self, ast_function *func, bool lvalue, ir_value **out)
+{
+ ast_expression_codegen *cgen;
+ ir_value *vec, *field;
+
+ cgen = self->owner->expression.codegen;
+ if (!(*cgen)((ast_expression*)(self->owner), func, true, &vec))
+ return false;
+
+ if (vec->vtype != TYPE_VECTOR)
+ return false;
+
+ *out = ir_value_vector_member(vec, self->field);
+
+ return (*out != NULL);
+}
+
bool ast_ifthen_codegen(ast_ifthen *self, ast_function *func, bool lvalue, ir_value **out)
{
ast_expression_codegen *cgen;