backward inference
This commit is contained in:
15
mcode.cm
15
mcode.cm
@@ -52,6 +52,7 @@ var mcode = function(ast) {
|
||||
var s_cur_line = 0
|
||||
var s_cur_col = 0
|
||||
var s_filename = null
|
||||
var s_has_disruption = false
|
||||
|
||||
// Shared closure vars for binop helpers (avoids >4 param functions)
|
||||
var _bp_dest = 0
|
||||
@@ -78,7 +79,8 @@ var mcode = function(ast) {
|
||||
function_nr: s_function_nr,
|
||||
intrinsic_cache: s_intrinsic_cache,
|
||||
cur_line: s_cur_line,
|
||||
cur_col: s_cur_col
|
||||
cur_col: s_cur_col,
|
||||
has_disruption: s_has_disruption
|
||||
}
|
||||
}
|
||||
|
||||
@@ -99,6 +101,7 @@ var mcode = function(ast) {
|
||||
s_intrinsic_cache = saved.intrinsic_cache
|
||||
s_cur_line = saved.cur_line
|
||||
s_cur_col = saved.cur_col
|
||||
s_has_disruption = saved.has_disruption
|
||||
}
|
||||
|
||||
// Slot allocation
|
||||
@@ -2230,6 +2233,7 @@ var mcode = function(ast) {
|
||||
var guard_t = 0
|
||||
var guard_err = null
|
||||
var guard_done = null
|
||||
var last_instr = null
|
||||
|
||||
if (stmt == null) {
|
||||
return null
|
||||
@@ -2436,6 +2440,13 @@ var mcode = function(ast) {
|
||||
expr = stmt.expression
|
||||
if (expr != null) {
|
||||
slot = gen_expr(expr, -1)
|
||||
// Mark tail calls: rename last invoke to tail_invoke
|
||||
if (stmt.tail == true && !s_has_disruption) {
|
||||
last_instr = s_instructions[length(s_instructions) - 1]
|
||||
if (is_array(last_instr) && last_instr[0] == "invoke") {
|
||||
last_instr[0] = "tail_invoke"
|
||||
}
|
||||
}
|
||||
emit_1("return", slot)
|
||||
} else {
|
||||
null_slot = alloc_slot()
|
||||
@@ -2618,6 +2629,7 @@ var mcode = function(ast) {
|
||||
s_label_map = {}
|
||||
|
||||
s_is_arrow = is_arrow
|
||||
s_has_disruption = disrupt_clause != null && is_array(disrupt_clause)
|
||||
|
||||
s_function_nr = fn_nr_node != null ? fn_nr_node : 0
|
||||
|
||||
@@ -2726,6 +2738,7 @@ var mcode = function(ast) {
|
||||
|
||||
// Compile disruption clause
|
||||
if (disrupt_clause != null && is_array(disrupt_clause)) {
|
||||
emit_label(gen_label("disruption"))
|
||||
disruption_start = length(s_instructions)
|
||||
_i = 0
|
||||
while (_i < length(disrupt_clause)) {
|
||||
|
||||
Reference in New Issue
Block a user