clib: rename trace_t to stack_frame_t
[nit.git] / src / compiling / compiling_icode.nit
index e7c063a..e0a987b 100644 (file)
@@ -259,20 +259,25 @@ redef class IRoutine
        # Compile the body of the routine, return the result value is any
        fun compile_inside_to_c(v: I2CCompilerVisitor, args: Array[String]): nullable String
        do
-               # Add the trace
+               # Create and push the stack frame
                var ll = 0
                if location != null then
                        ll = location.line_start
                end
-               v.add_decl("struct trace_t trace = \{NULL, NULL, {ll}, LOCATE_{v.basecname}\};")
-               v.add_instr("trace.prev = tracehead; tracehead = &trace;")
-               v.add_instr("trace.file = LOCATE_{v.visitor.module.name};")
+               v.add_decl("struct stack_frame_t frame = \{NULL, NULL, {ll}, LOCATE_{v.basecname}, {std_slots_nb}\};")
+               v.add_instr("frame.prev = stack_frame_head; stack_frame_head = &frame;")
+               v.add_instr("frame.file = LOCATE_{v.visitor.module.name};")
+               v.add_instr("frame.REG_pointer = (val_t **)®")
 
                # Add local variables
                if std_slots_nb == 0 then
                        v.add_decl("val_t *REG = NULL;")
                else
-                       v.add_decl("val_t REG[{std_slots_nb}];")
+                       var init_vals = new Buffer
+                       init_vals.append "val_t REG[{std_slots_nb}] = \{ NIT_NULL"
+                       for i in [1..std_slots_nb[ do init_vals.append(", NIT_NULL")
+                       init_vals.append " \};"
+                       v.add_decl(init_vals.to_s)
                end
                for i in [0..tag_slots_nb[ do
                        v.add_decl("val_t REGB{i};")
@@ -314,7 +319,7 @@ redef class IRoutine
                # Compile body
                body.compile_to_c(v)
 
-               v.add_instr("tracehead = trace.prev;")
+               v.add_instr("stack_frame_head = frame.prev;")
                v.return_label = old_rl
                var r = result
                if r != null then
@@ -696,6 +701,7 @@ redef class IOnce
                body.compile_to_c(v)
                var e = v.register(result.as(not null))
                v.add_instr("once_value_{i} = {e};")
+               v.add_instr("register_static_object(&once_value_{i});")
                if res.stype.is_nullable then v.add_instr("once_bool_{i} = true;")
                v.unindent
                v.add_instr("} else {e} = once_value_{i};")