]> git.xonotic.org Git - xonotic/gmqcc.git/blobdiff - ast.c
more context copies
[xonotic/gmqcc.git] / ast.c
diff --git a/ast.c b/ast.c
index 659818189ea965273926338c293f8f05cbc90a87..50b6e872dd540342c94037460174b3e74546db3d 100644 (file)
--- a/ast.c
+++ b/ast.c
@@ -91,7 +91,6 @@ static void ast_expression_delete_full(ast_expression *self)
 
 MEM_VEC_FUNCTIONS(ast_expression_common, ast_value*, params)
 
-static ast_expression* ast_type_copy(lex_ctx ctx, const ast_expression *ex);
 ast_value* ast_value_copy(const ast_value *self)
 {
     size_t i;
@@ -117,8 +116,7 @@ ast_value* ast_value_copy(const ast_value *self)
     return cp;
 }
 
-#define ast_type_adopt(a, b) ast_type_adopt_impl((ast_expression*)(a), (ast_expression*)(b))
-static bool ast_type_adopt_impl(ast_expression *self, const ast_expression *other)
+bool ast_type_adopt_impl(ast_expression *self, const ast_expression *other)
 {
     size_t i;
     const ast_expression_common *fromex;
@@ -149,7 +147,7 @@ static ast_expression* ast_shallow_type(lex_ctx ctx, int vtype)
     return self;
 }
 
-static ast_expression* ast_type_copy(lex_ctx ctx, const ast_expression *ex)
+ast_expression* ast_type_copy(lex_ctx ctx, const ast_expression *ex)
 {
     size_t i;
     const ast_expression_common *fromex;
@@ -778,6 +776,7 @@ bool ast_global_codegen(ast_value *self, ir_builder *ir)
         ir_function *func = ir_builder_create_function(ir, self->name, self->expression.next->expression.vtype);
         if (!func)
             return false;
+        func->context = ast_ctx(self);
 
         self->constval.vfunc->ir_func = func;
         self->ir_v = func->value;
@@ -789,6 +788,7 @@ bool ast_global_codegen(ast_value *self, ir_builder *ir)
         v = ir_builder_create_field(ir, self->name, self->expression.next->expression.vtype);
         if (!v)
             return false;
+        v->context = ast_ctx(self);
         if (self->isconst) {
             asterror(ast_ctx(self), "TODO: constant field pointers with value\n");
             goto error;
@@ -802,6 +802,7 @@ bool ast_global_codegen(ast_value *self, ir_builder *ir)
         asterror(ast_ctx(self), "ir_builder_create_global failed\n");
         return false;
     }
+    v->context = ast_ctx(self);
 
     if (self->isconst) {
         switch (self->expression.vtype)
@@ -853,6 +854,7 @@ bool ast_local_codegen(ast_value *self, ir_function *func, bool param)
     v = ir_function_create_local(func, self->name, self->expression.vtype, param);
     if (!v)
         return false;
+    v->context = ast_ctx(self);
 
     /* A constant local... hmmm...
      * I suppose the IR will have to deal with this
@@ -935,6 +937,9 @@ bool ast_function_codegen(ast_function *self, ir_builder *ir)
     /* TODO: check return types */
     if (!self->curblock->is_return)
     {
+        return ir_block_create_return(self->curblock, NULL);
+        /* From now on the parser has to handle this situation */
+#if 0
         if (!self->vtype->expression.next ||
             self->vtype->expression.next->expression.vtype == TYPE_VOID)
         {
@@ -946,6 +951,7 @@ bool ast_function_codegen(ast_function *self, ir_builder *ir)
             asterror(ast_ctx(self), "function `%s` missing return value", self->name);
             return false;
         }
+#endif
     }
     return true;
 }
@@ -1334,9 +1340,9 @@ bool ast_ifthen_codegen(ast_ifthen *self, ast_function *func, bool lvalue, ir_va
         return false;
 
     /* add jumps ot the merge block */
-    if (ontrue && !ir_block_create_jump(ontrue, merge))
+    if (ontrue && !ontrue->final && !ir_block_create_jump(ontrue, merge))
         return false;
-    if (onfalse && !ir_block_create_jump(onfalse, merge))
+    if (onfalse && !onfalse->final && !ir_block_create_jump(onfalse, merge))
         return false;
 
     /* we create the if here, that way all blocks are ordered :)
@@ -1654,7 +1660,7 @@ bool ast_loop_codegen(ast_loop *self, ast_function *func, bool lvalue, ir_value
         else if (bpostcond)  tmpblock = bpostcond;
         else if (bprecond)   tmpblock = bprecond;
         else                 tmpblock = bout;
-        if (!ir_block_create_jump(end_bbody, tmpblock))
+        if (!end_bbody->final && !ir_block_create_jump(end_bbody, tmpblock))
             return false;
     }