update
This commit is contained in:
parent
a7d6518bff
commit
1a233fbe15
22
nasal_gc.h
22
nasal_gc.h
|
@ -304,6 +304,7 @@ struct nasal_gc
|
||||||
nasal_val* val_stack[STACK_MAX_DEPTH];
|
nasal_val* val_stack[STACK_MAX_DEPTH];
|
||||||
nasal_val** stack_top; // stack top
|
nasal_val** stack_top; // stack top
|
||||||
std::vector<nasal_val*> num_addrs; // reserved address for const vm_num
|
std::vector<nasal_val*> num_addrs; // reserved address for const vm_num
|
||||||
|
std::vector<nasal_val*> str_addrs; // reserved address for const vm_str
|
||||||
std::vector<nasal_val*> slice_stack; // slice stack for vec[val,val,val:val]
|
std::vector<nasal_val*> slice_stack; // slice stack for vec[val,val,val:val]
|
||||||
std::vector<nasal_val*> memory; // gc memory
|
std::vector<nasal_val*> memory; // gc memory
|
||||||
std::queue <nasal_val*> free_list; // gc free list
|
std::queue <nasal_val*> free_list; // gc free list
|
||||||
|
@ -311,7 +312,7 @@ struct nasal_gc
|
||||||
std::vector<std::unordered_map<int,nasal_val*> > local;
|
std::vector<std::unordered_map<int,nasal_val*> > local;
|
||||||
void mark();
|
void mark();
|
||||||
void sweep();
|
void sweep();
|
||||||
void gc_init(std::vector<double>&);
|
void gc_init(std::vector<double>&,std::vector<std::string>&);
|
||||||
void gc_clear();
|
void gc_clear();
|
||||||
nasal_val* gc_alloc(int);
|
nasal_val* gc_alloc(int);
|
||||||
};
|
};
|
||||||
|
@ -386,7 +387,7 @@ void nasal_gc::sweep()
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
void nasal_gc::gc_init(std::vector<double>& nums)
|
void nasal_gc::gc_init(std::vector<double>& nums,std::vector<std::string>& strs)
|
||||||
{
|
{
|
||||||
for(int i=0;i<65536;++i)
|
for(int i=0;i<65536;++i)
|
||||||
{
|
{
|
||||||
|
@ -409,13 +410,21 @@ void nasal_gc::gc_init(std::vector<double>& nums)
|
||||||
|
|
||||||
*val_stack=nil_addr; // the first space will not store any values,but gc checks
|
*val_stack=nil_addr; // the first space will not store any values,but gc checks
|
||||||
|
|
||||||
num_addrs.clear(); // init constant numbers
|
// init constant numbers
|
||||||
for(int i=0;i<nums.size();++i)
|
for(int i=0;i<nums.size();++i)
|
||||||
{
|
{
|
||||||
nasal_val* tmp=new nasal_val(vm_num);
|
nasal_val* tmp=new nasal_val(vm_num);
|
||||||
tmp->ptr.num=nums[i];
|
tmp->ptr.num=nums[i];
|
||||||
num_addrs.push_back(tmp);
|
num_addrs.push_back(tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// init constant strings
|
||||||
|
for(int i=0;i<strs.size();++i)
|
||||||
|
{
|
||||||
|
nasal_val* tmp=new nasal_val(vm_str);
|
||||||
|
*tmp->ptr.str=strs[i];
|
||||||
|
str_addrs.push_back(tmp);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
void nasal_gc::gc_clear()
|
void nasal_gc::gc_clear()
|
||||||
|
@ -432,6 +441,13 @@ void nasal_gc::gc_clear()
|
||||||
global.clear();
|
global.clear();
|
||||||
local.clear();
|
local.clear();
|
||||||
slice_stack.clear();
|
slice_stack.clear();
|
||||||
|
|
||||||
|
for(int i=0;i<num_addrs.size();++i)
|
||||||
|
delete num_addrs[i];
|
||||||
|
num_addrs.clear();
|
||||||
|
for(int i=0;i<str_addrs.size();++i)
|
||||||
|
delete str_addrs[i];
|
||||||
|
str_addrs.clear();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
nasal_val* nasal_gc::gc_alloc(int type)
|
nasal_val* nasal_gc::gc_alloc(int type)
|
||||||
|
|
|
@ -98,7 +98,7 @@ void nasal_vm::init(
|
||||||
std::vector<double>& nums,
|
std::vector<double>& nums,
|
||||||
std::vector<opcode>& exec)
|
std::vector<opcode>& exec)
|
||||||
{
|
{
|
||||||
gc.gc_init(nums);
|
gc.gc_init(nums,strs);
|
||||||
str_table=strs; // get constant strings & symbols
|
str_table=strs; // get constant strings & symbols
|
||||||
exec_code=exec; // get bytecodes
|
exec_code=exec; // get bytecodes
|
||||||
|
|
||||||
|
@ -182,9 +182,7 @@ void nasal_vm::opr_pnil()
|
||||||
}
|
}
|
||||||
void nasal_vm::opr_pstr()
|
void nasal_vm::opr_pstr()
|
||||||
{
|
{
|
||||||
nasal_val* val=gc.gc_alloc(vm_str);
|
*(++stack_top)=gc.str_addrs[exec_code[pc].num];
|
||||||
*val->ptr.str=str_table[exec_code[pc].num];
|
|
||||||
*(++stack_top)=val;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
void nasal_vm::opr_newv()
|
void nasal_vm::opr_newv()
|
||||||
|
|
|
@ -137,7 +137,7 @@ while(error>0.001)
|
||||||
}
|
}
|
||||||
cnt+=1;
|
cnt+=1;
|
||||||
show+=1;
|
show+=1;
|
||||||
if(show==300)
|
if(show==250)
|
||||||
{
|
{
|
||||||
show=0;
|
show=0;
|
||||||
print('epoch ',cnt,':',error,'\r');
|
print('epoch ',cnt,':',error,'\r');
|
||||||
|
|
Loading…
Reference in New Issue