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()
|
||||
{
|
||||
nasal_vector& ref=(*value_stack_top)->get_vector();
|
||||
counter_stack.top()++;
|
||||
++counter_stack.top();
|
||||
if(counter_stack.top()>=ref.size())
|
||||
{
|
||||
vm.del_reference(*value_stack_top--);
|
||||
|
@ -693,7 +693,7 @@ void nasal_bytecode_vm::opr_forindex()
|
|||
void nasal_bytecode_vm::opr_foreach()
|
||||
{
|
||||
nasal_vector& ref=(*value_stack_top)->get_vector();
|
||||
counter_stack.top()++;
|
||||
++counter_stack.top();
|
||||
if(counter_stack.top()>=ref.size())
|
||||
{
|
||||
vm.del_reference(*value_stack_top--);
|
||||
|
@ -701,7 +701,7 @@ void nasal_bytecode_vm::opr_foreach()
|
|||
ptr=exec_code[ptr].index-1;
|
||||
return;
|
||||
}
|
||||
nasal_scalar* res=ref.get_value_address(counter_stack.top());
|
||||
nasal_scalar* res=ref[counter_stack.top()];
|
||||
vm.add_reference(res);
|
||||
*(++value_stack_top)=res;
|
||||
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();
|
||||
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 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)
|
||||
{
|
||||
int vec_size=elems.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 &elems[(index+vec_size)%vec_size];
|
||||
int idx[2]={index+vec_size,index};
|
||||
return &elems[idx[index>=0]];
|
||||
}
|
||||
void nasal_vector::print()
|
||||
{
|
||||
|
@ -462,26 +464,26 @@ nasal_closure::~nasal_closure()
|
|||
void nasal_closure::add_scope()
|
||||
{
|
||||
std::map<int,nasal_scalar*> new_scope;
|
||||
elems.push_back(new_scope);
|
||||
elems.push_front(new_scope);
|
||||
return;
|
||||
}
|
||||
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)
|
||||
vm.del_reference(i->second);
|
||||
elems.pop_back();
|
||||
elems.pop_front();
|
||||
return;
|
||||
}
|
||||
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
|
||||
nasal_scalar* old_val_address=elems.back()[key];
|
||||
nasal_scalar* old_val_address=elems.front()[key];
|
||||
vm.del_reference(old_val_address);
|
||||
}
|
||||
elems.back()[key]=value_address;
|
||||
elems.front()[key]=value_address;
|
||||
return;
|
||||
}
|
||||
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;
|
||||
for(std::list<std::map<int,nasal_scalar*> >::iterator i=elems.begin();i!=elems.end();++i)
|
||||
if(i->find(key)!=i->end())
|
||||
ret_address=(*i)[key];
|
||||
return (*i)[key];
|
||||
return ret_address;
|
||||
}
|
||||
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;
|
||||
for(std::list<std::map<int,nasal_scalar*> >::iterator i=elems.begin();i!=elems.end();++i)
|
||||
if(i->find(key)!=i->end())
|
||||
ret_address=&((*i)[key]);
|
||||
return &((*i)[key]);
|
||||
return ret_address;
|
||||
}
|
||||
void nasal_closure::set_closure(nasal_closure& tmp)
|
||||
|
|
Loading…
Reference in New Issue