diff --git a/nasal_gc.h b/nasal_gc.h index 8b690d1..45082cd 100644 --- a/nasal_gc.h +++ b/nasal_gc.h @@ -304,6 +304,7 @@ struct nasal_gc nasal_val* val_stack[STACK_MAX_DEPTH]; nasal_val** stack_top; // stack top std::vector num_addrs; // reserved address for const vm_num + std::vector str_addrs; // reserved address for const vm_str std::vector slice_stack; // slice stack for vec[val,val,val:val] std::vector memory; // gc memory std::queue free_list; // gc free list @@ -311,7 +312,7 @@ struct nasal_gc std::vector > local; void mark(); void sweep(); - void gc_init(std::vector&); + void gc_init(std::vector&,std::vector&); void gc_clear(); nasal_val* gc_alloc(int); }; @@ -386,7 +387,7 @@ void nasal_gc::sweep() } return; } -void nasal_gc::gc_init(std::vector& nums) +void nasal_gc::gc_init(std::vector& nums,std::vector& strs) { for(int i=0;i<65536;++i) { @@ -409,13 +410,21 @@ void nasal_gc::gc_init(std::vector& nums) *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;iptr.num=nums[i]; num_addrs.push_back(tmp); } + + // init constant strings + for(int i=0;iptr.str=strs[i]; + str_addrs.push_back(tmp); + } return; } void nasal_gc::gc_clear() @@ -432,6 +441,13 @@ void nasal_gc::gc_clear() global.clear(); local.clear(); slice_stack.clear(); + + for(int i=0;i& nums, std::vector& exec) { - gc.gc_init(nums); + gc.gc_init(nums,strs); str_table=strs; // get constant strings & symbols exec_code=exec; // get bytecodes @@ -182,9 +182,7 @@ void nasal_vm::opr_pnil() } void nasal_vm::opr_pstr() { - nasal_val* val=gc.gc_alloc(vm_str); - *val->ptr.str=str_table[exec_code[pc].num]; - *(++stack_top)=val; + *(++stack_top)=gc.str_addrs[exec_code[pc].num]; return; } void nasal_vm::opr_newv() diff --git a/test/bp.nas b/test/bp.nas index 67304b9..81c6594 100644 --- a/test/bp.nas +++ b/test/bp.nas @@ -137,7 +137,7 @@ while(error>0.001) } cnt+=1; show+=1; - if(show==300) + if(show==250) { show=0; print('epoch ',cnt,':',error,'\r');