optimize test file & little update.

This commit is contained in:
ValKmjolnir 2022-02-06 19:55:45 +08:00
parent 92646840e4
commit 2a85e92d4a
5 changed files with 59 additions and 70 deletions

View File

@ -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_addeqc:case op_subeqc: case op_muleqc:case op_diveqc:
case op_lessc: case op_leqc: case op_grtc: case op_geqc: case op_lessc: case op_leqc: case op_grtc: case op_geqc:
case op_pnum: case op_pnum:
printf("0x%x (",c.num);std::cout<<num_res[c.num]<<")";break; printf("0x%x (",c.num);std::cout<<num_res[c.num]<<")\n";break;
case op_callvi:case op_newv: case op_callfv: case op_callvi:case op_newv: case op_callfv:
case op_intg: case op_intl: case op_intg: case op_intl:
case op_newf: case op_jmp: case op_jt: case op_jf: case op_newf: case op_jmp: case op_jt: case op_jf:
printf("0x%x",c.num);break; printf("0x%x\n",c.num);break;
case op_callb: case op_callb:
printf("0x%x <%s@0x%lx>",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_callg: case op_mcallg: case op_loadg:
case op_calll: case op_mcalll: case op_loadl: 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: 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_happ: case op_pstr:
case op_lnkc: case op_lnkeqc: case op_lnkc: case op_lnkeqc:
case op_callh: case op_mcallh: case op_callh: case op_mcallh:
case op_para: case op_defpara:case op_dynpara: case op_para: case op_defpara:case op_dynpara:
printf("0x%x (\"%s\")",c.num,rawstr(str_res[c.num]).c_str());break; printf("0x%x (\"%s\")\n",c.num,rawstr(str_res[c.num]).c_str());break;
default:break; default:printf("\n");break;
} }
printf("\n");
} }
void nasal_codegen::print() void nasal_codegen::print()

View File

@ -29,17 +29,17 @@ const uint32_t increment[vm_type_size]=
0, // vm_nil 0, // vm_nil
0, // vm_num 0, // vm_num
/* gc object */ /* gc object */
512, // vm_str 256, // vm_str
1024,// vm_func 512, // vm_func
4096,// vm_vec 1024,// vm_vec
256, // vm_hash 128, // vm_hash
16 // vm_obj 16 // vm_obj
}; };
struct nasal_vec; struct nasal_vec; // vector
struct nasal_hash; struct nasal_hash;// hashmap(dict)
struct nasal_func; struct nasal_func;// function(lambda)
struct nasal_obj; struct nasal_obj; // special objects
struct nasal_val; // nasal_val includes gc-managed types struct nasal_val; // nasal_val includes gc-managed types
struct nasal_ref struct nasal_ref
@ -126,7 +126,7 @@ struct nasal_val
{ {
uint8_t mark; uint8_t mark;
uint8_t type; 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 union
{ {
std::string* str; std::string* str;

View File

@ -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_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_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; 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) void nasal_vm::bytecodeinfo(const char* header,const uint32_t p)

View File

@ -149,95 +149,78 @@ var mandelbrot=
var paper=[]; var paper=[];
var (ptr,pc)=(0,0); 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 (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); setsize(paper,131072);
(ptr,code,inum,stack)=(0,[],[],[]);
var len=size(program); var len=size(program);
for(var i=0;i<len;i+=1){
for(var i=0;i<len;i+=1)
{
var c=chr(program[i]); var c=chr(program[i]);
if(c=='+' or c=='-') if(c=='+' or c=='-'){
{ append(code,add);
append(code,func_table[add]);
append(inum,0); append(inum,0);
for(;i<len;i+=1) for(;i<len;i+=1){
{
if(chr(program[i])=='+') if(chr(program[i])=='+')
inum[-1]+=1; inum[-1]+=1;
elsif(chr(program[i])=='-') elsif(chr(program[i])=='-')
inum[-1]-=1; inum[-1]-=1;
elsif(chr(program[i])!='\n') elsif(chr(program[i])!='\n'){
{
i-=1; i-=1;
break; break;
} }
} }
} }
elsif(c=='<' or c=='>') elsif(c=='<' or c=='>'){
{ append(code,mov);
append(code,func_table[mov]);
append(inum,0); append(inum,0);
for(;i<len;i+=1) for(;i<len;i+=1){
{
if(chr(program[i])=='>') if(chr(program[i])=='>')
inum[-1]+=1; inum[-1]+=1;
elsif(chr(program[i])=='<') elsif(chr(program[i])=='<')
inum[-1]-=1; inum[-1]-=1;
elsif(chr(program[i])!='\n') elsif(chr(program[i])!='\n'){
{
i-=1; i-=1;
break; break;
} }
} }
} }
elsif(c==',') elsif(c==','){
{ append(code,in);
append(code,func_table[in]);
append(inum,0); append(inum,0);
} }
elsif(c=='.') elsif(c=='.'){
{ append(code,out);
append(code,func_table[out]);
append(inum,0); append(inum,0);
} }
elsif(c=='[') elsif(c=='['){
{ append(code,jf);
append(code,func_table[jf]);
append(inum,0); append(inum,0);
append(stack,size(code)-1); append(stack,size(code)-1);
} }
elsif(c==']') elsif(c==']'){
{
if(!size(stack)) if(!size(stack))
die("lack ["); die("lack [");
var label=pop(stack); var label=pop(stack);
append(code,func_table[jt]); append(code,jt);
append(inum,label-1); append(inum,label-1);
inum[label]=size(code)-2; inum[label]=size(code)-2;
} }
} }
if(size(stack)) if(size(stack)){
{
die("lack ]"); die("lack ]");
return; return;
} }
len=size(code); len=size(code);
for(pc=0;pc<len;pc+=1) for(pc=0;pc<len;pc+=1){
code[pc](); var c=code[pc];
if(c==add) paper[ptr]+=inum[pc];
elsif(c==mov)ptr+=inum[pc];
elsif(c==jt){if(paper[ptr])pc=inum[pc];}
elsif(c==jf){if(!paper[ptr])pc=inum[pc];}
elsif(c==in) paper[ptr]=input()[0];
else print(chr(paper[ptr]));
}
return; return;
} }

View File

@ -7,25 +7,32 @@ for(;;)
} }
for(var i=1;;)break; for(var i=1;;)break;
for(var i=1;;i+=1)break; for(var i=1;;i+=1)break;
for(var i=1;i<10;i+=1)print(i); for(var i=1;i<10;i+=1)print(i,'\n');
while(1)break; while(1)break;
var j=0; var j=0;
while(j<10) while(j<10)
{ {
print(j); print(j,'\n');
j+=1; j+=1;
} }
forindex(var j;[0,1,2,3])print(j); forindex(var j;[0,1,2,3])print(j,'\n');
forindex(var j;[0,1,2,3]) forindex(var j;[0,1,2,3])
{ {
var a=j; var a=j;
print(a*a); print(a*a,'\n');
} }
foreach(var j;[0,1,2,3])print([0,1,2,3][j]); foreach(var j;[0,1,2,3])print([0,1,2,3][j],'\n');
foreach(var j;[0,1,2,3]) foreach(var j;[0,1,2,3])
{ {
var a=[0,1,2,3][j]; var a=[0,1,2,3][j];
print(a*a-1); print(a*a-1,'\n');
} }
var f=func(){
var x=0;
return func(){x+=1;};
}();
for(var i=0;i<4e6;i+=1)
f();