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()
|
||||
{
|
||||
nasal_scalar* val_addr=*value_stack_top--;
|
||||
nasal_scalar* val_addr=*value_stack_top;
|
||||
int type=val_addr->get_type();
|
||||
nasal_scalar* new_value_address=NULL;
|
||||
if(type==vm_nil)
|
||||
|
@ -280,26 +280,26 @@ void nasal_bytecode_vm::opr_unot()
|
|||
}
|
||||
else
|
||||
die("unot: incorrect value type");
|
||||
*(++value_stack_top)=new_value_address;
|
||||
*value_stack_top=new_value_address;
|
||||
vm.del_reference(val_addr);
|
||||
return;
|
||||
}
|
||||
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);
|
||||
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);
|
||||
return;
|
||||
}
|
||||
void nasal_bytecode_vm::opr_add()
|
||||
{
|
||||
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);
|
||||
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_addr2);
|
||||
return;
|
||||
|
@ -307,10 +307,10 @@ void nasal_bytecode_vm::opr_add()
|
|||
void nasal_bytecode_vm::opr_sub()
|
||||
{
|
||||
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);
|
||||
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_addr2);
|
||||
return;
|
||||
|
@ -318,10 +318,10 @@ void nasal_bytecode_vm::opr_sub()
|
|||
void nasal_bytecode_vm::opr_mul()
|
||||
{
|
||||
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);
|
||||
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_addr2);
|
||||
return;
|
||||
|
@ -329,10 +329,10 @@ void nasal_bytecode_vm::opr_mul()
|
|||
void nasal_bytecode_vm::opr_div()
|
||||
{
|
||||
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);
|
||||
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_addr2);
|
||||
return;
|
||||
|
@ -340,10 +340,10 @@ void nasal_bytecode_vm::opr_div()
|
|||
void nasal_bytecode_vm::opr_lnk()
|
||||
{
|
||||
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);
|
||||
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_addr2);
|
||||
return;
|
||||
|
@ -352,12 +352,12 @@ void nasal_bytecode_vm::opr_addeq()
|
|||
{
|
||||
nasal_scalar** mem_addr=pointer_stack.top();
|
||||
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* new_value_address=vm.gc_alloc(vm_number);
|
||||
new_value_address->set_number(val_addr1->to_number()+val_addr2->to_number());
|
||||
vm.add_reference(new_value_address);
|
||||
*(++value_stack_top)=new_value_address;
|
||||
*value_stack_top=new_value_address;
|
||||
vm.del_reference(*mem_addr);
|
||||
*mem_addr=new_value_address;
|
||||
vm.del_reference(val_addr2);
|
||||
|
@ -367,12 +367,12 @@ void nasal_bytecode_vm::opr_subeq()
|
|||
{
|
||||
nasal_scalar** mem_addr=pointer_stack.top();
|
||||
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* new_value_address=vm.gc_alloc(vm_number);
|
||||
new_value_address->set_number(val_addr1->to_number()-val_addr2->to_number());
|
||||
vm.add_reference(new_value_address);
|
||||
*(++value_stack_top)=new_value_address;
|
||||
*value_stack_top=new_value_address;
|
||||
vm.del_reference(*mem_addr);
|
||||
*mem_addr=new_value_address;
|
||||
vm.del_reference(val_addr2);
|
||||
|
@ -382,12 +382,12 @@ void nasal_bytecode_vm::opr_muleq()
|
|||
{
|
||||
nasal_scalar** mem_addr=pointer_stack.top();
|
||||
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* new_value_address=vm.gc_alloc(vm_number);
|
||||
new_value_address->set_number(val_addr1->to_number()*val_addr2->to_number());
|
||||
vm.add_reference(new_value_address);
|
||||
*(++value_stack_top)=new_value_address;
|
||||
*value_stack_top=new_value_address;
|
||||
vm.del_reference(*mem_addr);
|
||||
*mem_addr=new_value_address;
|
||||
vm.del_reference(val_addr2);
|
||||
|
@ -397,12 +397,12 @@ void nasal_bytecode_vm::opr_diveq()
|
|||
{
|
||||
nasal_scalar** mem_addr=pointer_stack.top();
|
||||
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* new_value_address=vm.gc_alloc(vm_number);
|
||||
new_value_address->set_number(val_addr1->to_number()/val_addr2->to_number());
|
||||
vm.add_reference(new_value_address);
|
||||
*(++value_stack_top)=new_value_address;
|
||||
*value_stack_top=new_value_address;
|
||||
vm.del_reference(*mem_addr);
|
||||
*mem_addr=new_value_address;
|
||||
vm.del_reference(val_addr2);
|
||||
|
@ -412,12 +412,12 @@ void nasal_bytecode_vm::opr_lnkeq()
|
|||
{
|
||||
nasal_scalar** mem_addr=pointer_stack.top();
|
||||
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* new_value_address=vm.gc_alloc(vm_string);
|
||||
new_value_address->set_string(val_addr1->to_string()+val_addr2->to_string());
|
||||
vm.add_reference(new_value_address);
|
||||
*(++value_stack_top)=new_value_address;
|
||||
*value_stack_top=new_value_address;
|
||||
vm.del_reference(*mem_addr);
|
||||
*mem_addr=new_value_address;
|
||||
vm.del_reference(val_addr2);
|
||||
|
|
|
@ -720,16 +720,12 @@ nasal_scalar* nasal_virtual_machine::gc_alloc(int val_type)
|
|||
}
|
||||
void nasal_virtual_machine::add_reference(nasal_scalar* value_address)
|
||||
{
|
||||
if(value_address)
|
||||
++value_address->ref_cnt;
|
||||
return;
|
||||
}
|
||||
void nasal_virtual_machine::del_reference(nasal_scalar* value_address)
|
||||
{
|
||||
if(value_address)
|
||||
--value_address->ref_cnt;
|
||||
else
|
||||
return;
|
||||
if(!value_address->ref_cnt)
|
||||
{
|
||||
value_address->clear();
|
||||
|
|
|
@ -133,12 +133,6 @@ void nasal_parse::main_process()
|
|||
if(ptr<tok_list_size)
|
||||
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;
|
||||
}
|
||||
|
@ -518,8 +512,7 @@ nasal_ast nasal_parse::exprs_gen()
|
|||
nasal_ast node(tok_list[ptr].line,ast_block);
|
||||
if(tok_list[ptr].type==tok_left_brace)
|
||||
{
|
||||
int left_brace_line=tok_list[ptr].line;
|
||||
++ptr;
|
||||
int left_brace_line=tok_list[ptr++].line;
|
||||
while(ptr<tok_list_size && tok_list[ptr].type!=tok_right_brace)
|
||||
{
|
||||
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)
|
||||
{
|
||||
std::string lb_line="";
|
||||
while(left_brace_line>1)
|
||||
while(left_brace_line)
|
||||
{
|
||||
lb_line=(char)('0'+(left_brace_line%10))+lb_line;
|
||||
left_brace_line/=10;
|
||||
|
@ -551,9 +544,7 @@ nasal_ast nasal_parse::exprs_gen()
|
|||
else
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
@ -667,37 +658,6 @@ nasal_ast nasal_parse::additive_expr()
|
|||
tmp.add_child(multive_expr());
|
||||
else
|
||||
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;
|
||||
}
|
||||
--ptr;
|
||||
|
|
Loading…
Reference in New Issue