This commit is contained in:
Valk Richard Li 2021-04-12 13:21:13 +08:00
parent a7d6518bff
commit 1a233fbe15
3 changed files with 22 additions and 8 deletions

View File

@ -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)

View File

@ -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()

View File

@ -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');