bug fixed
This commit is contained in:
parent
33e544387e
commit
c5d700d0bc
17
nasal_gc.h
17
nasal_gc.h
|
@ -307,8 +307,6 @@ int nasal_hash::get_value_address(std::string key)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
std::cout<<">> [runtime] cannot find hash member \""<<key<<"\".\n";
|
|
||||||
return ret_value_addr;
|
return ret_value_addr;
|
||||||
}
|
}
|
||||||
int nasal_hash::get_mem_address(std::string key)
|
int nasal_hash::get_mem_address(std::string key)
|
||||||
|
@ -334,13 +332,6 @@ int nasal_hash::get_mem_address(std::string key)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
int val_addr=vm.gc_alloc(vm_nil);
|
|
||||||
int mem_addr=vm.mem_alloc(val_addr);
|
|
||||||
elems[key]=mem_addr;
|
|
||||||
ret_mem_addr=mem_addr;
|
|
||||||
}
|
|
||||||
return ret_mem_addr;
|
return ret_mem_addr;
|
||||||
}
|
}
|
||||||
bool nasal_hash::check_contain(std::string key)
|
bool nasal_hash::check_contain(std::string key)
|
||||||
|
@ -656,12 +647,10 @@ nasal_virtual_machine::~nasal_virtual_machine()
|
||||||
{
|
{
|
||||||
garbage_collector_memory[i]->ref_cnt=0;
|
garbage_collector_memory[i]->ref_cnt=0;
|
||||||
garbage_collector_memory[i]->collected=true;
|
garbage_collector_memory[i]->collected=true;
|
||||||
|
garbage_collector_memory[i]->elem.clear();
|
||||||
}
|
}
|
||||||
for(int i=0;i<gc_mem_size;++i)
|
for(int i=0;i<gc_mem_size;++i)
|
||||||
{
|
|
||||||
garbage_collector_memory[i]->elem.clear();
|
|
||||||
delete garbage_collector_memory[i];
|
delete garbage_collector_memory[i];
|
||||||
}
|
|
||||||
while(!garbage_collector_free_space.empty())
|
while(!garbage_collector_free_space.empty())
|
||||||
garbage_collector_free_space.pop();
|
garbage_collector_free_space.pop();
|
||||||
while(!memory_manager_free_space.empty())
|
while(!memory_manager_free_space.empty())
|
||||||
|
@ -699,12 +688,10 @@ void nasal_virtual_machine::clear()
|
||||||
{
|
{
|
||||||
garbage_collector_memory[i]->ref_cnt=0;
|
garbage_collector_memory[i]->ref_cnt=0;
|
||||||
garbage_collector_memory[i]->collected=true;
|
garbage_collector_memory[i]->collected=true;
|
||||||
|
garbage_collector_memory[i]->elem.clear();
|
||||||
}
|
}
|
||||||
for(int i=0;i<gc_mem_size;++i)
|
for(int i=0;i<gc_mem_size;++i)
|
||||||
{
|
|
||||||
garbage_collector_memory[i]->elem.clear();
|
|
||||||
delete garbage_collector_memory[i];
|
delete garbage_collector_memory[i];
|
||||||
}
|
|
||||||
while(!garbage_collector_free_space.empty())
|
while(!garbage_collector_free_space.empty())
|
||||||
garbage_collector_free_space.pop();
|
garbage_collector_free_space.pop();
|
||||||
while(!memory_manager_free_space.empty())
|
while(!memory_manager_free_space.empty())
|
||||||
|
|
|
@ -770,7 +770,13 @@ int nasal_runtime::call_hash(nasal_ast& node,int base_value_addr,int local_scope
|
||||||
die(node.get_line(),"called a value that is not a hash");
|
die(node.get_line(),"called a value that is not a hash");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
int ret_value_addr=nasal_vm.gc_get(base_value_addr).get_hash().get_value_address(node.get_str());
|
std::string str=node.get_str();
|
||||||
|
int ret_value_addr=nasal_vm.gc_get(base_value_addr).get_hash().get_value_address(str);
|
||||||
|
if(ret_value_addr<0)
|
||||||
|
{
|
||||||
|
die(node.get_line(),"cannot find member named \""+str+"\"");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
nasal_vm.add_reference(ret_value_addr);
|
nasal_vm.add_reference(ret_value_addr);
|
||||||
return ret_value_addr;
|
return ret_value_addr;
|
||||||
}
|
}
|
||||||
|
@ -1073,7 +1079,13 @@ int nasal_runtime::call_hash_mem(nasal_ast& node,int base_mem_addr,int local_sco
|
||||||
die(node.get_line(),"called a value that is not a hash");
|
die(node.get_line(),"called a value that is not a hash");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
int ret_mem_addr=nasal_vm.gc_get(base_value_addr).get_hash().get_mem_address(node.get_str());
|
nasal_hash& ref=nasal_vm.gc_get(base_value_addr).get_hash();
|
||||||
|
int ret_mem_addr=ref.get_mem_address(node.get_str());
|
||||||
|
if(ret_mem_addr<0)
|
||||||
|
{
|
||||||
|
ref.add_elem(node.get_str(),nasal_vm.gc_alloc(vm_nil));
|
||||||
|
ret_mem_addr=ref.get_mem_address(node.get_str());
|
||||||
|
}
|
||||||
return ret_mem_addr;
|
return ret_mem_addr;
|
||||||
}
|
}
|
||||||
int nasal_runtime::nasal_scalar_add(int a_scalar_addr,int b_scalar_addr)
|
int nasal_runtime::nasal_scalar_add(int a_scalar_addr,int b_scalar_addr)
|
||||||
|
|
Loading…
Reference in New Issue