# 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};")
else
v.add_decl("struct WBT_ **CREG = NULL;")
end
- var i = 0
+ var k = 0
for r in params do
- if r.slot_index != null then v.add_assignment(v.register(r), args[i])
- i += 1
+ if r.slot_index != null then v.add_assignment(v.register(r), args[k])
+ k += 1
end
- var iclosdecls = closure_decls
if iclosdecls != null then
for i in [0..iclosdecls.length[ do
var iclosdecl = iclosdecls[i]
# 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
# cv must be in the correct function
fun compile_to_c(cv: CompilerVisitor, cname: String, args: Array[String]): nullable String
do
- optimize
+ optimize(cv.module)
var v = new I2CCompilerVisitor(cv, self, cname)
return compile_inside_to_c(v, args)
end
v.add_instr(s.to_s)
var ll = location
- var pl = property_location
- s = new Buffer.from("fprintf(stderr, \"")
- if pl != null then s.append(" in %s")
- s.append(" (%s")
+ s = new Buffer.from("fprintf(stderr, \" (%s")
if ll != null then
s.append(":%d")
end
- s.append(")\\n\", ")
- if pl != null then s.append("LOCATE_{pl.cname}, ")
- s.append("LOCATE_{module_location.name}")
+ s.append(")\\n\", LOCATE_{module_location.name}")
if ll != null then
s.append(", {ll.line_start}")
end
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};")