📝 optimize codes

This commit is contained in:
ValKmjolnir 2022-08-01 22:51:19 +08:00
parent 04a45064c8
commit 44bfd74ca9
3 changed files with 28 additions and 92 deletions

View File

@ -76,7 +76,7 @@ const char* ast_name[]=
"func", "func",
"hash", "hash",
"vec", "vec",
"hashmember", "pair",
"call", "call",
"callh", "callh",
"callv", "callv",

View File

@ -827,7 +827,6 @@ nas_ref builtin_readln(nas_ref* local,nasal_gc& gc)
if(!fd.objchk(nas_obj::file)) if(!fd.objchk(nas_obj::file))
return builtin_err("readln","not a valid filehandle"); return builtin_err("readln","not a valid filehandle");
nas_ref str=gc.alloc(vm_str); nas_ref str=gc.alloc(vm_str);
auto& s=str.str();
char c; char c;
while((c=fgetc((FILE*)fd.obj().ptr))!=EOF) while((c=fgetc((FILE*)fd.obj().ptr))!=EOF)
{ {
@ -835,9 +834,9 @@ nas_ref builtin_readln(nas_ref* local,nasal_gc& gc)
continue; continue;
if(c=='\n') if(c=='\n')
return str; return str;
s+=c; str.str()+=c;
} }
if(s.length()) if(str.str().length())
return str; return str;
return nil; return nil;
} }
@ -998,8 +997,7 @@ nas_ref builtin_waitpid(nas_ref* local,nasal_gc& gc)
if(pid.type!=vm_num || nohang.type!=vm_num) if(pid.type!=vm_num || nohang.type!=vm_num)
return builtin_err("waitpid","pid and nohang must be number"); return builtin_err("waitpid","pid and nohang must be number");
#ifndef _WIN32 #ifndef _WIN32
i32 ret_pid; i32 ret_pid,status;
i32 status;
ret_pid=waitpid(pid.num(),&status,nohang.num()==0?0:WNOHANG); ret_pid=waitpid(pid.num(),&status,nohang.num()==0?0:WNOHANG);
nas_ref vec=gc.alloc(vm_vec); nas_ref vec=gc.alloc(vm_vec);
vec.vec().elems.push_back({vm_num,(f64)ret_pid}); vec.vec().elems.push_back({vm_num,(f64)ret_pid});
@ -1075,14 +1073,10 @@ nas_ref builtin_chdir(nas_ref* local,nasal_gc& gc)
} }
nas_ref builtin_environ(nas_ref* local,nasal_gc& gc) nas_ref builtin_environ(nas_ref* local,nasal_gc& gc)
{ {
char** env=environ;
nas_ref res=gc.temp=gc.alloc(vm_vec); nas_ref res=gc.temp=gc.alloc(vm_vec);
auto& vec=res.vec().elems; auto& vec=res.vec().elems;
while(*env) for(char** env=environ;*env;++env)
{
vec.push_back(gc.newstr(*env)); vec.push_back(gc.newstr(*env));
++env;
}
gc.temp=nil; gc.temp=nil;
return res; return res;
} }
@ -1167,12 +1161,12 @@ nas_ref builtin_dlclose(nas_ref* local,nasal_gc& gc)
} }
nas_ref builtin_dlcall(nas_ref* local,nasal_gc& gc) nas_ref builtin_dlcall(nas_ref* local,nasal_gc& gc)
{ {
nas_ref funcptr=local[1]; nas_ref fp=local[1];
nas_ref args=local[2]; nas_ref args=local[2];
if(!funcptr.objchk(nas_obj::faddr)) if(!fp.objchk(nas_obj::faddr))
return builtin_err("dlcall","\"funcptr\" is not a valid function pointer"); return builtin_err("dlcall","\"funcptr\" is not a valid function pointer");
typedef nas_ref (*externs)(std::vector<nas_ref>&,nasal_gc&); typedef nas_ref (*externs)(std::vector<nas_ref>&,nasal_gc&);
externs func=(externs)funcptr.obj().ptr; externs func=(externs)fp.obj().ptr;
return func(args.vec().elems,gc); return func(args.vec().elems,gc);
} }
nas_ref builtin_platform(nas_ref* local,nasal_gc& gc) nas_ref builtin_platform(nas_ref* local,nasal_gc& gc)
@ -1353,9 +1347,7 @@ nas_ref builtin_costatus(nas_ref* local,nasal_gc& gc)
} }
nas_ref builtin_corun(nas_ref* local,nasal_gc& gc) nas_ref builtin_corun(nas_ref* local,nasal_gc& gc)
{ {
if(gc.cort) return gc.cort?one:zero;
return one;
return zero;
} }
nas_ref builtin_millisec(nas_ref* local,nasal_gc& gc) nas_ref builtin_millisec(nas_ref* local,nasal_gc& gc)
{ {

View File

@ -82,81 +82,25 @@ enum op_code:u8
const char* code_table[]= const char* code_table[]=
{ {
"exit ", "exit ","intg ","intl ","loadg ",
"intg ", "loadl ","loadu ","pnum ","pnil ",
"intl ", "pstr ","newv ","newh ","newf ",
"loadg ", "happ ","para ","def ","dyn ",
"loadl ", "not ","usub ","add ","sub ",
"loadu ", "mult ","div ","lnk ","addc ",
"pnum ", "subc ","multc ","divc ","lnkc ",
"pnil ", "addeq ","subeq ","muleq ","diveq ",
"pstr ", "lnkeq ","addeqc","subeqc","muleqc",
"newv ", "diveqc","lnkeqc","meq ","eq ",
"newh ", "neq ","less ","leq ","grt ",
"newf ", "geq ","lessc ","leqc ","grtc ",
"happ ", "geqc ","pop ","jmp ","jt ",
"para ", "jf ","cnt ","findx ","feach ",
"def ", "callg ","calll ","upval ","callv ",
"dyn ", "callvi","callh ","callfv","callfh",
"not ", "callb ","slcbeg","slcend","slc ",
"usub ", "slc2 ","mcallg","mcalll","mupval",
"add ", "mcallv","mcallh","ret "
"sub ",
"mult ",
"div ",
"lnk ",
"addc ",
"subc ",
"multc ",
"divc ",
"lnkc ",
"addeq ",
"subeq ",
"muleq ",
"diveq ",
"lnkeq ",
"addeqc",
"subeqc",
"muleqc",
"diveqc",
"lnkeqc",
"meq ",
"eq ",
"neq ",
"less ",
"leq ",
"grt ",
"geq ",
"lessc ",
"leqc ",
"grtc ",
"geqc ",
"pop ",
"jmp ",
"jt ",
"jf ",
"cnt ",
"findx ",
"feach ",
"callg ",
"calll ",
"upval ",
"callv ",
"callvi",
"callh ",
"callfv",
"callfh",
"callb ",
"slcbeg",
"slcend",
"slc ",
"slc2 ",
"mcallg",
"mcalll",
"mupval",
"mcallv",
"mcallh",
"ret "
}; };
struct opcode struct opcode