update
This commit is contained in:
parent
8069a1b659
commit
bb746dfbfb
|
@ -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);
|
||||||
|
|
12
nasal_gc.h
12
nasal_gc.h
|
@ -616,10 +616,10 @@ 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("");
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue