optimize test file & little update.
This commit is contained in:
parent
92646840e4
commit
2a85e92d4a
|
@ -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()
|
||||||
|
|
18
nasal_gc.h
18
nasal_gc.h
|
@ -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;
|
||||||
|
|
|
@ -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)
|
||||||
|
|
75
test/bf.nas
75
test/bf.nas
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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();
|
Loading…
Reference in New Issue