From 2a85e92d4af4fb0f8615d1898e0d455f03d07ff1 Mon Sep 17 00:00:00 2001 From: ValKmjolnir Date: Sun, 6 Feb 2022 19:55:45 +0800 Subject: [PATCH] optimize test file & little update. --- nasal_codegen.h | 15 +++++----- nasal_gc.h | 18 ++++++------ nasal_vm.h | 2 +- test/bf.nas | 75 +++++++++++++++++++------------------------------ test/loop.nas | 19 +++++++++---- 5 files changed, 59 insertions(+), 70 deletions(-) diff --git a/nasal_codegen.h b/nasal_codegen.h index dd96687..1728772 100644 --- a/nasal_codegen.h +++ b/nasal_codegen.h @@ -1160,26 +1160,25 @@ void nasal_codegen::print_op(uint32_t index) case op_addeqc:case op_subeqc: case op_muleqc:case op_diveqc: case op_lessc: case op_leqc: case op_grtc: case op_geqc: case op_pnum: - printf("0x%x (",c.num);std::cout<",c.num,builtin[c.num].name,(uint64_t)builtin[c.num].func);break; + printf("0x%x <%s@0x%lx>\n",c.num,builtin[c.num].name,(uint64_t)builtin[c.num].func);break; case op_callg: case op_mcallg: case op_loadg: case op_calll: case op_mcalll: case op_loadl: - printf("0x%x",c.num);break; + printf("0x%x\n",c.num);break; case op_upval:case op_mupval: case op_loadu: - printf("0x%x[0x%x]",(c.num>>16)&0xffff,c.num&0xffff);break; + printf("0x%x[0x%x]\n",(c.num>>16)&0xffff,c.num&0xffff);break; case op_happ: case op_pstr: case op_lnkc: case op_lnkeqc: case op_callh: case op_mcallh: case op_para: case op_defpara:case op_dynpara: - printf("0x%x (\"%s\")",c.num,rawstr(str_res[c.num]).c_str());break; - default:break; + printf("0x%x (\"%s\")\n",c.num,rawstr(str_res[c.num]).c_str());break; + default:printf("\n");break; } - printf("\n"); } void nasal_codegen::print() diff --git a/nasal_gc.h b/nasal_gc.h index d9a239c..cfb268d 100644 --- a/nasal_gc.h +++ b/nasal_gc.h @@ -29,17 +29,17 @@ const uint32_t increment[vm_type_size]= 0, // vm_nil 0, // vm_num /* gc object */ - 512, // vm_str - 1024,// vm_func - 4096,// vm_vec - 256, // vm_hash + 256, // vm_str + 512, // vm_func + 1024,// vm_vec + 128, // vm_hash 16 // vm_obj }; -struct nasal_vec; -struct nasal_hash; -struct nasal_func; -struct nasal_obj; +struct nasal_vec; // vector +struct nasal_hash;// hashmap(dict) +struct nasal_func;// function(lambda) +struct nasal_obj; // special objects struct nasal_val; // nasal_val includes gc-managed types struct nasal_ref @@ -126,7 +126,7 @@ struct nasal_val { uint8_t mark; uint8_t type; - uint8_t unmut; // used toe mark if a string is mutable + uint8_t unmut; // used to mark if a string is unmutable union { std::string* str; diff --git a/nasal_vm.h b/nasal_vm.h index e9cc42e..f166312 100644 --- a/nasal_vm.h +++ b/nasal_vm.h @@ -147,7 +147,7 @@ void nasal_vm::valinfo(nasal_ref& val) case vm_vec: printf("| vec | <0x%lx> [%lu val]\n",(uint64_t)p,val.vec()->elems.size());break; case vm_hash: printf("| hash | <0x%lx> {%lu val}\n",(uint64_t)p,val.hash()->elems.size());break; case vm_obj: printf("| obj | <0x%lx> obj:0x%lx\n",(uint64_t)p,(uint64_t)val.obj()->ptr);break; - default: printf("| ??? | <0x%lx>\n",(uint64_t)p);break; + default: printf("| err | <0x%lx> unknown object\n",(uint64_t)p);break; } } void nasal_vm::bytecodeinfo(const char* header,const uint32_t p) diff --git a/test/bf.nas b/test/bf.nas index b7b7bb3..cf65ad7 100644 --- a/test/bf.nas +++ b/test/bf.nas @@ -149,95 +149,78 @@ var mandelbrot= var paper=[]; var (ptr,pc)=(0,0); -var (code,inum,stack)=(nil,nil,nil); +var (code,inum,stack)=([],[],[]); var (add,mov,jt,jf,in,out)=(0,1,2,3,4,5); -var func_table=[ - func paper[ptr]+=inum[pc], - func ptr+=inum[pc], - func if(paper[ptr])pc=inum[pc], - func if(!paper[ptr])pc=inum[pc], - func paper[ptr]=input()[0], - func print(chr(paper[ptr])) -]; -var bf=func(program) -{ +var bf=func(program){ setsize(paper,131072); - (ptr,code,inum,stack)=(0,[],[],[]); var len=size(program); - - for(var i=0;i') - { - append(code,func_table[mov]); + elsif(c=='<' or c=='>'){ + append(code,mov); append(inum,0); - for(;i') inum[-1]+=1; elsif(chr(program[i])=='<') inum[-1]-=1; - elsif(chr(program[i])!='\n') - { + elsif(chr(program[i])!='\n'){ i-=1; break; } } } - elsif(c==',') - { - append(code,func_table[in]); + elsif(c==','){ + append(code,in); append(inum,0); } - elsif(c=='.') - { - append(code,func_table[out]); + elsif(c=='.'){ + append(code,out); append(inum,0); } - elsif(c=='[') - { - append(code,func_table[jf]); + elsif(c=='['){ + append(code,jf); append(inum,0); append(stack,size(code)-1); } - elsif(c==']') - { + elsif(c==']'){ if(!size(stack)) die("lack ["); var label=pop(stack); - append(code,func_table[jt]); + append(code,jt); append(inum,label-1); inum[label]=size(code)-2; } } - if(size(stack)) - { + if(size(stack)){ die("lack ]"); return; } - len=size(code); - for(pc=0;pc