Fix problem with nested function calls such as y = f(f(x))
authorBrian <brian@yutani.localnet.net>
Wed, 7 Mar 2007 19:59:01 +0000 (12:59 -0700)
committerBrian <brian@yutani.localnet.net>
Wed, 7 Mar 2007 19:59:01 +0000 (12:59 -0700)
Replace CurFunction with curFuncEndLabel.

src/mesa/shader/slang/slang_codegen.c
src/mesa/shader/slang/slang_emit.c
src/mesa/shader/slang/slang_typeinfo.h

index d1e3544b5455dc084abc5f9b8f0f2843a7307fd9..fc000dbf7be9c9559c51dd06bf68411ad2ddadc9 100644 (file)
@@ -437,6 +437,7 @@ static slang_ir_node *
 new_label(slang_label *label)
 {
    slang_ir_node *n = new_node0(IR_LABEL);
+   assert(label);
    if (n)
       n->Label = label;
    return n;
@@ -474,6 +475,7 @@ static slang_ir_node *
 new_jump(slang_label *dest)
 {
    slang_ir_node *n = new_node0(IR_JUMP);
+   assert(dest);
    if (n)
       n->Label = dest;
    return n;
@@ -1007,7 +1009,7 @@ slang_inline_function_call(slang_assemble_ctx * A, slang_function *fun,
                                                     &inlined->children,
                                                     inlined->num_children);
       lab->type = SLANG_OPER_LABEL;
-      lab->label = A->CurFunction->end_label;
+      lab->label = A->curFuncEndLabel;
    }
 
    for (i = 0; i < totalArgs; i++) {
@@ -1049,16 +1051,13 @@ _slang_gen_function_call(slang_assemble_ctx *A, slang_function *fun,
 {
    slang_ir_node *n;
    slang_operation *inlined;
-   slang_function *prevFunc;
+   slang_label *prevFuncEndLabel;
+   char name[200];
 
-   prevFunc = A->CurFunction;
-   A->CurFunction = fun;
-
-   if (!A->CurFunction->end_label) {
-      char name[200];
-      sprintf(name, "__endOfFunc_%s_", (char *) A->CurFunction->header.a_name);
-      A->CurFunction->end_label = _slang_label_new(name);
-   }
+   prevFuncEndLabel = A->curFuncEndLabel;
+   sprintf(name, "__endOfFunc_%s_", (char *) fun->header.a_name);
+   A->curFuncEndLabel = _slang_label_new(name);
+   assert(A->curFuncEndLabel);
 
    if (slang_is_asm_function(fun) && !dest) {
       /* assemble assembly function - tree style */
@@ -1088,9 +1087,9 @@ _slang_gen_function_call(slang_assemble_ctx *A, slang_function *fun,
 
    n = _slang_gen_operation(A, oper);
 
-   A->CurFunction->end_label = NULL; /* XXX delete/free? */
-
-   A->CurFunction = prevFunc;
+   /*_slang_label_delete(A->curFuncEndLabel);*/
+   A->curFuncEndLabel = prevFuncEndLabel;
+   assert(A->curFuncEndLabel);
 
    return n;
 }
@@ -1712,7 +1711,8 @@ _slang_gen_return(slang_assemble_ctx * A, slang_operation *oper)
       slang_operation gotoOp;
       slang_operation_construct(&gotoOp);
       gotoOp.type = SLANG_OPER_GOTO;
-      gotoOp.label = A->CurFunction->end_label;
+      gotoOp.label = A->curFuncEndLabel;
+      assert(gotoOp.label);
 
       /* assemble the new code */
       n = _slang_gen_operation(A, &gotoOp);
@@ -1767,9 +1767,10 @@ _slang_gen_return(slang_assemble_ctx * A, slang_operation *oper)
       /* child[1]: goto __endOfFunction */
       jump = &block->children[1];
       jump->type = SLANG_OPER_GOTO;
-      assert(A->CurFunction->end_label);
+      assert(A->curFuncEndLabel);
       /* XXX don't call function? */
-      jump->label = A->CurFunction->end_label;
+      jump->label = A->curFuncEndLabel;
+      assert(jump->label);
 
 #if 0 /* debug */
       printf("NEW RETURN:\n");
@@ -2679,11 +2680,8 @@ _slang_codegen_function(slang_assemble_ctx * A, slang_function * fun)
    /* fold constant expressions, etc. */
    _slang_simplify(fun->body, &A->space, A->atoms);
 
-   A->CurFunction = fun;
-
    /* Create an end-of-function label */
-   if (!A->CurFunction->end_label)
-      A->CurFunction->end_label = _slang_label_new("__endOfFunc__main");
+   A->curFuncEndLabel = _slang_label_new("__endOfFunc__main");
 
    /* push new vartable scope */
    _slang_push_var_table(A->vartable);
@@ -2702,9 +2700,10 @@ _slang_codegen_function(slang_assemble_ctx * A, slang_function * fun)
    }
 
    /* append an end-of-function-label to IR tree */
-   n = new_seq(n, new_label(fun->end_label));
+   n = new_seq(n, new_label(A->curFuncEndLabel));
 
-   A->CurFunction = NULL;
+   /*_slang_label_delete(A->curFuncEndLabel);*/
+   A->curFuncEndLabel = NULL;
 
 #if 0
    printf("************* New AST for %s *****\n", (char*)fun->header.a_name);
index 9532e070f785609d7cc85d7d051ebc8fbdc60d03..55338d6459621c29669e0ccc1f852b65c5181ce1 100644 (file)
@@ -899,6 +899,8 @@ static struct prog_instruction *
 emit_jump(slang_emit_info *emitInfo, slang_ir_node *n)
 {
    struct prog_instruction *inst;
+   assert(n);
+   assert(n->Label);
    inst = new_instruction(emitInfo, OPCODE_BRA);
    inst->DstReg.CondMask = COND_TR;  /* always branch */
    inst->BranchTarget = _slang_label_get_location(n->Label);
@@ -1557,6 +1559,8 @@ emit(slang_emit_info *emitInfo, slang_ir_node *n)
    case IR_LABEL:
       return emit_label(emitInfo, n);
    case IR_JUMP:
+      assert(n);
+      assert(n->Label);
       return emit_jump(emitInfo, n);
    case IR_CJUMP0:
       return emit_cjump(emitInfo, n, 0);
index 62cf0009d3cc99ccd6a9fdef948296e6630eddbc..bde2e67ae237bc30f3fe659eaaf68f63e32f496e 100644 (file)
@@ -62,7 +62,7 @@ typedef struct slang_assemble_ctx_
    struct gl_program *program;
    slang_var_table *vartable;
    slang_info_log *log;
-   struct slang_function_ *CurFunction;
+   struct slang_label_ *curFuncEndLabel;
    struct slang_ir_node_ *CurLoop;
 } slang_assemble_ctx;