update
This commit is contained in:
parent
b5ff32710e
commit
5e18b2dcfc
|
@ -5,7 +5,7 @@ int nasal_runtime::builtin_print(int local_scope_addr)
|
||||||
{
|
{
|
||||||
int vector_value_addr=-1;
|
int vector_value_addr=-1;
|
||||||
if(local_scope_addr>=0)
|
if(local_scope_addr>=0)
|
||||||
vector_value_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("dyn");
|
vector_value_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("elements");
|
||||||
if(vector_value_addr<0 || nasal_vm.gc_get(vector_value_addr).get_type()!=vm_vector)
|
if(vector_value_addr<0 || nasal_vm.gc_get(vector_value_addr).get_type()!=vm_vector)
|
||||||
{
|
{
|
||||||
std::cout<<">> [runtime] builtin_print: cannot find values or wrong value type."<<std::endl;
|
std::cout<<">> [runtime] builtin_print: cannot find values or wrong value type."<<std::endl;
|
||||||
|
@ -34,5 +34,102 @@ int nasal_runtime::builtin_print(int local_scope_addr)
|
||||||
nasal_vm.gc_get(ret_addr).set_type(vm_nil);
|
nasal_vm.gc_get(ret_addr).set_type(vm_nil);
|
||||||
return ret_addr;
|
return ret_addr;
|
||||||
}
|
}
|
||||||
|
int nasal_runtime::builtin_append(int local_scope_addr)
|
||||||
|
{
|
||||||
|
int vector_value_addr=-1;
|
||||||
|
if(local_scope_addr>=0)
|
||||||
|
vector_value_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("vector");
|
||||||
|
if(vector_value_addr<0 || nasal_vm.gc_get(vector_value_addr).get_type()!=vm_vector)
|
||||||
|
{
|
||||||
|
std::cout<<">> [runtime] builtin_append: cannot find values or wrong value type."<<std::endl;
|
||||||
|
++error;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
int elem_value_addr=-1;
|
||||||
|
if(local_scope_addr>=0)
|
||||||
|
elem_value_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("elements");
|
||||||
|
if(elem_value_addr<0 || nasal_vm.gc_get(elem_value_addr).get_type()!=vm_vector)
|
||||||
|
{
|
||||||
|
std::cout<<">> [runtime] builtin_append: cannot find values or wrong value type."<<std::endl;
|
||||||
|
++error;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
nasal_vector& ref_vector=nasal_vm.gc_get(vector_value_addr).get_vector();
|
||||||
|
nasal_vector& ref_elements=nasal_vm.gc_get(elem_value_addr).get_vector();
|
||||||
|
int size=ref_elements.size();
|
||||||
|
for(int i=0;i<size;++i)
|
||||||
|
{
|
||||||
|
int value_address=ref_elements.get_value_address(i);
|
||||||
|
nasal_vm.add_reference(value_address);
|
||||||
|
ref_vector.add_elem(value_address);
|
||||||
|
}
|
||||||
|
int ret_addr=nasal_vm.gc_alloc();
|
||||||
|
nasal_vm.gc_get(ret_addr).set_type(vm_nil);
|
||||||
|
return ret_addr;
|
||||||
|
}
|
||||||
|
int nasal_runtime::builtin_setsize(int local_scope_addr)
|
||||||
|
{
|
||||||
|
int vector_value_addr=-1;
|
||||||
|
if(local_scope_addr>=0)
|
||||||
|
vector_value_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("vector");
|
||||||
|
if(vector_value_addr<0 || nasal_vm.gc_get(vector_value_addr).get_type()!=vm_vector)
|
||||||
|
{
|
||||||
|
std::cout<<">> [runtime] builtin_setsize: cannot find values or wrong value type."<<std::endl;
|
||||||
|
++error;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
int size_value_addr=-1;
|
||||||
|
if(local_scope_addr>=0)
|
||||||
|
size_value_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("size");
|
||||||
|
if(size_value_addr<0)
|
||||||
|
{
|
||||||
|
std::cout<<">> [runtime] builtin_setsize: cannot find values or wrong value type."<<std::endl;
|
||||||
|
++error;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
int type=nasal_vm.gc_get(size_value_addr).get_type();
|
||||||
|
if(type!=vm_number && type!=vm_string)
|
||||||
|
{
|
||||||
|
std::cout<<">> [runtime] builtin_setsize: size is not a number."<<std::endl;
|
||||||
|
++error;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
int number;
|
||||||
|
if(type==vm_number)
|
||||||
|
number=(int)nasal_vm.gc_get(size_value_addr).get_number();
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::string str=nasal_vm.gc_get(size_value_addr).get_string();
|
||||||
|
if(check_numerable_string(str))
|
||||||
|
number=(int)trans_string_to_number(str);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::cout<<">> [runtime] builtin_setsize: size is not a numerable string."<<std::endl;
|
||||||
|
++error;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(number<0)
|
||||||
|
{
|
||||||
|
std::cout<<">> [runtime] builtin_setsize: size must be greater than -1."<<std::endl;
|
||||||
|
++error;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
nasal_vector& ref_vector=nasal_vm.gc_get(vector_value_addr).get_vector();
|
||||||
|
int vec_size=ref_vector.size();
|
||||||
|
if(number<vec_size)
|
||||||
|
for(int i=number;i<vec_size;++i)
|
||||||
|
ref_vector.del_elem(number);
|
||||||
|
else if(number>vec_size)
|
||||||
|
for(int i=vec_size;i<number;++i)
|
||||||
|
{
|
||||||
|
int new_val_addr=nasal_vm.gc_alloc();
|
||||||
|
nasal_vm.gc_get(new_val_addr).set_type(vm_nil);
|
||||||
|
ref_vector.add_elem(new_val_addr);
|
||||||
|
}
|
||||||
|
int ret_addr=nasal_vm.gc_alloc();
|
||||||
|
nasal_vm.gc_get(ret_addr).set_type(vm_nil);
|
||||||
|
return ret_addr;
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
|
@ -181,8 +181,10 @@ nasal_vector::~nasal_vector()
|
||||||
elems.clear();
|
elems.clear();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
void nasal_vector::add_elem(int memory_address)
|
void nasal_vector::add_elem(int value_address)
|
||||||
{
|
{
|
||||||
|
int memory_address=nasal_vm.mem_alloc();
|
||||||
|
nasal_vm.mem_init(memory_address,value_address);
|
||||||
elems.push_back(memory_address);
|
elems.push_back(memory_address);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -253,10 +255,14 @@ nasal_hash::~nasal_hash()
|
||||||
elems.clear();
|
elems.clear();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
void nasal_hash::add_elem(std::string key,int memory_address)
|
void nasal_hash::add_elem(std::string key,int value_address)
|
||||||
{
|
{
|
||||||
if(elems.find(key)==elems.end())
|
if(elems.find(key)==elems.end())
|
||||||
|
{
|
||||||
|
int memory_address=nasal_vm.mem_alloc();
|
||||||
|
nasal_vm.mem_init(memory_address,value_address);
|
||||||
elems[key]=memory_address;
|
elems[key]=memory_address;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
std::cout<<">> [vm] nasal_hash::add_elem: "<<key<<" already exists."<<std::endl;
|
std::cout<<">> [vm] nasal_hash::add_elem: "<<key<<" already exists."<<std::endl;
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -75,6 +75,8 @@ private:
|
||||||
|
|
||||||
// builtin_func defined here
|
// builtin_func defined here
|
||||||
int builtin_print(int);
|
int builtin_print(int);
|
||||||
|
int builtin_append(int);
|
||||||
|
int builtin_setsize(int);
|
||||||
public:
|
public:
|
||||||
nasal_runtime();
|
nasal_runtime();
|
||||||
~nasal_runtime();
|
~nasal_runtime();
|
||||||
|
@ -145,11 +147,7 @@ int nasal_runtime::vector_generation(nasal_ast& node,int local_scope_addr)
|
||||||
|
|
||||||
int node_children_size=node.get_children().size();
|
int node_children_size=node.get_children().size();
|
||||||
for(int i=0;i<node_children_size;++i)
|
for(int i=0;i<node_children_size;++i)
|
||||||
{
|
ref_of_this_vector.add_elem(calculation(node.get_children()[i],local_scope_addr));
|
||||||
int new_memory_space=nasal_vm.mem_alloc();
|
|
||||||
ref_of_this_vector.add_elem(new_memory_space);
|
|
||||||
nasal_vm.mem_init(new_memory_space,calculation(node.get_children()[i],local_scope_addr));
|
|
||||||
}
|
|
||||||
return new_addr;
|
return new_addr;
|
||||||
}
|
}
|
||||||
int nasal_runtime::hash_generation(nasal_ast& node,int local_scope_addr)
|
int nasal_runtime::hash_generation(nasal_ast& node,int local_scope_addr)
|
||||||
|
@ -157,15 +155,12 @@ int nasal_runtime::hash_generation(nasal_ast& node,int local_scope_addr)
|
||||||
int new_addr=nasal_vm.gc_alloc();
|
int new_addr=nasal_vm.gc_alloc();
|
||||||
nasal_vm.gc_get(new_addr).set_type(vm_hash);
|
nasal_vm.gc_get(new_addr).set_type(vm_hash);
|
||||||
nasal_hash& ref_of_this_hash=nasal_vm.gc_get(new_addr).get_hash();
|
nasal_hash& ref_of_this_hash=nasal_vm.gc_get(new_addr).get_hash();
|
||||||
|
|
||||||
int node_children_size=node.get_children().size();
|
int node_children_size=node.get_children().size();
|
||||||
for(int i=0;i<node_children_size;++i)
|
for(int i=0;i<node_children_size;++i)
|
||||||
{
|
{
|
||||||
int new_memory_space=nasal_vm.mem_alloc();
|
|
||||||
std::string hash_member_name=node.get_children()[i].get_children()[0].get_str();
|
|
||||||
ref_of_this_hash.add_elem(hash_member_name,new_memory_space);
|
|
||||||
nasal_ast& ref_of_hash_member_value=node.get_children()[i].get_children()[1];
|
nasal_ast& ref_of_hash_member_value=node.get_children()[i].get_children()[1];
|
||||||
nasal_vm.mem_init(new_memory_space,calculation(ref_of_hash_member_value,local_scope_addr));
|
std::string hash_member_name=node.get_children()[i].get_children()[0].get_str();
|
||||||
|
ref_of_this_hash.add_elem(hash_member_name,calculation(ref_of_hash_member_value,local_scope_addr));
|
||||||
}
|
}
|
||||||
return new_addr;
|
return new_addr;
|
||||||
}
|
}
|
||||||
|
@ -204,10 +199,10 @@ int nasal_runtime::main_progress()
|
||||||
case ast_conditional:ret_state=conditional_progress(root.get_children()[i],-1,false);break;
|
case ast_conditional:ret_state=conditional_progress(root.get_children()[i],-1,false);break;
|
||||||
case ast_while:case ast_for:case ast_forindex:case ast_foreach:
|
case ast_while:case ast_for:case ast_forindex:case ast_foreach:
|
||||||
ret_state=loop_progress(root.get_children()[i],-1,false);break;
|
ret_state=loop_progress(root.get_children()[i],-1,false);break;
|
||||||
case ast_number:case ast_string:case ast_function:break;
|
case ast_nil:case ast_number:case ast_string:case ast_function:break;
|
||||||
case ast_vector:case ast_hash:
|
case ast_vector:case ast_hash:
|
||||||
case ast_call:
|
case ast_call:
|
||||||
case ast_add_equal:case ast_sub_equal:case ast_mult_equal:case ast_div_equal:case ast_link_equal:
|
case ast_equal:case ast_add_equal:case ast_sub_equal:case ast_mult_equal:case ast_div_equal:case ast_link_equal:
|
||||||
case ast_unary_sub:case ast_unary_not:
|
case ast_unary_sub:case ast_unary_not:
|
||||||
case ast_add:case ast_sub:case ast_mult:case ast_div:case ast_link:
|
case ast_add:case ast_sub:case ast_mult:case ast_div:case ast_link:
|
||||||
case ast_trinocular:nasal_vm.del_reference(calculation(root.get_children()[i],-1));break;
|
case ast_trinocular:nasal_vm.del_reference(calculation(root.get_children()[i],-1));break;
|
||||||
|
@ -258,10 +253,10 @@ int nasal_runtime::block_progress(nasal_ast& node,int local_scope_addr,bool allo
|
||||||
case ast_conditional:ret_state=conditional_progress(tmp_node,local_scope_addr,allow_return);break;
|
case ast_conditional:ret_state=conditional_progress(tmp_node,local_scope_addr,allow_return);break;
|
||||||
case ast_while:case ast_for:case ast_forindex:case ast_foreach:
|
case ast_while:case ast_for:case ast_forindex:case ast_foreach:
|
||||||
ret_state=loop_progress(tmp_node,local_scope_addr,allow_return);break;
|
ret_state=loop_progress(tmp_node,local_scope_addr,allow_return);break;
|
||||||
case ast_number:case ast_string:case ast_function:break;
|
case ast_nil:case ast_number:case ast_string:case ast_function:break;
|
||||||
case ast_vector:case ast_hash:
|
case ast_vector:case ast_hash:
|
||||||
case ast_call:
|
case ast_call:
|
||||||
case ast_add_equal:case ast_sub_equal:case ast_mult_equal:case ast_div_equal:case ast_link_equal:
|
case ast_equal:case ast_add_equal:case ast_sub_equal:case ast_mult_equal:case ast_div_equal:case ast_link_equal:
|
||||||
case ast_unary_sub:case ast_unary_not:
|
case ast_unary_sub:case ast_unary_not:
|
||||||
case ast_add:case ast_sub:case ast_mult:case ast_div:case ast_link:
|
case ast_add:case ast_sub:case ast_mult:case ast_div:case ast_link:
|
||||||
case ast_trinocular:nasal_vm.del_reference(calculation(tmp_node,local_scope_addr));break;
|
case ast_trinocular:nasal_vm.del_reference(calculation(tmp_node,local_scope_addr));break;
|
||||||
|
@ -306,10 +301,10 @@ int nasal_runtime::before_for_loop(nasal_ast& node,int local_scope_addr)
|
||||||
case ast_null:break;
|
case ast_null:break;
|
||||||
case ast_definition:definition(node,local_scope_addr);break;
|
case ast_definition:definition(node,local_scope_addr);break;
|
||||||
case ast_multi_assign:multi_assignment(node,local_scope_addr);break;
|
case ast_multi_assign:multi_assignment(node,local_scope_addr);break;
|
||||||
case ast_number:case ast_string:case ast_function:break;
|
case ast_nil:case ast_number:case ast_string:case ast_function:break;
|
||||||
case ast_vector:case ast_hash:
|
case ast_vector:case ast_hash:
|
||||||
case ast_call:
|
case ast_call:
|
||||||
case ast_add_equal:case ast_sub_equal:case ast_mult_equal:case ast_div_equal:case ast_link_equal:
|
case ast_equal:case ast_add_equal:case ast_sub_equal:case ast_mult_equal:case ast_div_equal:case ast_link_equal:
|
||||||
case ast_unary_sub:case ast_unary_not:
|
case ast_unary_sub:case ast_unary_not:
|
||||||
case ast_add:case ast_sub:case ast_mult:case ast_div:case ast_link:
|
case ast_add:case ast_sub:case ast_mult:case ast_div:case ast_link:
|
||||||
case ast_trinocular:nasal_vm.del_reference(calculation(node,local_scope_addr));break;
|
case ast_trinocular:nasal_vm.del_reference(calculation(node,local_scope_addr));break;
|
||||||
|
@ -327,10 +322,10 @@ int nasal_runtime::after_each_for_loop(nasal_ast& node,int local_scope_addr)
|
||||||
case ast_null:break;
|
case ast_null:break;
|
||||||
case ast_definition:definition(node,local_scope_addr);break;
|
case ast_definition:definition(node,local_scope_addr);break;
|
||||||
case ast_multi_assign:multi_assignment(node,local_scope_addr);break;
|
case ast_multi_assign:multi_assignment(node,local_scope_addr);break;
|
||||||
case ast_number:case ast_string:case ast_function:break;
|
case ast_nil:case ast_number:case ast_string:case ast_function:break;
|
||||||
case ast_vector:case ast_hash:
|
case ast_vector:case ast_hash:
|
||||||
case ast_call:
|
case ast_call:
|
||||||
case ast_add_equal:case ast_sub_equal:case ast_mult_equal:case ast_div_equal:case ast_link_equal:
|
case ast_equal:case ast_add_equal:case ast_sub_equal:case ast_mult_equal:case ast_div_equal:case ast_link_equal:
|
||||||
case ast_unary_sub:case ast_unary_not:
|
case ast_unary_sub:case ast_unary_not:
|
||||||
case ast_add:case ast_sub:case ast_mult:case ast_div:case ast_link:
|
case ast_add:case ast_sub:case ast_mult:case ast_div:case ast_link:
|
||||||
case ast_trinocular:nasal_vm.del_reference(calculation(node,local_scope_addr));break;
|
case ast_trinocular:nasal_vm.del_reference(calculation(node,local_scope_addr));break;
|
||||||
|
@ -760,17 +755,13 @@ int nasal_runtime::call_vector(nasal_ast& node,int base_value_addr,int local_sco
|
||||||
if(value_type==vm_vector || value_type==vm_hash)
|
if(value_type==vm_vector || value_type==vm_hash)
|
||||||
{
|
{
|
||||||
nasal_vm.add_reference(value_addr);
|
nasal_vm.add_reference(value_addr);
|
||||||
int new_mem_addr=nasal_vm.mem_alloc();
|
return_vector.add_elem(value_addr);
|
||||||
nasal_vm.mem_init(new_mem_addr,value_addr);
|
|
||||||
return_vector.add_elem(new_mem_addr);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
int tmp_value_addr=nasal_vm.gc_alloc();
|
int tmp_value_addr=nasal_vm.gc_alloc();
|
||||||
nasal_vm.gc_get(tmp_value_addr).deepcopy(nasal_vm.gc_get(value_addr));
|
nasal_vm.gc_get(tmp_value_addr).deepcopy(nasal_vm.gc_get(value_addr));
|
||||||
int new_mem_addr=nasal_vm.mem_alloc();
|
return_vector.add_elem(tmp_value_addr);
|
||||||
nasal_vm.mem_init(new_mem_addr,tmp_value_addr);
|
|
||||||
return_vector.add_elem(new_mem_addr);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1030,11 +1021,7 @@ int nasal_runtime::call_function(nasal_ast& node,std::string func_name,int base_
|
||||||
nasal_vm.gc_get(vector_value_addr).set_type(vm_vector);
|
nasal_vm.gc_get(vector_value_addr).set_type(vm_vector);
|
||||||
nasal_vector& ref_vec=nasal_vm.gc_get(vector_value_addr).get_vector();
|
nasal_vector& ref_vec=nasal_vm.gc_get(vector_value_addr).get_vector();
|
||||||
for(int j=i;j<size;++j)
|
for(int j=i;j<size;++j)
|
||||||
{
|
ref_vec.add_elem(args[j]);
|
||||||
int new_mem=nasal_vm.mem_alloc();
|
|
||||||
nasal_vm.mem_init(new_mem,args[j]);
|
|
||||||
ref_vec.add_elem(new_mem);
|
|
||||||
}
|
|
||||||
run_closure.add_new_value(tmp_node.get_str(),vector_value_addr);
|
run_closure.add_new_value(tmp_node.get_str(),vector_value_addr);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1101,8 +1088,8 @@ int nasal_runtime::call_builtin_function(nasal_ast& node,int local_scope_addr)
|
||||||
switch(builtin_num)
|
switch(builtin_num)
|
||||||
{
|
{
|
||||||
case 0:ret_value_addr=builtin_print(local_scope_addr);break;
|
case 0:ret_value_addr=builtin_print(local_scope_addr);break;
|
||||||
case 1:break;
|
case 1:ret_value_addr=builtin_append(local_scope_addr);break;
|
||||||
case 2:break;
|
case 2:ret_value_addr=builtin_setsize(local_scope_addr);break;
|
||||||
}
|
}
|
||||||
return ret_value_addr;
|
return ret_value_addr;
|
||||||
}
|
}
|
||||||
|
@ -1413,8 +1400,6 @@ int nasal_runtime::calculation(nasal_ast& node,int local_scope_addr)
|
||||||
{
|
{
|
||||||
int scalar_mem_space=call_scalar_mem(node.get_children()[0],local_scope_addr);
|
int scalar_mem_space=call_scalar_mem(node.get_children()[0],local_scope_addr);
|
||||||
int new_scalar_gc_addr=calculation(node.get_children()[1],local_scope_addr);
|
int new_scalar_gc_addr=calculation(node.get_children()[1],local_scope_addr);
|
||||||
|
|
||||||
int type=nasal_vm.gc_get(new_scalar_gc_addr).get_type();
|
|
||||||
nasal_vm.mem_change(scalar_mem_space,new_scalar_gc_addr);// this progress will delete the reference to old gc_addr in scalar_mem_space
|
nasal_vm.mem_change(scalar_mem_space,new_scalar_gc_addr);// this progress will delete the reference to old gc_addr in scalar_mem_space
|
||||||
nasal_vm.add_reference(new_scalar_gc_addr);// this reference is reserved for ret_address
|
nasal_vm.add_reference(new_scalar_gc_addr);// this reference is reserved for ret_address
|
||||||
ret_address=new_scalar_gc_addr;
|
ret_address=new_scalar_gc_addr;
|
||||||
|
|
Loading…
Reference in New Issue