From 7087c67d7951f77d11d2c0d6125a0e3c06182857 Mon Sep 17 00:00:00 2001 From: Valk Richard Li <48872266+ValKmjolnir@users.noreply.github.com> Date: Mon, 8 Mar 2021 19:45:33 +0800 Subject: [PATCH] add constant table in vm --- main.cpp | 2 +- nasal_codegen.h | 9 ++++++--- nasal_vm.h | 38 +++++++++++++++++--------------------- test/bp.nas | 2 +- 4 files changed, 25 insertions(+), 26 deletions(-) diff --git a/main.cpp b/main.cpp index fea031b..36ad70a 100644 --- a/main.cpp +++ b/main.cpp @@ -153,7 +153,7 @@ int main() system("cls"); #endif logo(); - std::cout<<">> Nasal interpreter ver 5.0 .\n"; + std::cout<<">> Nasal interpreter ver 6.0 .\n"; std::cout<<">> Code: https://github.com/ValKmjolnir/Nasal-Interpreter\n"; std::cout<<">> Info: http://wiki.flightgear.org/Nasal_scripting_language\n"; std::cout<<">> Input \"help\" to get help .\n"; diff --git a/nasal_codegen.h b/nasal_codegen.h index de7c33f..16fe22c 100644 --- a/nasal_codegen.h +++ b/nasal_codegen.h @@ -103,7 +103,7 @@ struct {op_mcallv, "mcallv"}, {op_mcallh, "mcallh"}, {op_return, "ret "}, - {-1, NULL}, + {-1, NULL }, }; struct opcode @@ -231,10 +231,13 @@ void nasal_codegen::nil_gen() void nasal_codegen::number_gen(nasal_ast& ast) { double num=ast.get_num(); - regist_number(num); if(num==1) gen(op_pushone,0); else if(num==0) gen(op_pushzero,0); - else gen(op_pushnum,number_table[num]); + else + { + regist_number(num); + gen(op_pushnum,number_table[num]); + } return; } diff --git a/nasal_vm.h b/nasal_vm.h index a2abfbc..8e7b985 100644 --- a/nasal_vm.h +++ b/nasal_vm.h @@ -8,6 +8,7 @@ private: nasal_val* zero_addr; // reserved address of nasal_val,type vm_num, 0 nasal_val* one_addr; // reserved address of nasal_val,type vm_num, 1 nasal_val* nil_addr; // reserved address of nasal_val,type vm_nil + std::vector num_addrs; // reserved address for const vm_num bool main_loop_break_mark; // when mark is false,break the main loop int ptr; // program counter int me_index; // this is the index of "me" in string_table @@ -163,27 +164,27 @@ void nasal_vm::opr_load() } void nasal_vm::opr_pushnum() { - nasal_val* val_addr=gc.gc_alloc(vm_num); - val_addr->set_number(number_table[exec_code[ptr].index]); + nasal_val* val_addr=num_addrs[exec_code[ptr].index]; + ++val_addr->ref_cnt; *(++val_stack_top)=val_addr; return; } void nasal_vm::opr_pushone() { *(++val_stack_top)=one_addr; - gc.add_reference(one_addr); + ++one_addr->ref_cnt; return; } void nasal_vm::opr_pushzero() { *(++val_stack_top)=zero_addr; - gc.add_reference(zero_addr); + ++zero_addr->ref_cnt; return; } void nasal_vm::opr_pushnil() { *(++val_stack_top)=nil_addr; - gc.add_reference(nil_addr); + ++nil_addr->ref_cnt; return; } void nasal_vm::opr_pushstr() @@ -246,31 +247,20 @@ void nasal_vm::opr_unot() nasal_val* new_val_addr=NULL; int type=val_addr->get_type(); if(type==vm_nil) - { - new_val_addr=gc.gc_alloc(vm_num); - new_val_addr->set_number(1); - } + new_val_addr=one_addr; else if(type==vm_num) - { - new_val_addr=gc.gc_alloc(vm_num); - new_val_addr->set_number(val_addr->get_number()==0); - } + new_val_addr=val_addr->get_number()?zero_addr:one_addr; else if(type==vm_str) { double number=trans_string_to_number(val_addr->get_string()); if(std::isnan(number)) - { - new_val_addr=gc.gc_alloc(vm_num); - new_val_addr->set_number(!val_addr->get_string().length()); - } + new_val_addr=val_addr->get_string().length()?zero_addr:one_addr; else - { - new_val_addr=gc.gc_alloc(vm_num); - new_val_addr->set_number(number==0); - } + new_val_addr=number?zero_addr:one_addr; } else die("unot: incorrect value type"); + ++new_val_addr->ref_cnt; *val_stack_top=new_val_addr; gc.del_reference(val_addr); return; @@ -1094,6 +1084,12 @@ void nasal_vm::run(std::vector& strs,std::vector& nums,std: one_addr=gc.gc_alloc(vm_num); one_addr->set_number(1); nil_addr=gc.gc_alloc(vm_nil); + num_addrs.clear(); + for(int i=0;iset_number(number_table[i]); + } builtin_use_string_table.clear(); for(int i=0;i0.0005) +while(error>0.001) { error=0; for(var i=0;i<4;i+=1)