🚀 optimize code

This commit is contained in:
ValKmjolnir 2022-11-06 18:20:10 +08:00
parent 1ced201cb5
commit 4fd69c6ce4
12 changed files with 212 additions and 113 deletions

11
lib.nas
View File

@ -268,13 +268,10 @@ var assert=func(condition,message="assertion failed!"){
# get time stamp, this will return a timestamp object # get time stamp, this will return a timestamp object
var maketimestamp=func(){ var maketimestamp=func(){
var t=0; var t=0;
var millisec=func(){
return __millisec;
}
return { return {
stamp:func(){t=millisec();}, stamp:func(){t=__millisec();},
elapsedMSec:func(){return millisec()-t;}, elapsedMSec:func(){return __millisec()-t;},
elapsedUSec:func(){return (millisec()-t)*1000;} elapsedUSec:func(){return (__millisec()-t)*1000;}
}; };
} }
@ -455,7 +452,7 @@ var dylib=
# close dynamic lib, this operation will make all the symbols loaded from it invalid. # close dynamic lib, this operation will make all the symbols loaded from it invalid.
dlclose: func(lib){return __dlclose; }, dlclose: func(lib){return __dlclose; },
# call the loaded symbol. # call the loaded symbol.
dlcall: func(funcptr,args...){return __dlcall} dlcall: func(ptr,args...){return __dlcall}
}; };
# os is used to use or get some os-related info/functions. # os is used to use or get some os-related info/functions.

View File

@ -15,17 +15,17 @@ SRC=\
nasal_dbg.h\ nasal_dbg.h\
nasal.h nasal.h
STD=14 STD=c++14
nasal:$(SRC) nasal:$(SRC)
$(CXX) -std=c++$(STD) -O3 main.cpp -o nasal -fno-exceptions -ldl -Wshadow -Wall $(CXX) -std=$(STD) -O3 main.cpp -o nasal -fno-exceptions -ldl -Wshadow -Wall
nasal.exe:$(SRC) nasal.exe:$(SRC)
$(CXX) -std=c++$(STD) -O3 main.cpp -o nasal.exe -fno-exceptions -Wshadow -Wall -static $(CXX) -std=$(STD) -O3 main.cpp -o nasal.exe -fno-exceptions -Wshadow -Wall -static
stable-release:$(SRC) stable-release:$(SRC)
$(CXX) -std=c++$(STD) -O2 main.cpp -o nasal -fno-exceptions -ldl -Wshadow -Wall $(CXX) -std=$(STD) -O2 main.cpp -o nasal -fno-exceptions -ldl -Wshadow -Wall
stable-release-mingw:$(SRC) stable-release-mingw:$(SRC)
$(CXX) -std=c++$(STD) -O2 main.cpp -o nasal.exe -fno-exceptions -Wshadow -Wall -static $(CXX) -std=$(STD) -O2 main.cpp -o nasal.exe -fno-exceptions -Wshadow -Wall -static
clean: clean:
-@ rm ./nasal -@ rm ./nasal
@ -42,6 +42,7 @@ test:nasal
@ ./nasal -o -d test/calc.nas @ ./nasal -o -d test/calc.nas
@ ./nasal -o -e test/choice.nas @ ./nasal -o -e test/choice.nas
@ ./nasal -o -e test/class.nas @ ./nasal -o -e test/class.nas
@ ./nasal -o -t -d test/console3D.nas
@ ./nasal -o -e test/coroutine.nas @ ./nasal -o -e test/coroutine.nas
@ ./nasal -o -e test/diff.nas @ ./nasal -o -e test/diff.nas
@ ./nasal -o -e test/donuts.nas @ ./nasal -o -e test/donuts.nas

View File

@ -3,38 +3,38 @@
dynamic_libs=libfib.so libkey.so libnasock.so dynamic_libs=libfib.so libkey.so libnasock.so
dynamic_libs_dll=libfib.dll libkey.dll libnasock.dll dynamic_libs_dll=libfib.dll libkey.dll libnasock.dll
STD=14 STD=c++14
libfib.so: fib.cpp libfib.so: fib.cpp
@ echo "[build] libfib.so" @ echo "[Compiling] libfib.so"
@ $(CXX) -std=c++$(STD) -c -O3 fib.cpp -fPIC -o fib.o @ $(CXX) -std=$(STD) -c -O3 fib.cpp -fPIC -o fib.o
@ $(CXX) -shared -o libfib.so fib.o @ $(CXX) -shared -o libfib.so fib.o
@ rm fib.o @ rm fib.o
libfib.dll: fib.cpp libfib.dll: fib.cpp
@ echo [build] libfib.dll @ echo [Compiling] libfib.dll
@ $(CXX) -std=c++$(STD) -c -O3 fib.cpp -fPIC -o fib.o @ $(CXX) -std=$(STD) -c -O3 fib.cpp -fPIC -o fib.o
@ $(CXX) -shared -o libfib.dll fib.o @ $(CXX) -shared -o libfib.dll fib.o
@ del fib.o @ del fib.o
libkey.so: keyboard.cpp libkey.so: keyboard.cpp
@ echo "[build] libkey.so" @ echo "[Compiling] libkey.so"
@ $(CXX) -std=c++$(STD) -c -O3 keyboard.cpp -fPIC -o keyboard.o @ $(CXX) -std=$(STD) -c -O3 keyboard.cpp -fPIC -o keyboard.o
@ $(CXX) -shared -o libkey.so keyboard.o @ $(CXX) -shared -o libkey.so keyboard.o
@ rm keyboard.o @ rm keyboard.o
libkey.dll: keyboard.cpp libkey.dll: keyboard.cpp
@ echo [build] libkey.dll @ echo [Compiling] libkey.dll
@ $(CXX) -std=c++$(STD) -c -O3 keyboard.cpp -fPIC -o keyboard.o -static @ $(CXX) -std=$(STD) -c -O3 keyboard.cpp -fPIC -o keyboard.o -static
@ $(CXX) -shared -o libkey.dll keyboard.o -static @ $(CXX) -shared -o libkey.dll keyboard.o -static
@ del keyboard.o @ del keyboard.o
libnasock.so: nasocket.cpp libnasock.so: nasocket.cpp
@ echo "[build] libnasock.so" @ echo "[Compiling] libnasock.so"
@ $(CXX) -std=c++$(STD) -c -O3 nasocket.cpp -fPIC -o nasocket.o @ $(CXX) -std=$(STD) -c -O3 nasocket.cpp -fPIC -o nasocket.o
@ $(CXX) -shared -o libnasock.so nasocket.o @ $(CXX) -shared -o libnasock.so nasocket.o
@ rm nasocket.o @ rm nasocket.o
libnasock.dll: nasocket.cpp libnasock.dll: nasocket.cpp
@ echo [build] libnasock.dll @ echo [Compiling] libnasock.dll
@ $(CXX) -std=c++$(STD) -c -O3 nasocket.cpp -fPIC -o nasocket.o -lwsock32 -static @ $(CXX) -std=$(STD) -c -O3 nasocket.cpp -fPIC -o nasocket.o -lwsock32 -static
@ $(CXX) -shared -o libnasock.dll nasocket.o -lwsock32 -static @ $(CXX) -shared -o libnasock.dll nasocket.o -lwsock32 -static
@ del nasocket.o @ del nasocket.o
@ -45,6 +45,6 @@ clean:
-@ rm $(dynamic_libs_dll) -@ rm $(dynamic_libs_dll)
all: libfib.so libkey.so libnasock.so all: libfib.so libkey.so libnasock.so
@ echo "[build] done" @ echo "[Compiling] done"
mingw-all: libfib.dll libkey.dll libnasock.dll winall: libfib.dll libkey.dll libnasock.dll
@ echo [build] done @ echo [Compiling] done

View File

@ -37,6 +37,7 @@ var builtin_print(var* local,gc& ngc)
std::cout<<std::flush; std::cout<<std::flush;
return nil; return nil;
} }
var builtin_println(var* local,gc& ngc) var builtin_println(var* local,gc& ngc)
{ {
for(auto& i:local[1].vec().elems) for(auto& i:local[1].vec().elems)
@ -44,16 +45,19 @@ var builtin_println(var* local,gc& ngc)
std::cout<<std::endl; std::cout<<std::endl;
return nil; return nil;
} }
var builtin_exit(var* local,gc& ngc) var builtin_exit(var* local,gc& ngc)
{ {
std::exit(local[1].num()); std::exit(local[1].num());
return nil; return nil;
} }
var builtin_abort(var* local,gc& ngc) var builtin_abort(var* local,gc& ngc)
{ {
std::abort(); std::abort();
return nil; return nil;
} }
var builtin_append(var* local,gc& ngc) var builtin_append(var* local,gc& ngc)
{ {
var vec=local[1]; var vec=local[1];
@ -65,6 +69,7 @@ var builtin_append(var* local,gc& ngc)
v.push_back(i); v.push_back(i);
return nil; return nil;
} }
var builtin_setsize(var* local,gc& ngc) var builtin_setsize(var* local,gc& ngc)
{ {
var vec=local[1]; var vec=local[1];
@ -76,6 +81,7 @@ var builtin_setsize(var* local,gc& ngc)
vec.vec().elems.resize((i64)size.num(),nil); vec.vec().elems.resize((i64)size.num(),nil);
return nil; return nil;
} }
var builtin_system(var* local,gc& ngc) var builtin_system(var* local,gc& ngc)
{ {
var str=local[1]; var str=local[1];
@ -83,6 +89,7 @@ var builtin_system(var* local,gc& ngc)
return {vm_num,(f64)-1}; return {vm_num,(f64)-1};
return {vm_num,(f64)system(str.str().c_str())}; return {vm_num,(f64)system(str.str().c_str())};
} }
var builtin_input(var* local,gc& ngc) var builtin_input(var* local,gc& ngc)
{ {
var end=local[1]; var end=local[1];
@ -93,6 +100,7 @@ var builtin_input(var* local,gc& ngc)
std::getline(std::cin,ret.str(),end.str()[0]); std::getline(std::cin,ret.str(),end.str()[0]);
return ret; return ret;
} }
var builtin_fin(var* local,gc& ngc) var builtin_fin(var* local,gc& ngc)
{ {
var val=local[1]; var val=local[1];
@ -104,6 +112,7 @@ var builtin_fin(var* local,gc& ngc)
rd<<in.rdbuf(); rd<<in.rdbuf();
return ngc.newstr(rd.str()); return ngc.newstr(rd.str());
} }
var builtin_fout(var* local,gc& ngc) var builtin_fout(var* local,gc& ngc)
{ {
var val=local[1]; var val=local[1];
@ -116,6 +125,7 @@ var builtin_fout(var* local,gc& ngc)
out<<str; out<<str;
return nil; return nil;
} }
var builtin_split(var* local,gc& ngc) var builtin_split(var* local,gc& ngc)
{ {
var delimeter=local[1]; var delimeter=local[1];
@ -151,6 +161,7 @@ var builtin_split(var* local,gc& ngc)
ngc.temp=nil; ngc.temp=nil;
return res; return res;
} }
var builtin_rand(var* local,gc& ngc) var builtin_rand(var* local,gc& ngc)
{ {
var val=local[1]; var val=local[1];
@ -166,6 +177,7 @@ var builtin_rand(var* local,gc& ngc)
num=(num+rand())*(1.0/(RAND_MAX+1.0)); num=(num+rand())*(1.0/(RAND_MAX+1.0));
return {vm_num,num}; return {vm_num,num};
} }
var builtin_id(var* local,gc& ngc) var builtin_id(var* local,gc& ngc)
{ {
var val=local[1]; var val=local[1];
@ -175,6 +187,7 @@ var builtin_id(var* local,gc& ngc)
ss<<"x"<<std::hex<<(u64)val.val.gcobj<<std::dec; ss<<"x"<<std::hex<<(u64)val.val.gcobj<<std::dec;
return ngc.newstr(ss.str()); return ngc.newstr(ss.str());
} }
var builtin_int(var* local,gc& ngc) var builtin_int(var* local,gc& ngc)
{ {
var val=local[1]; var val=local[1];
@ -182,11 +195,13 @@ var builtin_int(var* local,gc& ngc)
return nil; return nil;
return {vm_num,f64((i32)val.tonum())}; return {vm_num,f64((i32)val.tonum())};
} }
var builtin_floor(var* local,gc& ngc) var builtin_floor(var* local,gc& ngc)
{ {
var val=local[1]; var val=local[1];
return {vm_num,std::floor(val.num())}; return {vm_num,std::floor(val.num())};
} }
var builtin_num(var* local,gc& ngc) var builtin_num(var* local,gc& ngc)
{ {
var val=local[1]; var val=local[1];
@ -199,6 +214,7 @@ var builtin_num(var* local,gc& ngc)
return nil; return nil;
return {vm_num,res}; return {vm_num,res};
} }
var builtin_pop(var* local,gc& ngc) var builtin_pop(var* local,gc& ngc)
{ {
var val=local[1]; var val=local[1];
@ -213,10 +229,12 @@ var builtin_pop(var* local,gc& ngc)
} }
return nil; return nil;
} }
var builtin_str(var* local,gc& ngc) var builtin_str(var* local,gc& ngc)
{ {
return ngc.newstr(local[1].tostr()); return ngc.newstr(local[1].tostr());
} }
var builtin_size(var* local,gc& ngc) var builtin_size(var* local,gc& ngc)
{ {
var val=local[1]; var val=local[1];
@ -230,46 +248,57 @@ var builtin_size(var* local,gc& ngc)
} }
return {vm_num,num}; return {vm_num,num};
} }
var builtin_i32xor(var* local,gc& ngc) var builtin_i32xor(var* local,gc& ngc)
{ {
return {vm_num,(f64)(i32(local[1].num())^i32(local[2].num()))}; return {vm_num,(f64)(i32(local[1].num())^i32(local[2].num()))};
} }
var builtin_i32and(var* local,gc& ngc) var builtin_i32and(var* local,gc& ngc)
{ {
return {vm_num,(f64)(i32(local[1].num())&i32(local[2].num()))}; return {vm_num,(f64)(i32(local[1].num())&i32(local[2].num()))};
} }
var builtin_i32or(var* local,gc& ngc) var builtin_i32or(var* local,gc& ngc)
{ {
return {vm_num,(f64)(i32(local[1].num())|i32(local[2].num()))}; return {vm_num,(f64)(i32(local[1].num())|i32(local[2].num()))};
} }
var builtin_i32nand(var* local,gc& ngc) var builtin_i32nand(var* local,gc& ngc)
{ {
return {vm_num,(f64)(~(i32(local[1].num())&i32(local[2].num())))}; return {vm_num,(f64)(~(i32(local[1].num())&i32(local[2].num())))};
} }
var builtin_i32not(var* local,gc& ngc) var builtin_i32not(var* local,gc& ngc)
{ {
return {vm_num,(f64)(~i32(local[1].num()))}; return {vm_num,(f64)(~i32(local[1].num()))};
} }
var builtin_u32xor(var* local,gc& ngc) var builtin_u32xor(var* local,gc& ngc)
{ {
return {vm_num,(f64)(u32(local[1].num())^u32(local[2].num()))}; return {vm_num,(f64)(u32(local[1].num())^u32(local[2].num()))};
} }
var builtin_u32and(var* local,gc& ngc) var builtin_u32and(var* local,gc& ngc)
{ {
return {vm_num,(f64)(u32(local[1].num())&u32(local[2].num()))}; return {vm_num,(f64)(u32(local[1].num())&u32(local[2].num()))};
} }
var builtin_u32or(var* local,gc& ngc) var builtin_u32or(var* local,gc& ngc)
{ {
return {vm_num,(f64)(u32(local[1].num())|u32(local[2].num()))}; return {vm_num,(f64)(u32(local[1].num())|u32(local[2].num()))};
} }
var builtin_u32nand(var* local,gc& ngc) var builtin_u32nand(var* local,gc& ngc)
{ {
return {vm_num,(f64)(u32)(~(u32(local[1].num())&u32(local[2].num())))}; return {vm_num,(f64)(u32)(~(u32(local[1].num())&u32(local[2].num())))};
} }
var builtin_u32not(var* local,gc& ngc) var builtin_u32not(var* local,gc& ngc)
{ {
return {vm_num,(f64)(u32)(~u32(local[1].num()))}; return {vm_num,(f64)(u32)(~u32(local[1].num()))};
} }
var builtin_pow(var* local,gc& ngc) var builtin_pow(var* local,gc& ngc)
{ {
var x=local[1]; var x=local[1];
@ -278,41 +307,49 @@ var builtin_pow(var* local,gc& ngc)
return {vm_num,std::nan("")}; return {vm_num,std::nan("")};
return {vm_num,std::pow(x.num(),y.num())}; return {vm_num,std::pow(x.num(),y.num())};
} }
var builtin_sin(var* local,gc& ngc) var builtin_sin(var* local,gc& ngc)
{ {
var val=local[1]; var val=local[1];
return {vm_num,val.type==vm_num?sin(val.num()):std::nan("")}; return {vm_num,val.type==vm_num?sin(val.num()):std::nan("")};
} }
var builtin_cos(var* local,gc& ngc) var builtin_cos(var* local,gc& ngc)
{ {
var val=local[1]; var val=local[1];
return {vm_num,val.type==vm_num?cos(val.num()):std::nan("")}; return {vm_num,val.type==vm_num?cos(val.num()):std::nan("")};
} }
var builtin_tan(var* local,gc& ngc) var builtin_tan(var* local,gc& ngc)
{ {
var val=local[1]; var val=local[1];
return {vm_num,val.type==vm_num?tan(val.num()):std::nan("")}; return {vm_num,val.type==vm_num?tan(val.num()):std::nan("")};
} }
var builtin_exp(var* local,gc& ngc) var builtin_exp(var* local,gc& ngc)
{ {
var val=local[1]; var val=local[1];
return {vm_num,val.type==vm_num?exp(val.num()):std::nan("")}; return {vm_num,val.type==vm_num?exp(val.num()):std::nan("")};
} }
var builtin_lg(var* local,gc& ngc) var builtin_lg(var* local,gc& ngc)
{ {
var val=local[1]; var val=local[1];
return {vm_num,val.type==vm_num?log(val.num())/log(10.0):std::nan("")}; return {vm_num,val.type==vm_num?log(val.num())/log(10.0):std::nan("")};
} }
var builtin_ln(var* local,gc& ngc) var builtin_ln(var* local,gc& ngc)
{ {
var val=local[1]; var val=local[1];
return {vm_num,val.type==vm_num?log(val.num()):std::nan("")}; return {vm_num,val.type==vm_num?log(val.num()):std::nan("")};
} }
var builtin_sqrt(var* local,gc& ngc) var builtin_sqrt(var* local,gc& ngc)
{ {
var val=local[1]; var val=local[1];
return {vm_num,val.type==vm_num?sqrt(val.num()):std::nan("")}; return {vm_num,val.type==vm_num?sqrt(val.num()):std::nan("")};
} }
var builtin_atan2(var* local,gc& ngc) var builtin_atan2(var* local,gc& ngc)
{ {
var x=local[1]; var x=local[1];
@ -321,11 +358,13 @@ var builtin_atan2(var* local,gc& ngc)
return {vm_num,std::nan("")}; return {vm_num,std::nan("")};
return {vm_num,atan2(y.num(),x.num())}; return {vm_num,atan2(y.num(),x.num())};
} }
var builtin_isnan(var* local,gc& ngc) var builtin_isnan(var* local,gc& ngc)
{ {
var x=local[1]; var x=local[1];
return (x.type==vm_num && std::isnan(x.num()))?one:zero; return (x.type==vm_num && std::isnan(x.num()))?one:zero;
} }
var builtin_time(var* local,gc& ngc) var builtin_time(var* local,gc& ngc)
{ {
var val=local[1]; var val=local[1];
@ -334,6 +373,7 @@ var builtin_time(var* local,gc& ngc)
time_t begin=(time_t)val.num(); time_t begin=(time_t)val.num();
return {vm_num,(f64)time(&begin)}; return {vm_num,(f64)time(&begin)};
} }
var builtin_contains(var* local,gc& ngc) var builtin_contains(var* local,gc& ngc)
{ {
var hash=local[1]; var hash=local[1];
@ -342,6 +382,7 @@ var builtin_contains(var* local,gc& ngc)
return zero; return zero;
return hash.hash().elems.count(key.str())?one:zero; return hash.hash().elems.count(key.str())?one:zero;
} }
var builtin_delete(var* local,gc& ngc) var builtin_delete(var* local,gc& ngc)
{ {
var hash=local[1]; var hash=local[1];
@ -354,6 +395,7 @@ var builtin_delete(var* local,gc& ngc)
hash.hash().elems.erase(key.str()); hash.hash().elems.erase(key.str());
return nil; return nil;
} }
var builtin_keys(var* local,gc& ngc) var builtin_keys(var* local,gc& ngc)
{ {
var hash=local[1]; var hash=local[1];
@ -367,10 +409,12 @@ var builtin_keys(var* local,gc& ngc)
ngc.temp=nil; ngc.temp=nil;
return res; return res;
} }
var builtin_die(var* local,gc& ngc) var builtin_die(var* local,gc& ngc)
{ {
return nas_err("error",local[1].tostr()); return nas_err("error",local[1].tostr());
} }
var builtin_find(var* local,gc& ngc) var builtin_find(var* local,gc& ngc)
{ {
var needle=local[1]; var needle=local[1];
@ -380,6 +424,7 @@ var builtin_find(var* local,gc& ngc)
return {vm_num,(f64)-1}; return {vm_num,(f64)-1};
return {vm_num,(f64)pos}; return {vm_num,(f64)pos};
} }
var builtin_type(var* local,gc& ngc) var builtin_type(var* local,gc& ngc)
{ {
switch(local[1].type) switch(local[1].type)
@ -396,6 +441,7 @@ var builtin_type(var* local,gc& ngc)
} }
return nil; return nil;
} }
var builtin_substr(var* local,gc& ngc) var builtin_substr(var* local,gc& ngc)
{ {
var str=local[1]; var str=local[1];
@ -413,12 +459,14 @@ var builtin_substr(var* local,gc& ngc)
return nas_err("susbtr","index out of range"); return nas_err("susbtr","index out of range");
return ngc.newstr(str.str().substr(begin,length)); return ngc.newstr(str.str().substr(begin,length));
} }
var builtin_streq(var* local,gc& ngc) var builtin_streq(var* local,gc& ngc)
{ {
var a=local[1]; var a=local[1];
var b=local[2]; var b=local[2];
return {vm_num,f64((a.type!=vm_str || b.type!=vm_str)?0:(a.str()==b.str()))}; return {vm_num,f64((a.type!=vm_str || b.type!=vm_str)?0:(a.str()==b.str()))};
} }
var builtin_left(var* local,gc& ngc) var builtin_left(var* local,gc& ngc)
{ {
var str=local[1]; var str=local[1];
@ -431,6 +479,7 @@ var builtin_left(var* local,gc& ngc)
return ngc.newstr(""); return ngc.newstr("");
return ngc.newstr(str.str().substr(0,len.num())); return ngc.newstr(str.str().substr(0,len.num()));
} }
var builtin_right(var* local,gc& ngc) var builtin_right(var* local,gc& ngc)
{ {
var str=local[1]; var str=local[1];
@ -447,6 +496,7 @@ var builtin_right(var* local,gc& ngc)
length=0; length=0;
return ngc.newstr(str.str().substr(srclen-length,srclen)); return ngc.newstr(str.str().substr(srclen-length,srclen));
} }
var builtin_cmp(var* local,gc& ngc) var builtin_cmp(var* local,gc& ngc)
{ {
var a=local[1]; var a=local[1];
@ -455,6 +505,7 @@ var builtin_cmp(var* local,gc& ngc)
return nas_err("cmp","\"a\" and \"b\" must be string"); return nas_err("cmp","\"a\" and \"b\" must be string");
return {vm_num,(f64)strcmp(a.str().c_str(),b.str().c_str())}; return {vm_num,(f64)strcmp(a.str().c_str(),b.str().c_str())};
} }
var builtin_chr(var* local,gc& ngc) var builtin_chr(var* local,gc& ngc)
{ {
const char* extend[]={ const char* extend[]={
@ -482,6 +533,7 @@ var builtin_chr(var* local,gc& ngc)
return ngc.newstr(extend[num-128]); return ngc.newstr(extend[num-128]);
return ngc.newstr(" "); return ngc.newstr(" ");
} }
var builtin_values(var* local,gc& ngc) var builtin_values(var* local,gc& ngc)
{ {
var hash=local[1]; var hash=local[1];
@ -493,16 +545,14 @@ var builtin_values(var* local,gc& ngc)
v.push_back(i.second); v.push_back(i.second);
return vec; return vec;
} }
var builtin_exists(var* local,gc& ngc) var builtin_exists(var* local,gc& ngc)
{ {
if(local[1].type!=vm_str) if(local[1].type!=vm_str)
return zero; return zero;
return access(local[1].str().c_str(),F_OK)!=-1?one:zero; return access(local[1].str().c_str(),F_OK)!=-1?one:zero;
} }
void obj_file_dtor(void* ptr)
{
fclose((FILE*)ptr);
}
var builtin_open(var* local,gc& ngc) var builtin_open(var* local,gc& ngc)
{ {
var name=local[1]; var name=local[1];
@ -515,18 +565,19 @@ var builtin_open(var* local,gc& ngc)
if(!res) if(!res)
return nas_err("open","failed to open file <"+name.str()+">"); return nas_err("open","failed to open file <"+name.str()+">");
var ret=ngc.alloc(vm_obj); var ret=ngc.alloc(vm_obj);
ret.obj().set(nas_obj::file,res,obj_file_dtor); ret.obj().set(nas_obj::file,res);
return ret; return ret;
} }
var builtin_close(var* local,gc& ngc) var builtin_close(var* local,gc& ngc)
{ {
var fd=local[1]; var fd=local[1];
if(!fd.objchk(nas_obj::file)) if(!fd.objchk(nas_obj::file))
return nas_err("close","not a valid filehandle"); return nas_err("close","not a valid filehandle");
fclose((FILE*)fd.obj().ptr); fd.obj().clear();
fd.obj().ptr=nullptr;
return nil; return nil;
} }
var builtin_read(var* local,gc& ngc) var builtin_read(var* local,gc& ngc)
{ {
var fd=local[1]; var fd=local[1];
@ -549,6 +600,7 @@ var builtin_read(var* local,gc& ngc)
delete []buff; delete []buff;
return {vm_num,res}; return {vm_num,res};
} }
var builtin_write(var* local,gc& ngc) var builtin_write(var* local,gc& ngc)
{ {
var fd=local[1]; var fd=local[1];
@ -559,6 +611,7 @@ var builtin_write(var* local,gc& ngc)
return nas_err("write","\"str\" must be string"); return nas_err("write","\"str\" must be string");
return {vm_num,(f64)fwrite(str.str().c_str(),1,str.str().length(),(FILE*)fd.obj().ptr)}; return {vm_num,(f64)fwrite(str.str().c_str(),1,str.str().length(),(FILE*)fd.obj().ptr)};
} }
var builtin_seek(var* local,gc& ngc) var builtin_seek(var* local,gc& ngc)
{ {
var fd=local[1]; var fd=local[1];
@ -568,6 +621,7 @@ var builtin_seek(var* local,gc& ngc)
return nas_err("seek","not a valid filehandle"); return nas_err("seek","not a valid filehandle");
return {vm_num,(f64)fseek((FILE*)fd.obj().ptr,pos.num(),whence.num())}; return {vm_num,(f64)fseek((FILE*)fd.obj().ptr,pos.num(),whence.num())};
} }
var builtin_tell(var* local,gc& ngc) var builtin_tell(var* local,gc& ngc)
{ {
var fd=local[1]; var fd=local[1];
@ -575,6 +629,7 @@ var builtin_tell(var* local,gc& ngc)
return nas_err("tell","not a valid filehandle"); return nas_err("tell","not a valid filehandle");
return {vm_num,(f64)ftell((FILE*)fd.obj().ptr)}; return {vm_num,(f64)ftell((FILE*)fd.obj().ptr)};
} }
var builtin_readln(var* local,gc& ngc) var builtin_readln(var* local,gc& ngc)
{ {
var fd=local[1]; var fd=local[1];
@ -594,6 +649,7 @@ var builtin_readln(var* local,gc& ngc)
return str; return str;
return nil; return nil;
} }
var builtin_stat(var* local,gc& ngc) var builtin_stat(var* local,gc& ngc)
{ {
var name=local[1]; var name=local[1];
@ -618,6 +674,7 @@ var builtin_stat(var* local,gc& ngc)
}; };
return ret; return ret;
} }
var builtin_eof(var* local,gc& ngc) var builtin_eof(var* local,gc& ngc)
{ {
var fd=local[1]; var fd=local[1];
@ -625,6 +682,7 @@ var builtin_eof(var* local,gc& ngc)
return nas_err("readln","not a valid filehandle"); return nas_err("readln","not a valid filehandle");
return {vm_num,(f64)feof((FILE*)fd.obj().ptr)}; return {vm_num,(f64)feof((FILE*)fd.obj().ptr)};
} }
var builtin_fld(var* local,gc& ngc) var builtin_fld(var* local,gc& ngc)
{ {
// bits.fld(s,0,3); // bits.fld(s,0,3);
@ -648,6 +706,7 @@ var builtin_fld(var* local,gc& ngc)
res|=1<<(bit+len-i-1); res|=1<<(bit+len-i-1);
return {vm_num,(f64)res}; return {vm_num,(f64)res};
} }
var builtin_sfld(var* local,gc& ngc) var builtin_sfld(var* local,gc& ngc)
{ {
// bits.sfld(s,0,3); // bits.sfld(s,0,3);
@ -674,6 +733,7 @@ var builtin_sfld(var* local,gc& ngc)
res|=~((1<<len)-1); res|=~((1<<len)-1);
return {vm_num,(f64)((i32)res)}; return {vm_num,(f64)((i32)res)};
} }
var builtin_setfld(var* local,gc& ngc) var builtin_setfld(var* local,gc& ngc)
{ {
// bits.setfld(s,0,8,69); // bits.setfld(s,0,8,69);
@ -703,6 +763,7 @@ var builtin_setfld(var* local,gc& ngc)
} }
return nil; return nil;
} }
var builtin_buf(var* local,gc& ngc) var builtin_buf(var* local,gc& ngc)
{ {
var length=local[1]; var length=local[1];
@ -713,14 +774,16 @@ var builtin_buf(var* local,gc& ngc)
s.resize(length.num(),'\0'); s.resize(length.num(),'\0');
return str; return str;
} }
var builtin_sleep(var* local,gc& ngc) var builtin_sleep(var* local,gc& ngc)
{ {
var val=local[1]; var val=local[1];
if(val.type!=vm_num) if(val.type!=vm_num)
return nas_err("sleep","\"duration\" must be number"); return nil;
std::this_thread::sleep_for(std::chrono::microseconds(i64(val.num()*1e6))); std::this_thread::sleep_for(std::chrono::microseconds(i64(val.num()*1e6)));
return nil; return nil;
} }
var builtin_pipe(var* local,gc& ngc) var builtin_pipe(var* local,gc& ngc)
{ {
#ifndef _WIN32 #ifndef _WIN32
@ -734,6 +797,7 @@ var builtin_pipe(var* local,gc& ngc)
#endif #endif
return nas_err("pipe","not supported"); return nas_err("pipe","not supported");
} }
var builtin_fork(var* local,gc& ngc) var builtin_fork(var* local,gc& ngc)
{ {
#ifndef _WIN32 #ifndef _WIN32
@ -744,6 +808,7 @@ var builtin_fork(var* local,gc& ngc)
#endif #endif
return nas_err("fork","not supported"); return nas_err("fork","not supported");
} }
var builtin_waitpid(var* local,gc& ngc) var builtin_waitpid(var* local,gc& ngc)
{ {
var pid=local[1]; var pid=local[1];
@ -760,14 +825,7 @@ var builtin_waitpid(var* local,gc& ngc)
#endif #endif
return nas_err("waitpid","not supported"); return nas_err("waitpid","not supported");
} }
void obj_dir_dtor(void* ptr)
{
#ifndef _MSC_VER
closedir((DIR*)ptr);
#else
FindClose(ptr);
#endif
}
var builtin_opendir(var* local,gc& ngc) var builtin_opendir(var* local,gc& ngc)
{ {
var path=local[1]; var path=local[1];
@ -785,9 +843,10 @@ var builtin_opendir(var* local,gc& ngc)
return nas_err("opendir","cannot open dir <"+path.str()+">"); return nas_err("opendir","cannot open dir <"+path.str()+">");
#endif #endif
var ret=ngc.alloc(vm_obj); var ret=ngc.alloc(vm_obj);
ret.obj().set(nas_obj::dir,p,obj_dir_dtor); ret.obj().set(nas_obj::dir,p);
return ret; return ret;
} }
var builtin_readdir(var* local,gc& ngc) var builtin_readdir(var* local,gc& ngc)
{ {
var handle=local[1]; var handle=local[1];
@ -803,19 +862,16 @@ var builtin_readdir(var* local,gc& ngc)
return p?ngc.newstr(p->d_name):nil; return p?ngc.newstr(p->d_name):nil;
#endif #endif
} }
var builtin_closedir(var* local,gc& ngc) var builtin_closedir(var* local,gc& ngc)
{ {
var handle=local[1]; var handle=local[1];
if(!handle.objchk(nas_obj::dir)) if(!handle.objchk(nas_obj::dir))
return nas_err("closedir","not a valid dir handle"); return nas_err("closedir","not a valid dir handle");
#ifndef _MSC_VER handle.obj().clear();
closedir((DIR*)handle.obj().ptr);
#else
FindClose(handle.obj().ptr);
#endif
handle.obj().ptr=nullptr;
return nil; return nil;
} }
var builtin_chdir(var* local,gc& ngc) var builtin_chdir(var* local,gc& ngc)
{ {
var path=local[1]; var path=local[1];
@ -823,6 +879,7 @@ var builtin_chdir(var* local,gc& ngc)
return {vm_num,(f64)-1}; return {vm_num,(f64)-1};
return {vm_num,(f64)chdir(path.str().c_str())}; return {vm_num,(f64)chdir(path.str().c_str())};
} }
var builtin_environ(var* local,gc& ngc) var builtin_environ(var* local,gc& ngc)
{ {
var res=ngc.temp=ngc.alloc(vm_vec); var res=ngc.temp=ngc.alloc(vm_vec);
@ -832,6 +889,7 @@ var builtin_environ(var* local,gc& ngc)
ngc.temp=nil; ngc.temp=nil;
return res; return res;
} }
var builtin_getcwd(var* local,gc& ngc) var builtin_getcwd(var* local,gc& ngc)
{ {
char buf[1024]; char buf[1024];
@ -839,6 +897,7 @@ var builtin_getcwd(var* local,gc& ngc)
return nil; return nil;
return ngc.newstr(buf); return ngc.newstr(buf);
} }
var builtin_getenv(var* local,gc& ngc) var builtin_getenv(var* local,gc& ngc)
{ {
var envvar=local[1]; var envvar=local[1];
@ -847,14 +906,7 @@ var builtin_getenv(var* local,gc& ngc)
char* res=getenv(envvar.str().c_str()); char* res=getenv(envvar.str().c_str());
return res?ngc.newstr(res):nil; return res?ngc.newstr(res):nil;
} }
void dylib_dtor(void* ptr)
{
#ifdef _WIN32
FreeLibrary((HMODULE)ptr);
#else
dlclose(ptr);
#endif
}
var builtin_dlopen(var* local,gc& ngc) var builtin_dlopen(var* local,gc& ngc)
{ {
var dlname=local[1]; var dlname=local[1];
@ -874,9 +926,10 @@ var builtin_dlopen(var* local,gc& ngc)
if(!ptr) if(!ptr)
return nas_err("dlopen","cannot open dynamic lib <"+dlname.str()+">"); return nas_err("dlopen","cannot open dynamic lib <"+dlname.str()+">");
var ret=ngc.alloc(vm_obj); var ret=ngc.alloc(vm_obj);
ret.obj().set(nas_obj::dylib,ptr,dylib_dtor); ret.obj().set(nas_obj::dylib,ptr);
return ret; return ret;
} }
var builtin_dlsym(var* local,gc& ngc) var builtin_dlsym(var* local,gc& ngc)
{ {
var lib=local[1]; var lib=local[1];
@ -901,25 +954,22 @@ var builtin_dlsym(var* local,gc& ngc)
ret.obj().set(nas_obj::faddr,ptr); ret.obj().set(nas_obj::faddr,ptr);
return ret; return ret;
} }
var builtin_dlclose(var* local,gc& ngc) var builtin_dlclose(var* local,gc& ngc)
{ {
var libptr=local[1]; var libptr=local[1];
if(!libptr.objchk(nas_obj::dylib)) if(!libptr.objchk(nas_obj::dylib))
return nas_err("dlclose","\"lib\" is not a valid dynamic lib"); return nas_err("dlclose","\"lib\" is not a valid dynamic lib");
#ifdef _WIN32 libptr.obj().clear();
FreeLibrary((HMODULE)libptr.obj().ptr);
#else
dlclose(libptr.obj().ptr);
#endif
libptr.obj().ptr=nullptr;
return nil; return nil;
} }
var builtin_dlcall(var* local,gc& ngc) var builtin_dlcall(var* local,gc& ngc)
{ {
var fp=local[1]; var fp=local[1];
var args=local[2]; var args=local[2];
if(!fp.objchk(nas_obj::faddr)) if(!fp.objchk(nas_obj::faddr))
return nas_err("dlcall","\"funcptr\" is not a valid function pointer"); return nas_err("dlcall","\"ptr\" is not a valid function pointer");
auto& vec=args.vec().elems; auto& vec=args.vec().elems;
return ((mod)fp.obj().ptr)(vec.data(),vec.size(),&ngc); return ((mod)fp.obj().ptr)(vec.data(),vec.size(),&ngc);
} }
@ -950,6 +1000,7 @@ string tohex(u32 num)
} }
return str; return str;
} }
string md5(const string& src) string md5(const string& src)
{ {
std::vector<u32> buff; std::vector<u32> buff;
@ -1020,6 +1071,7 @@ string md5(const string& src)
} }
return tohex(atmp)+tohex(btmp)+tohex(ctmp)+tohex(dtmp); return tohex(atmp)+tohex(btmp)+tohex(ctmp)+tohex(dtmp);
} }
var builtin_md5(var* local,gc& ngc) var builtin_md5(var* local,gc& ngc)
{ {
var str=local[1]; var str=local[1];
@ -1066,6 +1118,7 @@ var builtin_cocreate(var* local,gc& ngc)
return co; return co;
} }
var builtin_coresume(var* local,gc& ngc) var builtin_coresume(var* local,gc& ngc)
{ {
if(ngc.cort) if(ngc.cort)
@ -1078,6 +1131,7 @@ var builtin_coresume(var* local,gc& ngc)
ngc.ctxchg(co.co()); ngc.ctxchg(co.co());
return ngc.top[0]; return ngc.top[0];
} }
var builtin_coyield(var* local,gc& ngc) var builtin_coyield(var* local,gc& ngc)
{ {
if(!ngc.cort) if(!ngc.cort)
@ -1087,6 +1141,7 @@ var builtin_coyield(var* local,gc& ngc)
// then builtin_coresume will return it // then builtin_coresume will return it
return local[1]; return local[1];
} }
var builtin_costatus(var* local,gc& ngc) var builtin_costatus(var* local,gc& ngc)
{ {
var co=local[1]; var co=local[1];
@ -1100,10 +1155,12 @@ var builtin_costatus(var* local,gc& ngc)
} }
return nil; return nil;
} }
var builtin_corun(var* local,gc& ngc) var builtin_corun(var* local,gc& ngc)
{ {
return ngc.cort?one:zero; return ngc.cort?one:zero;
} }
var builtin_millisec(var* local,gc& ngc) var builtin_millisec(var* local,gc& ngc)
{ {
f64 res=std::chrono::duration_cast<std::chrono::milliseconds> f64 res=std::chrono::duration_cast<std::chrono::milliseconds>
@ -1111,12 +1168,14 @@ var builtin_millisec(var* local,gc& ngc)
.count(); .count();
return {vm_num,res}; return {vm_num,res};
} }
var builtin_sysargv(var* local,gc& ngc) var builtin_sysargv(var* local,gc& ngc)
{ {
var res=ngc.alloc(vm_vec); var res=ngc.alloc(vm_vec);
res.vec().elems=ngc.env_argv; res.vec().elems=ngc.env_argv;
return res; return res;
} }
var builtin_logtime(var* local,gc& ngc) var builtin_logtime(var* local,gc& ngc)
{ {
time_t t=time(nullptr); time_t t=time(nullptr);

View File

@ -95,19 +95,15 @@ void debugger::callsort(const u64* arr)
std::sort(opcall.begin(),opcall.end(), std::sort(opcall.begin(),opcall.end(),
[](const op& a,const op& b){return a.second>b.second;} [](const op& a,const op& b){return a.second>b.second;}
); );
std::clog<<"\noperands call info"; std::clog<<"\noperands call info (<1% ignored)\n";
for(auto& i:opcall) for(auto& i:opcall)
{ {
u64 rate=i.second*100/total; u64 rate=i.second*100/total;
if(!rate) if(!rate)
{
std::clog<<"\n ...";
break; break;
} std::clog<<" "<<opname[i.first]<<" : "<<i.second<<" ("<<rate<<"%)\n";
std::clog<<"\n "<<opname[i.first]
<<" : "<<i.second<<" ("<<rate<<"%)";
} }
std::clog<<"\n total : "<<total<<'\n'; std::clog<<" total : "<<total<<'\n';
} }
void debugger::stepinfo() void debugger::stepinfo()

View File

@ -1,5 +1,20 @@
#pragma once #pragma once
#ifndef _MSC_VER
#include <unistd.h>
#include <dirent.h>
#else
#include <io.h>
#include <direct.h>
#endif
#ifdef _WIN32
#include <windows.h>
#else
#include <dlfcn.h>
#endif
#include <iomanip>
#include <vector> #include <vector>
#include <queue> #include <queue>
#include <unordered_map> #include <unordered_map>
@ -156,8 +171,7 @@ struct nas_obj
{ {
enum obj_t:u32 enum obj_t:u32
{ {
null, file=1,
file,
dir, dir,
dylib, dylib,
faddr faddr
@ -166,25 +180,47 @@ struct nas_obj
/* new object is initialized when creating */ /* new object is initialized when creating */
u32 type; u32 type;
void* ptr; void* ptr;
/* RAII destroyer */ private:
/* default destroyer does nothing */ void obj_file_dtor()
typedef void (*dest)(void*); {
dest dtor; fclose((FILE*)ptr);
}
nas_obj():type(obj_t::null),ptr(nullptr),dtor(nullptr){} void obj_dir_dtor()
{
#ifndef _MSC_VER
closedir((DIR*)ptr);
#else
FindClose(ptr);
#endif
}
void dylib_dtor()
{
#ifdef _WIN32
FreeLibrary((HMODULE)ptr);
#else
dlclose(ptr);
#endif
}
public:
nas_obj():type(0),ptr(nullptr){}
~nas_obj(){clear();} ~nas_obj(){clear();}
void set(u32 t=obj_t::null,void* p=nullptr,dest d=nullptr) void set(u32 t=0,void* p=nullptr)
{ {
type=t; type=t;
ptr=p; ptr=p;
dtor=d;
} }
void clear() void clear()
{ {
if(dtor && ptr) if(!ptr)
dtor(ptr); return;
switch(type)
{
case obj_t::file: obj_file_dtor();break;
case obj_t::dir: obj_dir_dtor(); break;
case obj_t::dylib: dylib_dtor(); break;
default: break;
}
ptr=nullptr; ptr=nullptr;
dtor=nullptr;
} }
}; };
@ -481,7 +517,7 @@ struct gc
/* values for analysis */ /* values for analysis */
u64 size[gc_tsize]; u64 size[gc_tsize];
u64 count[gc_tsize]; u64 gcnt[gc_tsize];
u64 acnt[gc_tsize]; u64 acnt[gc_tsize];
i64 worktime; i64 worktime;
@ -580,7 +616,7 @@ void gc::init(const std::vector<string>& s,const std::vector<string>& argv)
worktime=0; worktime=0;
for(u8 i=0;i<gc_tsize;++i) for(u8 i=0;i<gc_tsize;++i)
size[i]=count[i]=acnt[i]=0; size[i]=gcnt[i]=acnt[i]=0;
for(u8 i=0;i<gc_tsize;++i) for(u8 i=0;i<gc_tsize;++i)
for(u32 j=0;j<ini[i];++j) for(u32 j=0;j<ini[i];++j)
{ {
@ -621,16 +657,27 @@ void gc::clear()
} }
void gc::info() void gc::info()
{ {
const char* name[]={" str"," vec"," hash"," func","upval"," obj"," co"}; const char* name[]={"str ","vec ","hash ","func ","upval","obj ","co "};
std::cout<<"\ngarbage collector info(gc/alloc)\n"; std::cout<<"\ngarbage collector info (gc count|alloc count|memory size)\n";
u32 maxlen=0;
for(u8 i=0;i<gc_tsize;++i) for(u8 i=0;i<gc_tsize;++i)
if(count[i] || acnt[i]) {
std::cout<<" "<<name[i]<<" | "<<count[i]<<","<<acnt[i]<<"\n"; u32 len=std::to_string(gcnt[i]).length();
std::cout<<" time | "<<(worktime*1.0/1000000000)<<"s\n"; maxlen=maxlen<len?len:maxlen;
std::cout<<"\nmemory allocator info(max size)\n"; len=std::to_string(acnt[i]).length();
maxlen=maxlen<len?len:maxlen;
len=std::to_string(ini[i]+size[i]*incr[i]).length();
maxlen=maxlen<len?len:maxlen;
}
for(u8 i=0;i<gc_tsize;++i) for(u8 i=0;i<gc_tsize;++i)
if(ini[i] || size[i]) if(gcnt[i] || acnt[i] || ini[i] || size[i])
std::cout<<" "<<name[i]<<" | "<<ini[i]+size[i]*incr[i]<<" (+"<<size[i]<<")\n"; {
std::cout<<" "<<name[i]<<" | "<<std::left<<std::setw(maxlen)<<std::setfill(' ')<<gcnt[i];
std::cout<<" | "<<std::left<<std::setw(maxlen)<<std::setfill(' ')<<acnt[i];
std::cout<<" | "<<std::left<<std::setw(maxlen)<<std::setfill(' ')<<ini[i]+size[i]*incr[i]<<" (+"<<size[i]<<")\n";
}
double t=worktime*1.0/1000000000;
std::cout<<" time | "<<(t<0.1? t*1000:t)<<(t<0.1? "ms\n":"s\n");
} }
var gc::alloc(u8 type) var gc::alloc(u8 type)
{ {
@ -638,7 +685,7 @@ var gc::alloc(u8 type)
++acnt[index]; ++acnt[index];
if(unused[index].empty()) if(unused[index].empty())
{ {
++count[index]; ++gcnt[index];
auto begin=std::chrono::high_resolution_clock::now(); auto begin=std::chrono::high_resolution_clock::now();
mark(); mark();
sweep(); sweep();

View File

@ -268,13 +268,10 @@ var assert=func(condition,message="assertion failed!"){
# get time stamp, this will return a timestamp object # get time stamp, this will return a timestamp object
var maketimestamp=func(){ var maketimestamp=func(){
var t=0; var t=0;
var millisec=func(){
return __millisec;
}
return { return {
stamp:func(){t=millisec();}, stamp:func(){t=__millisec();},
elapsedMSec:func(){return millisec()-t;}, elapsedMSec:func(){return __millisec()-t;},
elapsedUSec:func(){return (millisec()-t)*1000;} elapsedUSec:func(){return (__millisec()-t)*1000;}
}; };
} }
@ -455,7 +452,7 @@ var dylib=
# close dynamic lib, this operation will make all the symbols loaded from it invalid. # close dynamic lib, this operation will make all the symbols loaded from it invalid.
dlclose: func(lib){return __dlclose; }, dlclose: func(lib){return __dlclose; },
# call the loaded symbol. # call the loaded symbol.
dlcall: func(funcptr,args...){return __dlcall} dlcall: func(ptr,args...){return __dlcall}
}; };
# os is used to use or get some os-related info/functions. # os is used to use or get some os-related info/functions.

View File

@ -44,6 +44,7 @@ var testfile=[
"calc.nas", "calc.nas",
"choice.nas", "choice.nas",
"class.nas", "class.nas",
"console3D.nas",
"coroutine.nas", "coroutine.nas",
"diff.nas", "diff.nas",
"donuts.nas", "donuts.nas",

View File

@ -189,8 +189,8 @@ var main=func() {
var rd=vec3norm([2,uv[0],uv[1]]); var rd=vec3norm([2,uv[0],uv[1]]);
ro=rotateY(ro,0.25); ro=rotateY(ro,0.25);
rd=rotateY(rd,0.25); rd=rotateY(rd,0.25);
ro=rotateZ(ro,t*0.025); ro=rotateZ(ro,t*0.03);
rd=rotateZ(rd,t*0.025); rd=rotateZ(rd,t*0.03);
var diff=1; var diff=1;
for (var k=0;k<5;k+=1){ for (var k=0;k<5;k+=1){
var minIt=99999; var minIt=99999;

View File

@ -3,6 +3,8 @@ var mod=func(n,a){
} }
var main=func(run_time){ var main=func(run_time){
var ts=maketimestamp();
var (sin,cos)=(math.sin,math.cos); var (sin,cos)=(math.sin,math.cos);
var chars=split("",".,-~:;=!*#$@"); var chars=split("",".,-~:;=!*#$@");
@ -13,6 +15,7 @@ var main=func(run_time){
print("\e[2J"); print("\e[2J");
for(var run=0;run<run_time;run+=1){ for(var run=0;run<run_time;run+=1){
ts.stamp();
forindex(var i;b){ forindex(var i;b){
b[i]=" "; b[i]=" ";
z[i]=0; z[i]=0;
@ -41,12 +44,9 @@ var main=func(run_time){
A+=0.00004; A+=0.00004;
B+=0.00002; B+=0.00002;
} }
println(" ",int(1/(ts.elapsedMSec()/1000))," fps ");
print(screen); print(screen);
} }
} }
var frames=5e2; main(5e2);
var ts=maketimestamp();
ts.stamp();
main(frames);
println(int(frames/(ts.elapsedMSec()/1000))," fps");

View File

@ -45,6 +45,7 @@ var filechecksum=func(){
"./test/bfs.nas", "./test/bigloop.nas", "./test/bfs.nas", "./test/bigloop.nas",
"./test/bp.nas", "./test/calc.nas", "./test/bp.nas", "./test/calc.nas",
"./test/choice.nas", "./test/class.nas", "./test/choice.nas", "./test/class.nas",
"./test/console3D.nas",
"./test/coroutine.nas", "./test/diff.nas", "./test/coroutine.nas", "./test/diff.nas",
"./test/donuts.nas", "./test/donuts.nas",
"./test/exception.nas", "./test/fib.nas", "./test/exception.nas", "./test/fib.nas",

View File

@ -1,7 +1,6 @@
# wave collapse function 2022/4/10 # wave collapse function 2022/4/10
# by ValKmjolnir # by ValKmjolnir
srand(); srand();
var interval=1/160;
var table=[ var table=[
# c ,w,a,s,d # c ,w,a,s,d
["═",0,1,0,1], ["═",0,1,0,1],
@ -98,6 +97,7 @@ var map=func(){
if(os.platform()=="windows") if(os.platform()=="windows")
system("chcp 65001"); system("chcp 65001");
map.new(80); map.new(80);
var interval=1/160;
for(var iter=0;iter<100;iter+=1){ for(var iter=0;iter<100;iter+=1){
map.print(1); map.print(1);
map.next(); map.next();