update
This commit is contained in:
parent
e03da2f737
commit
89540475cf
|
@ -677,7 +677,7 @@ void nasal_bytecode_vm::opr_counter()
|
||||||
void nasal_bytecode_vm::opr_forindex()
|
void nasal_bytecode_vm::opr_forindex()
|
||||||
{
|
{
|
||||||
nasal_vector& ref=(*value_stack_top)->get_vector();
|
nasal_vector& ref=(*value_stack_top)->get_vector();
|
||||||
counter_stack.top()++;
|
++counter_stack.top();
|
||||||
if(counter_stack.top()>=ref.size())
|
if(counter_stack.top()>=ref.size())
|
||||||
{
|
{
|
||||||
vm.del_reference(*value_stack_top--);
|
vm.del_reference(*value_stack_top--);
|
||||||
|
@ -693,7 +693,7 @@ void nasal_bytecode_vm::opr_forindex()
|
||||||
void nasal_bytecode_vm::opr_foreach()
|
void nasal_bytecode_vm::opr_foreach()
|
||||||
{
|
{
|
||||||
nasal_vector& ref=(*value_stack_top)->get_vector();
|
nasal_vector& ref=(*value_stack_top)->get_vector();
|
||||||
counter_stack.top()++;
|
++counter_stack.top();
|
||||||
if(counter_stack.top()>=ref.size())
|
if(counter_stack.top()>=ref.size())
|
||||||
{
|
{
|
||||||
vm.del_reference(*value_stack_top--);
|
vm.del_reference(*value_stack_top--);
|
||||||
|
@ -701,7 +701,7 @@ void nasal_bytecode_vm::opr_foreach()
|
||||||
ptr=exec_code[ptr].index-1;
|
ptr=exec_code[ptr].index-1;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
nasal_scalar* res=ref.get_value_address(counter_stack.top());
|
nasal_scalar* res=ref[counter_stack.top()];
|
||||||
vm.add_reference(res);
|
vm.add_reference(res);
|
||||||
*(++value_stack_top)=res;
|
*(++value_stack_top)=res;
|
||||||
return;
|
return;
|
||||||
|
|
26
nasal_gc.h
26
nasal_gc.h
|
@ -195,20 +195,22 @@ nasal_scalar* nasal_vector::get_value_address(int index)
|
||||||
int vec_size=elems.size();
|
int vec_size=elems.size();
|
||||||
if(index<-vec_size || index>=vec_size)
|
if(index<-vec_size || index>=vec_size)
|
||||||
{
|
{
|
||||||
std::cout<<">> [runtime] nasal_vector::get_value_address: index out of range: "<<index<<"\n";
|
std::cout<<">> [vm] nasal_vector::get_value_address: index out of range: "<<index<<"\n";
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
return elems[(index+vec_size)%vec_size];
|
int idx[2]={index+vec_size,index};
|
||||||
|
return elems[idx[index>=0]];
|
||||||
}
|
}
|
||||||
nasal_scalar** nasal_vector::get_mem_address(int index)
|
nasal_scalar** nasal_vector::get_mem_address(int index)
|
||||||
{
|
{
|
||||||
int vec_size=elems.size();
|
int vec_size=elems.size();
|
||||||
if(index<-vec_size || index>=vec_size)
|
if(index<-vec_size || index>=vec_size)
|
||||||
{
|
{
|
||||||
std::cout<<">> [runtime] nasal_vector::get_mem_address: index out of range: "<<index<<"\n";
|
std::cout<<">> [vm] nasal_vector::get_mem_address: index out of range: "<<index<<"\n";
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
return &elems[(index+vec_size)%vec_size];
|
int idx[2]={index+vec_size,index};
|
||||||
|
return &elems[idx[index>=0]];
|
||||||
}
|
}
|
||||||
void nasal_vector::print()
|
void nasal_vector::print()
|
||||||
{
|
{
|
||||||
|
@ -462,26 +464,26 @@ nasal_closure::~nasal_closure()
|
||||||
void nasal_closure::add_scope()
|
void nasal_closure::add_scope()
|
||||||
{
|
{
|
||||||
std::map<int,nasal_scalar*> new_scope;
|
std::map<int,nasal_scalar*> new_scope;
|
||||||
elems.push_back(new_scope);
|
elems.push_front(new_scope);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
void nasal_closure::del_scope()
|
void nasal_closure::del_scope()
|
||||||
{
|
{
|
||||||
std::map<int,nasal_scalar*>& last_scope=elems.back();
|
std::map<int,nasal_scalar*>& last_scope=elems.front();
|
||||||
for(std::map<int,nasal_scalar*>::iterator i=last_scope.begin();i!=last_scope.end();++i)
|
for(std::map<int,nasal_scalar*>::iterator i=last_scope.begin();i!=last_scope.end();++i)
|
||||||
vm.del_reference(i->second);
|
vm.del_reference(i->second);
|
||||||
elems.pop_back();
|
elems.pop_front();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
void nasal_closure::add_new_value(int key,nasal_scalar* value_address)
|
void nasal_closure::add_new_value(int key,nasal_scalar* value_address)
|
||||||
{
|
{
|
||||||
if(elems.back().find(key)!=elems.back().end())
|
if(elems.front().find(key)!=elems.front().end())
|
||||||
{
|
{
|
||||||
// if this value already exists,delete the old value and update a new value
|
// if this value already exists,delete the old value and update a new value
|
||||||
nasal_scalar* old_val_address=elems.back()[key];
|
nasal_scalar* old_val_address=elems.front()[key];
|
||||||
vm.del_reference(old_val_address);
|
vm.del_reference(old_val_address);
|
||||||
}
|
}
|
||||||
elems.back()[key]=value_address;
|
elems.front()[key]=value_address;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
nasal_scalar* nasal_closure::get_value_address(int key)
|
nasal_scalar* nasal_closure::get_value_address(int key)
|
||||||
|
@ -489,7 +491,7 @@ nasal_scalar* nasal_closure::get_value_address(int key)
|
||||||
nasal_scalar* ret_address=NULL;
|
nasal_scalar* ret_address=NULL;
|
||||||
for(std::list<std::map<int,nasal_scalar*> >::iterator i=elems.begin();i!=elems.end();++i)
|
for(std::list<std::map<int,nasal_scalar*> >::iterator i=elems.begin();i!=elems.end();++i)
|
||||||
if(i->find(key)!=i->end())
|
if(i->find(key)!=i->end())
|
||||||
ret_address=(*i)[key];
|
return (*i)[key];
|
||||||
return ret_address;
|
return ret_address;
|
||||||
}
|
}
|
||||||
nasal_scalar** nasal_closure::get_mem_address(int key)
|
nasal_scalar** nasal_closure::get_mem_address(int key)
|
||||||
|
@ -497,7 +499,7 @@ nasal_scalar** nasal_closure::get_mem_address(int key)
|
||||||
nasal_scalar** ret_address=NULL;
|
nasal_scalar** ret_address=NULL;
|
||||||
for(std::list<std::map<int,nasal_scalar*> >::iterator i=elems.begin();i!=elems.end();++i)
|
for(std::list<std::map<int,nasal_scalar*> >::iterator i=elems.begin();i!=elems.end();++i)
|
||||||
if(i->find(key)!=i->end())
|
if(i->find(key)!=i->end())
|
||||||
ret_address=&((*i)[key]);
|
return &((*i)[key]);
|
||||||
return ret_address;
|
return ret_address;
|
||||||
}
|
}
|
||||||
void nasal_closure::set_closure(nasal_closure& tmp)
|
void nasal_closure::set_closure(nasal_closure& tmp)
|
||||||
|
|
Loading…
Reference in New Issue