This commit is contained in:
Valk Richard Li 2021-01-23 17:57:05 +08:00
parent 8069a1b659
commit bb746dfbfb
3 changed files with 31 additions and 75 deletions

View File

@ -251,7 +251,7 @@ void nasal_bytecode_vm::opr_entry()
} }
void nasal_bytecode_vm::opr_unot() void nasal_bytecode_vm::opr_unot()
{ {
nasal_scalar* val_addr=*value_stack_top--; nasal_scalar* val_addr=*value_stack_top;
int type=val_addr->get_type(); int type=val_addr->get_type();
nasal_scalar* new_value_address=NULL; nasal_scalar* new_value_address=NULL;
if(type==vm_nil) if(type==vm_nil)
@ -280,26 +280,26 @@ void nasal_bytecode_vm::opr_unot()
} }
else else
die("unot: incorrect value type"); die("unot: incorrect value type");
*(++value_stack_top)=new_value_address; *value_stack_top=new_value_address;
vm.del_reference(val_addr); vm.del_reference(val_addr);
return; return;
} }
void nasal_bytecode_vm::opr_usub() void nasal_bytecode_vm::opr_usub()
{ {
nasal_scalar* val_addr=*value_stack_top--; nasal_scalar* val_addr=*value_stack_top;
nasal_scalar* new_value_address=vm.gc_alloc(vm_number); nasal_scalar* new_value_address=vm.gc_alloc(vm_number);
new_value_address->set_number(-val_addr->to_number()); new_value_address->set_number(-val_addr->to_number());
*(++value_stack_top)=new_value_address; *value_stack_top=new_value_address;
vm.del_reference(val_addr); vm.del_reference(val_addr);
return; return;
} }
void nasal_bytecode_vm::opr_add() void nasal_bytecode_vm::opr_add()
{ {
nasal_scalar* val_addr2=*value_stack_top--; nasal_scalar* val_addr2=*value_stack_top--;
nasal_scalar* val_addr1=*value_stack_top--; nasal_scalar* val_addr1=*value_stack_top;
nasal_scalar* new_value_address=vm.gc_alloc(vm_number); nasal_scalar* new_value_address=vm.gc_alloc(vm_number);
new_value_address->set_number(val_addr1->to_number()+val_addr2->to_number()); new_value_address->set_number(val_addr1->to_number()+val_addr2->to_number());
*(++value_stack_top)=new_value_address; *value_stack_top=new_value_address;
vm.del_reference(val_addr1); vm.del_reference(val_addr1);
vm.del_reference(val_addr2); vm.del_reference(val_addr2);
return; return;
@ -307,10 +307,10 @@ void nasal_bytecode_vm::opr_add()
void nasal_bytecode_vm::opr_sub() void nasal_bytecode_vm::opr_sub()
{ {
nasal_scalar* val_addr2=*value_stack_top--; nasal_scalar* val_addr2=*value_stack_top--;
nasal_scalar* val_addr1=*value_stack_top--; nasal_scalar* val_addr1=*value_stack_top;
nasal_scalar* new_value_address=vm.gc_alloc(vm_number); nasal_scalar* new_value_address=vm.gc_alloc(vm_number);
new_value_address->set_number(val_addr1->to_number()-val_addr2->to_number()); new_value_address->set_number(val_addr1->to_number()-val_addr2->to_number());
*(++value_stack_top)=new_value_address; *value_stack_top=new_value_address;
vm.del_reference(val_addr1); vm.del_reference(val_addr1);
vm.del_reference(val_addr2); vm.del_reference(val_addr2);
return; return;
@ -318,10 +318,10 @@ void nasal_bytecode_vm::opr_sub()
void nasal_bytecode_vm::opr_mul() void nasal_bytecode_vm::opr_mul()
{ {
nasal_scalar* val_addr2=*value_stack_top--; nasal_scalar* val_addr2=*value_stack_top--;
nasal_scalar* val_addr1=*value_stack_top--; nasal_scalar* val_addr1=*value_stack_top;
nasal_scalar* new_value_address=vm.gc_alloc(vm_number); nasal_scalar* new_value_address=vm.gc_alloc(vm_number);
new_value_address->set_number(val_addr1->to_number()*val_addr2->to_number()); new_value_address->set_number(val_addr1->to_number()*val_addr2->to_number());
*(++value_stack_top)=new_value_address; *value_stack_top=new_value_address;
vm.del_reference(val_addr1); vm.del_reference(val_addr1);
vm.del_reference(val_addr2); vm.del_reference(val_addr2);
return; return;
@ -329,10 +329,10 @@ void nasal_bytecode_vm::opr_mul()
void nasal_bytecode_vm::opr_div() void nasal_bytecode_vm::opr_div()
{ {
nasal_scalar* val_addr2=*value_stack_top--; nasal_scalar* val_addr2=*value_stack_top--;
nasal_scalar* val_addr1=*value_stack_top--; nasal_scalar* val_addr1=*value_stack_top;
nasal_scalar* new_value_address=vm.gc_alloc(vm_number); nasal_scalar* new_value_address=vm.gc_alloc(vm_number);
new_value_address->set_number(val_addr1->to_number()/val_addr2->to_number()); new_value_address->set_number(val_addr1->to_number()/val_addr2->to_number());
*(++value_stack_top)=new_value_address; *value_stack_top=new_value_address;
vm.del_reference(val_addr1); vm.del_reference(val_addr1);
vm.del_reference(val_addr2); vm.del_reference(val_addr2);
return; return;
@ -340,10 +340,10 @@ void nasal_bytecode_vm::opr_div()
void nasal_bytecode_vm::opr_lnk() void nasal_bytecode_vm::opr_lnk()
{ {
nasal_scalar* val_addr2=*value_stack_top--; nasal_scalar* val_addr2=*value_stack_top--;
nasal_scalar* val_addr1=*value_stack_top--; nasal_scalar* val_addr1=*value_stack_top;
nasal_scalar* new_value_address=vm.gc_alloc(vm_string); nasal_scalar* new_value_address=vm.gc_alloc(vm_string);
new_value_address->set_string(val_addr1->to_string()+val_addr2->to_string()); new_value_address->set_string(val_addr1->to_string()+val_addr2->to_string());
*(++value_stack_top)=new_value_address; *value_stack_top=new_value_address;
vm.del_reference(val_addr1); vm.del_reference(val_addr1);
vm.del_reference(val_addr2); vm.del_reference(val_addr2);
return; return;
@ -352,12 +352,12 @@ void nasal_bytecode_vm::opr_addeq()
{ {
nasal_scalar** mem_addr=pointer_stack.top(); nasal_scalar** mem_addr=pointer_stack.top();
pointer_stack.pop(); pointer_stack.pop();
nasal_scalar* val_addr2=*value_stack_top--; nasal_scalar* val_addr2=*value_stack_top;
nasal_scalar* val_addr1=*mem_addr; nasal_scalar* val_addr1=*mem_addr;
nasal_scalar* new_value_address=vm.gc_alloc(vm_number); nasal_scalar* new_value_address=vm.gc_alloc(vm_number);
new_value_address->set_number(val_addr1->to_number()+val_addr2->to_number()); new_value_address->set_number(val_addr1->to_number()+val_addr2->to_number());
vm.add_reference(new_value_address); vm.add_reference(new_value_address);
*(++value_stack_top)=new_value_address; *value_stack_top=new_value_address;
vm.del_reference(*mem_addr); vm.del_reference(*mem_addr);
*mem_addr=new_value_address; *mem_addr=new_value_address;
vm.del_reference(val_addr2); vm.del_reference(val_addr2);
@ -367,12 +367,12 @@ void nasal_bytecode_vm::opr_subeq()
{ {
nasal_scalar** mem_addr=pointer_stack.top(); nasal_scalar** mem_addr=pointer_stack.top();
pointer_stack.pop(); pointer_stack.pop();
nasal_scalar* val_addr2=*value_stack_top--; nasal_scalar* val_addr2=*value_stack_top;
nasal_scalar* val_addr1=*mem_addr; nasal_scalar* val_addr1=*mem_addr;
nasal_scalar* new_value_address=vm.gc_alloc(vm_number); nasal_scalar* new_value_address=vm.gc_alloc(vm_number);
new_value_address->set_number(val_addr1->to_number()-val_addr2->to_number()); new_value_address->set_number(val_addr1->to_number()-val_addr2->to_number());
vm.add_reference(new_value_address); vm.add_reference(new_value_address);
*(++value_stack_top)=new_value_address; *value_stack_top=new_value_address;
vm.del_reference(*mem_addr); vm.del_reference(*mem_addr);
*mem_addr=new_value_address; *mem_addr=new_value_address;
vm.del_reference(val_addr2); vm.del_reference(val_addr2);
@ -382,12 +382,12 @@ void nasal_bytecode_vm::opr_muleq()
{ {
nasal_scalar** mem_addr=pointer_stack.top(); nasal_scalar** mem_addr=pointer_stack.top();
pointer_stack.pop(); pointer_stack.pop();
nasal_scalar* val_addr2=*value_stack_top--; nasal_scalar* val_addr2=*value_stack_top;
nasal_scalar* val_addr1=*mem_addr; nasal_scalar* val_addr1=*mem_addr;
nasal_scalar* new_value_address=vm.gc_alloc(vm_number); nasal_scalar* new_value_address=vm.gc_alloc(vm_number);
new_value_address->set_number(val_addr1->to_number()*val_addr2->to_number()); new_value_address->set_number(val_addr1->to_number()*val_addr2->to_number());
vm.add_reference(new_value_address); vm.add_reference(new_value_address);
*(++value_stack_top)=new_value_address; *value_stack_top=new_value_address;
vm.del_reference(*mem_addr); vm.del_reference(*mem_addr);
*mem_addr=new_value_address; *mem_addr=new_value_address;
vm.del_reference(val_addr2); vm.del_reference(val_addr2);
@ -397,12 +397,12 @@ void nasal_bytecode_vm::opr_diveq()
{ {
nasal_scalar** mem_addr=pointer_stack.top(); nasal_scalar** mem_addr=pointer_stack.top();
pointer_stack.pop(); pointer_stack.pop();
nasal_scalar* val_addr2=*value_stack_top--; nasal_scalar* val_addr2=*value_stack_top;
nasal_scalar* val_addr1=*mem_addr; nasal_scalar* val_addr1=*mem_addr;
nasal_scalar* new_value_address=vm.gc_alloc(vm_number); nasal_scalar* new_value_address=vm.gc_alloc(vm_number);
new_value_address->set_number(val_addr1->to_number()/val_addr2->to_number()); new_value_address->set_number(val_addr1->to_number()/val_addr2->to_number());
vm.add_reference(new_value_address); vm.add_reference(new_value_address);
*(++value_stack_top)=new_value_address; *value_stack_top=new_value_address;
vm.del_reference(*mem_addr); vm.del_reference(*mem_addr);
*mem_addr=new_value_address; *mem_addr=new_value_address;
vm.del_reference(val_addr2); vm.del_reference(val_addr2);
@ -412,12 +412,12 @@ void nasal_bytecode_vm::opr_lnkeq()
{ {
nasal_scalar** mem_addr=pointer_stack.top(); nasal_scalar** mem_addr=pointer_stack.top();
pointer_stack.pop(); pointer_stack.pop();
nasal_scalar* val_addr2=*value_stack_top--; nasal_scalar* val_addr2=*value_stack_top;
nasal_scalar* val_addr1=*mem_addr; nasal_scalar* val_addr1=*mem_addr;
nasal_scalar* new_value_address=vm.gc_alloc(vm_string); nasal_scalar* new_value_address=vm.gc_alloc(vm_string);
new_value_address->set_string(val_addr1->to_string()+val_addr2->to_string()); new_value_address->set_string(val_addr1->to_string()+val_addr2->to_string());
vm.add_reference(new_value_address); vm.add_reference(new_value_address);
*(++value_stack_top)=new_value_address; *value_stack_top=new_value_address;
vm.del_reference(*mem_addr); vm.del_reference(*mem_addr);
*mem_addr=new_value_address; *mem_addr=new_value_address;
vm.del_reference(val_addr2); vm.del_reference(val_addr2);

View File

@ -616,7 +616,7 @@ double nasal_scalar::to_number()
{ {
switch(type) switch(type)
{ {
case vm_nil:return 0; case vm_nil: return 0;
case vm_number: return ptr.num; case vm_number: return ptr.num;
case vm_string: return trans_string_to_number(*ptr.str); case vm_string: return trans_string_to_number(*ptr.str);
default: return std::nan(""); default: return std::nan("");
@ -720,16 +720,12 @@ nasal_scalar* nasal_virtual_machine::gc_alloc(int val_type)
} }
void nasal_virtual_machine::add_reference(nasal_scalar* value_address) void nasal_virtual_machine::add_reference(nasal_scalar* value_address)
{ {
if(value_address)
++value_address->ref_cnt; ++value_address->ref_cnt;
return; return;
} }
void nasal_virtual_machine::del_reference(nasal_scalar* value_address) void nasal_virtual_machine::del_reference(nasal_scalar* value_address)
{ {
if(value_address)
--value_address->ref_cnt; --value_address->ref_cnt;
else
return;
if(!value_address->ref_cnt) if(!value_address->ref_cnt)
{ {
value_address->clear(); value_address->clear();

View File

@ -133,12 +133,6 @@ void nasal_parse::main_process()
if(ptr<tok_list_size) if(ptr<tok_list_size)
die(error_line,"expected \";\""); die(error_line,"expected \";\"");
} }
if(root.get_children().size())
{
int type=root.get_children().back().get_type();
if(type==ast_continue || type==ast_break || type==ast_return)
die(root.get_children().back().get_line(),ast_str(type)+" is not allowed in main scope");
}
} }
return; return;
} }
@ -518,8 +512,7 @@ nasal_ast nasal_parse::exprs_gen()
nasal_ast node(tok_list[ptr].line,ast_block); nasal_ast node(tok_list[ptr].line,ast_block);
if(tok_list[ptr].type==tok_left_brace) if(tok_list[ptr].type==tok_left_brace)
{ {
int left_brace_line=tok_list[ptr].line; int left_brace_line=tok_list[ptr++].line;
++ptr;
while(ptr<tok_list_size && tok_list[ptr].type!=tok_right_brace) while(ptr<tok_list_size && tok_list[ptr].type!=tok_right_brace)
{ {
node.add_child(expr()); node.add_child(expr());
@ -540,7 +533,7 @@ nasal_ast nasal_parse::exprs_gen()
if(ptr>=tok_list_size || tok_list[ptr].type!=tok_right_brace) if(ptr>=tok_list_size || tok_list[ptr].type!=tok_right_brace)
{ {
std::string lb_line=""; std::string lb_line="";
while(left_brace_line>1) while(left_brace_line)
{ {
lb_line=(char)('0'+(left_brace_line%10))+lb_line; lb_line=(char)('0'+(left_brace_line%10))+lb_line;
left_brace_line/=10; left_brace_line/=10;
@ -551,9 +544,7 @@ nasal_ast nasal_parse::exprs_gen()
else else
{ {
node.add_child(expr()); node.add_child(expr());
++ptr; if(++ptr<tok_list_size && tok_list[ptr].type!=tok_semi) --ptr;
if(ptr>=tok_list_size || tok_list[ptr].type!=tok_semi)
--ptr;
} }
return node; return node;
} }
@ -667,37 +658,6 @@ nasal_ast nasal_parse::additive_expr()
tmp.add_child(multive_expr()); tmp.add_child(multive_expr());
else else
die(error_line,"expected calculation"); die(error_line,"expected calculation");
// pre-calculation
if(tmp.get_type()!=ast_link)
{
int type1=tmp.get_children()[0].get_type();
int type2=tmp.get_children()[1].get_type();
double num1,num2,num;
if(type1==ast_number && type2==ast_number)
{
num1=tmp.get_children()[0].get_num();
num2=tmp.get_children()[1].get_num();
num=(tmp.get_type()==ast_add? num1+num2:num1-num2);
tmp.set_type(ast_number);
tmp.set_num(num);
tmp.get_children().clear();
}
}
else
{
int type1=tmp.get_children()[0].get_type();
int type2=tmp.get_children()[1].get_type();
std::string s1,s2;
if(type1==ast_string && type2==ast_string)
{
s1=tmp.get_children()[0].get_str();
s2=tmp.get_children()[1].get_str();
s1+=s2;
tmp.set_type(ast_string);
tmp.set_str(s1);
tmp.get_children().clear();
}
}
node=tmp; node=tmp;
} }
--ptr; --ptr;