When using qjs -D1 argument to dump opcodes with a simple JS, dump_byte_code() does not print the correct locals indices :
{ let s = 'def'; let a = 1; let b = 2; let c = 3; }
output
locals:
0: var <ret>
1: let s [level:2 next:-1]
2: let a [level:2 next:1]
3: let b [level:2 next:2]
4: let c [level:2 next:3]
opcodes:
set_loc_uninitialized 4 ; c
set_loc_uninitialized 3 ; b
set_loc_uninitialized 2 ; a
set_loc_uninitialized 1 ; s
push_atom_value def
put_loc1 2 ; a - should be putting atom value "def" in local index = 1 's'
push_1 1
put_loc2 3 ; b - should be putting stack value int 1 in local index = 2 'a'
push_2 2
put_loc3 0 ; "<ret>" - should be putting stack value int 2 in local index = 3 'b'
push_3 3
put_loc8 4 ; c - this one is correct as its computed within case OP_FMT_loc8:
get_loc0 1 ; s - should be getting return value at local index = 0
return
instead of
push_atom_value def
put_loc1 1 ; s
push_1 1
put_loc2 2 ; a
push_2 2
put_loc3 3 ; b
push_3 3
put_loc8 4 ; c
get_loc0 0 ; "<ret>"
return
the issue seem to be in :
case OP_FMT_none_loc:
idx = (op - OP_get_loc0_loc1) % 4;
that substract OP_get_loc0_loc1 where the logical value might be get_loc0 (OP_get_loc0_loc1+1)
When using qjs -D1 argument to dump opcodes with a simple JS, dump_byte_code() does not print the correct locals indices :
{ let s = 'def'; let a = 1; let b = 2; let c = 3; }output
locals:0: var <ret>1: let s [level:2 next:-1]2: let a [level:2 next:1]3: let b [level:2 next:2]4: let c [level:2 next:3]opcodes:set_loc_uninitialized 4 ; cset_loc_uninitialized 3 ; bset_loc_uninitialized 2 ; aset_loc_uninitialized 1 ; spush_atom_value defput_loc1 2 ; a- should be putting atom value "def" in local index = 1 's'push_1 1put_loc2 3 ; b- should be putting stack value int 1 in local index = 2 'a'push_2 2put_loc3 0 ; "<ret>"- should be putting stack value int 2 in local index = 3 'b'push_3 3put_loc8 4 ; c- this one is correct as its computed withincase OP_FMT_loc8:get_loc0 1 ; s- should be getting return value at local index = 0returninstead of
push_atom_value defput_loc1 1 ; spush_1 1put_loc2 2 ; apush_2 2put_loc3 3 ; bpush_3 3put_loc8 4 ; cget_loc0 0 ; "<ret>"returnthe issue seem to be in :
case OP_FMT_none_loc:idx = (op - OP_get_loc0_loc1) % 4;that substract
OP_get_loc0_loc1where the logical value might beget_loc0(OP_get_loc0_loc1+1)