🚀 optimize code
This commit is contained in:
parent
1ced201cb5
commit
4fd69c6ce4
11
lib.nas
11
lib.nas
|
@ -268,13 +268,10 @@ var assert=func(condition,message="assertion failed!"){
|
|||
# get time stamp, this will return a timestamp object
|
||||
var maketimestamp=func(){
|
||||
var t=0;
|
||||
var millisec=func(){
|
||||
return __millisec;
|
||||
}
|
||||
return {
|
||||
stamp:func(){t=millisec();},
|
||||
elapsedMSec:func(){return millisec()-t;},
|
||||
elapsedUSec:func(){return (millisec()-t)*1000;}
|
||||
stamp:func(){t=__millisec();},
|
||||
elapsedMSec:func(){return __millisec()-t;},
|
||||
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.
|
||||
dlclose: func(lib){return __dlclose; },
|
||||
# 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.
|
||||
|
|
11
makefile
11
makefile
|
@ -15,17 +15,17 @@ SRC=\
|
|||
nasal_dbg.h\
|
||||
nasal.h
|
||||
|
||||
STD=14
|
||||
STD=c++14
|
||||
|
||||
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)
|
||||
$(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)
|
||||
$(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)
|
||||
$(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:
|
||||
-@ rm ./nasal
|
||||
|
@ -42,6 +42,7 @@ test:nasal
|
|||
@ ./nasal -o -d test/calc.nas
|
||||
@ ./nasal -o -e test/choice.nas
|
||||
@ ./nasal -o -e test/class.nas
|
||||
@ ./nasal -o -t -d test/console3D.nas
|
||||
@ ./nasal -o -e test/coroutine.nas
|
||||
@ ./nasal -o -e test/diff.nas
|
||||
@ ./nasal -o -e test/donuts.nas
|
||||
|
|
|
@ -3,38 +3,38 @@
|
|||
dynamic_libs=libfib.so libkey.so libnasock.so
|
||||
dynamic_libs_dll=libfib.dll libkey.dll libnasock.dll
|
||||
|
||||
STD=14
|
||||
STD=c++14
|
||||
|
||||
libfib.so: fib.cpp
|
||||
@ echo "[build] libfib.so"
|
||||
@ $(CXX) -std=c++$(STD) -c -O3 fib.cpp -fPIC -o fib.o
|
||||
@ echo "[Compiling] libfib.so"
|
||||
@ $(CXX) -std=$(STD) -c -O3 fib.cpp -fPIC -o fib.o
|
||||
@ $(CXX) -shared -o libfib.so fib.o
|
||||
@ rm fib.o
|
||||
libfib.dll: fib.cpp
|
||||
@ echo [build] libfib.dll
|
||||
@ $(CXX) -std=c++$(STD) -c -O3 fib.cpp -fPIC -o fib.o
|
||||
@ echo [Compiling] libfib.dll
|
||||
@ $(CXX) -std=$(STD) -c -O3 fib.cpp -fPIC -o fib.o
|
||||
@ $(CXX) -shared -o libfib.dll fib.o
|
||||
@ del fib.o
|
||||
|
||||
libkey.so: keyboard.cpp
|
||||
@ echo "[build] libkey.so"
|
||||
@ $(CXX) -std=c++$(STD) -c -O3 keyboard.cpp -fPIC -o keyboard.o
|
||||
@ echo "[Compiling] libkey.so"
|
||||
@ $(CXX) -std=$(STD) -c -O3 keyboard.cpp -fPIC -o keyboard.o
|
||||
@ $(CXX) -shared -o libkey.so keyboard.o
|
||||
@ rm keyboard.o
|
||||
libkey.dll: keyboard.cpp
|
||||
@ echo [build] libkey.dll
|
||||
@ $(CXX) -std=c++$(STD) -c -O3 keyboard.cpp -fPIC -o keyboard.o -static
|
||||
@ echo [Compiling] libkey.dll
|
||||
@ $(CXX) -std=$(STD) -c -O3 keyboard.cpp -fPIC -o keyboard.o -static
|
||||
@ $(CXX) -shared -o libkey.dll keyboard.o -static
|
||||
@ del keyboard.o
|
||||
|
||||
libnasock.so: nasocket.cpp
|
||||
@ echo "[build] libnasock.so"
|
||||
@ $(CXX) -std=c++$(STD) -c -O3 nasocket.cpp -fPIC -o nasocket.o
|
||||
@ echo "[Compiling] libnasock.so"
|
||||
@ $(CXX) -std=$(STD) -c -O3 nasocket.cpp -fPIC -o nasocket.o
|
||||
@ $(CXX) -shared -o libnasock.so nasocket.o
|
||||
@ rm nasocket.o
|
||||
libnasock.dll: nasocket.cpp
|
||||
@ echo [build] libnasock.dll
|
||||
@ $(CXX) -std=c++$(STD) -c -O3 nasocket.cpp -fPIC -o nasocket.o -lwsock32 -static
|
||||
@ echo [Compiling] libnasock.dll
|
||||
@ $(CXX) -std=$(STD) -c -O3 nasocket.cpp -fPIC -o nasocket.o -lwsock32 -static
|
||||
@ $(CXX) -shared -o libnasock.dll nasocket.o -lwsock32 -static
|
||||
@ del nasocket.o
|
||||
|
||||
|
@ -45,6 +45,6 @@ clean:
|
|||
-@ rm $(dynamic_libs_dll)
|
||||
|
||||
all: libfib.so libkey.so libnasock.so
|
||||
@ echo "[build] done"
|
||||
mingw-all: libfib.dll libkey.dll libnasock.dll
|
||||
@ echo [build] done
|
||||
@ echo "[Compiling] done"
|
||||
winall: libfib.dll libkey.dll libnasock.dll
|
||||
@ echo [Compiling] done
|
||||
|
|
137
nasal_builtin.h
137
nasal_builtin.h
|
@ -37,6 +37,7 @@ var builtin_print(var* local,gc& ngc)
|
|||
std::cout<<std::flush;
|
||||
return nil;
|
||||
}
|
||||
|
||||
var builtin_println(var* local,gc& ngc)
|
||||
{
|
||||
for(auto& i:local[1].vec().elems)
|
||||
|
@ -44,16 +45,19 @@ var builtin_println(var* local,gc& ngc)
|
|||
std::cout<<std::endl;
|
||||
return nil;
|
||||
}
|
||||
|
||||
var builtin_exit(var* local,gc& ngc)
|
||||
{
|
||||
std::exit(local[1].num());
|
||||
return nil;
|
||||
}
|
||||
|
||||
var builtin_abort(var* local,gc& ngc)
|
||||
{
|
||||
std::abort();
|
||||
return nil;
|
||||
}
|
||||
|
||||
var builtin_append(var* local,gc& ngc)
|
||||
{
|
||||
var vec=local[1];
|
||||
|
@ -65,6 +69,7 @@ var builtin_append(var* local,gc& ngc)
|
|||
v.push_back(i);
|
||||
return nil;
|
||||
}
|
||||
|
||||
var builtin_setsize(var* local,gc& ngc)
|
||||
{
|
||||
var vec=local[1];
|
||||
|
@ -76,6 +81,7 @@ var builtin_setsize(var* local,gc& ngc)
|
|||
vec.vec().elems.resize((i64)size.num(),nil);
|
||||
return nil;
|
||||
}
|
||||
|
||||
var builtin_system(var* local,gc& ngc)
|
||||
{
|
||||
var str=local[1];
|
||||
|
@ -83,6 +89,7 @@ var builtin_system(var* local,gc& ngc)
|
|||
return {vm_num,(f64)-1};
|
||||
return {vm_num,(f64)system(str.str().c_str())};
|
||||
}
|
||||
|
||||
var builtin_input(var* local,gc& ngc)
|
||||
{
|
||||
var end=local[1];
|
||||
|
@ -93,6 +100,7 @@ var builtin_input(var* local,gc& ngc)
|
|||
std::getline(std::cin,ret.str(),end.str()[0]);
|
||||
return ret;
|
||||
}
|
||||
|
||||
var builtin_fin(var* local,gc& ngc)
|
||||
{
|
||||
var val=local[1];
|
||||
|
@ -104,6 +112,7 @@ var builtin_fin(var* local,gc& ngc)
|
|||
rd<<in.rdbuf();
|
||||
return ngc.newstr(rd.str());
|
||||
}
|
||||
|
||||
var builtin_fout(var* local,gc& ngc)
|
||||
{
|
||||
var val=local[1];
|
||||
|
@ -116,6 +125,7 @@ var builtin_fout(var* local,gc& ngc)
|
|||
out<<str;
|
||||
return nil;
|
||||
}
|
||||
|
||||
var builtin_split(var* local,gc& ngc)
|
||||
{
|
||||
var delimeter=local[1];
|
||||
|
@ -151,6 +161,7 @@ var builtin_split(var* local,gc& ngc)
|
|||
ngc.temp=nil;
|
||||
return res;
|
||||
}
|
||||
|
||||
var builtin_rand(var* local,gc& ngc)
|
||||
{
|
||||
var val=local[1];
|
||||
|
@ -166,6 +177,7 @@ var builtin_rand(var* local,gc& ngc)
|
|||
num=(num+rand())*(1.0/(RAND_MAX+1.0));
|
||||
return {vm_num,num};
|
||||
}
|
||||
|
||||
var builtin_id(var* local,gc& ngc)
|
||||
{
|
||||
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;
|
||||
return ngc.newstr(ss.str());
|
||||
}
|
||||
|
||||
var builtin_int(var* local,gc& ngc)
|
||||
{
|
||||
var val=local[1];
|
||||
|
@ -182,11 +195,13 @@ var builtin_int(var* local,gc& ngc)
|
|||
return nil;
|
||||
return {vm_num,f64((i32)val.tonum())};
|
||||
}
|
||||
|
||||
var builtin_floor(var* local,gc& ngc)
|
||||
{
|
||||
var val=local[1];
|
||||
return {vm_num,std::floor(val.num())};
|
||||
}
|
||||
|
||||
var builtin_num(var* local,gc& ngc)
|
||||
{
|
||||
var val=local[1];
|
||||
|
@ -199,6 +214,7 @@ var builtin_num(var* local,gc& ngc)
|
|||
return nil;
|
||||
return {vm_num,res};
|
||||
}
|
||||
|
||||
var builtin_pop(var* local,gc& ngc)
|
||||
{
|
||||
var val=local[1];
|
||||
|
@ -213,10 +229,12 @@ var builtin_pop(var* local,gc& ngc)
|
|||
}
|
||||
return nil;
|
||||
}
|
||||
|
||||
var builtin_str(var* local,gc& ngc)
|
||||
{
|
||||
return ngc.newstr(local[1].tostr());
|
||||
}
|
||||
|
||||
var builtin_size(var* local,gc& ngc)
|
||||
{
|
||||
var val=local[1];
|
||||
|
@ -230,46 +248,57 @@ var builtin_size(var* local,gc& ngc)
|
|||
}
|
||||
return {vm_num,num};
|
||||
}
|
||||
|
||||
var builtin_i32xor(var* local,gc& ngc)
|
||||
{
|
||||
return {vm_num,(f64)(i32(local[1].num())^i32(local[2].num()))};
|
||||
}
|
||||
|
||||
var builtin_i32and(var* local,gc& ngc)
|
||||
{
|
||||
return {vm_num,(f64)(i32(local[1].num())&i32(local[2].num()))};
|
||||
}
|
||||
|
||||
var builtin_i32or(var* local,gc& ngc)
|
||||
{
|
||||
return {vm_num,(f64)(i32(local[1].num())|i32(local[2].num()))};
|
||||
}
|
||||
|
||||
var builtin_i32nand(var* local,gc& ngc)
|
||||
{
|
||||
return {vm_num,(f64)(~(i32(local[1].num())&i32(local[2].num())))};
|
||||
}
|
||||
|
||||
var builtin_i32not(var* local,gc& ngc)
|
||||
{
|
||||
return {vm_num,(f64)(~i32(local[1].num()))};
|
||||
}
|
||||
|
||||
var builtin_u32xor(var* local,gc& ngc)
|
||||
{
|
||||
return {vm_num,(f64)(u32(local[1].num())^u32(local[2].num()))};
|
||||
}
|
||||
|
||||
var builtin_u32and(var* local,gc& ngc)
|
||||
{
|
||||
return {vm_num,(f64)(u32(local[1].num())&u32(local[2].num()))};
|
||||
}
|
||||
|
||||
var builtin_u32or(var* local,gc& ngc)
|
||||
{
|
||||
return {vm_num,(f64)(u32(local[1].num())|u32(local[2].num()))};
|
||||
}
|
||||
|
||||
var builtin_u32nand(var* local,gc& ngc)
|
||||
{
|
||||
return {vm_num,(f64)(u32)(~(u32(local[1].num())&u32(local[2].num())))};
|
||||
}
|
||||
|
||||
var builtin_u32not(var* local,gc& ngc)
|
||||
{
|
||||
return {vm_num,(f64)(u32)(~u32(local[1].num()))};
|
||||
}
|
||||
|
||||
var builtin_pow(var* local,gc& ngc)
|
||||
{
|
||||
var x=local[1];
|
||||
|
@ -278,41 +307,49 @@ var builtin_pow(var* local,gc& ngc)
|
|||
return {vm_num,std::nan("")};
|
||||
return {vm_num,std::pow(x.num(),y.num())};
|
||||
}
|
||||
|
||||
var builtin_sin(var* local,gc& ngc)
|
||||
{
|
||||
var val=local[1];
|
||||
return {vm_num,val.type==vm_num?sin(val.num()):std::nan("")};
|
||||
}
|
||||
|
||||
var builtin_cos(var* local,gc& ngc)
|
||||
{
|
||||
var val=local[1];
|
||||
return {vm_num,val.type==vm_num?cos(val.num()):std::nan("")};
|
||||
}
|
||||
|
||||
var builtin_tan(var* local,gc& ngc)
|
||||
{
|
||||
var val=local[1];
|
||||
return {vm_num,val.type==vm_num?tan(val.num()):std::nan("")};
|
||||
}
|
||||
|
||||
var builtin_exp(var* local,gc& ngc)
|
||||
{
|
||||
var val=local[1];
|
||||
return {vm_num,val.type==vm_num?exp(val.num()):std::nan("")};
|
||||
}
|
||||
|
||||
var builtin_lg(var* local,gc& ngc)
|
||||
{
|
||||
var val=local[1];
|
||||
return {vm_num,val.type==vm_num?log(val.num())/log(10.0):std::nan("")};
|
||||
}
|
||||
|
||||
var builtin_ln(var* local,gc& ngc)
|
||||
{
|
||||
var val=local[1];
|
||||
return {vm_num,val.type==vm_num?log(val.num()):std::nan("")};
|
||||
}
|
||||
|
||||
var builtin_sqrt(var* local,gc& ngc)
|
||||
{
|
||||
var val=local[1];
|
||||
return {vm_num,val.type==vm_num?sqrt(val.num()):std::nan("")};
|
||||
}
|
||||
|
||||
var builtin_atan2(var* local,gc& ngc)
|
||||
{
|
||||
var x=local[1];
|
||||
|
@ -321,11 +358,13 @@ var builtin_atan2(var* local,gc& ngc)
|
|||
return {vm_num,std::nan("")};
|
||||
return {vm_num,atan2(y.num(),x.num())};
|
||||
}
|
||||
|
||||
var builtin_isnan(var* local,gc& ngc)
|
||||
{
|
||||
var x=local[1];
|
||||
return (x.type==vm_num && std::isnan(x.num()))?one:zero;
|
||||
}
|
||||
|
||||
var builtin_time(var* local,gc& ngc)
|
||||
{
|
||||
var val=local[1];
|
||||
|
@ -334,6 +373,7 @@ var builtin_time(var* local,gc& ngc)
|
|||
time_t begin=(time_t)val.num();
|
||||
return {vm_num,(f64)time(&begin)};
|
||||
}
|
||||
|
||||
var builtin_contains(var* local,gc& ngc)
|
||||
{
|
||||
var hash=local[1];
|
||||
|
@ -342,6 +382,7 @@ var builtin_contains(var* local,gc& ngc)
|
|||
return zero;
|
||||
return hash.hash().elems.count(key.str())?one:zero;
|
||||
}
|
||||
|
||||
var builtin_delete(var* local,gc& ngc)
|
||||
{
|
||||
var hash=local[1];
|
||||
|
@ -354,6 +395,7 @@ var builtin_delete(var* local,gc& ngc)
|
|||
hash.hash().elems.erase(key.str());
|
||||
return nil;
|
||||
}
|
||||
|
||||
var builtin_keys(var* local,gc& ngc)
|
||||
{
|
||||
var hash=local[1];
|
||||
|
@ -367,10 +409,12 @@ var builtin_keys(var* local,gc& ngc)
|
|||
ngc.temp=nil;
|
||||
return res;
|
||||
}
|
||||
|
||||
var builtin_die(var* local,gc& ngc)
|
||||
{
|
||||
return nas_err("error",local[1].tostr());
|
||||
}
|
||||
|
||||
var builtin_find(var* local,gc& ngc)
|
||||
{
|
||||
var needle=local[1];
|
||||
|
@ -380,6 +424,7 @@ var builtin_find(var* local,gc& ngc)
|
|||
return {vm_num,(f64)-1};
|
||||
return {vm_num,(f64)pos};
|
||||
}
|
||||
|
||||
var builtin_type(var* local,gc& ngc)
|
||||
{
|
||||
switch(local[1].type)
|
||||
|
@ -396,6 +441,7 @@ var builtin_type(var* local,gc& ngc)
|
|||
}
|
||||
return nil;
|
||||
}
|
||||
|
||||
var builtin_substr(var* local,gc& ngc)
|
||||
{
|
||||
var str=local[1];
|
||||
|
@ -413,12 +459,14 @@ var builtin_substr(var* local,gc& ngc)
|
|||
return nas_err("susbtr","index out of range");
|
||||
return ngc.newstr(str.str().substr(begin,length));
|
||||
}
|
||||
|
||||
var builtin_streq(var* local,gc& ngc)
|
||||
{
|
||||
var a=local[1];
|
||||
var b=local[2];
|
||||
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 str=local[1];
|
||||
|
@ -431,6 +479,7 @@ var builtin_left(var* local,gc& ngc)
|
|||
return ngc.newstr("");
|
||||
return ngc.newstr(str.str().substr(0,len.num()));
|
||||
}
|
||||
|
||||
var builtin_right(var* local,gc& ngc)
|
||||
{
|
||||
var str=local[1];
|
||||
|
@ -447,6 +496,7 @@ var builtin_right(var* local,gc& ngc)
|
|||
length=0;
|
||||
return ngc.newstr(str.str().substr(srclen-length,srclen));
|
||||
}
|
||||
|
||||
var builtin_cmp(var* local,gc& ngc)
|
||||
{
|
||||
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 {vm_num,(f64)strcmp(a.str().c_str(),b.str().c_str())};
|
||||
}
|
||||
|
||||
var builtin_chr(var* local,gc& ngc)
|
||||
{
|
||||
const char* extend[]={
|
||||
|
@ -482,6 +533,7 @@ var builtin_chr(var* local,gc& ngc)
|
|||
return ngc.newstr(extend[num-128]);
|
||||
return ngc.newstr(" ");
|
||||
}
|
||||
|
||||
var builtin_values(var* local,gc& ngc)
|
||||
{
|
||||
var hash=local[1];
|
||||
|
@ -493,16 +545,14 @@ var builtin_values(var* local,gc& ngc)
|
|||
v.push_back(i.second);
|
||||
return vec;
|
||||
}
|
||||
|
||||
var builtin_exists(var* local,gc& ngc)
|
||||
{
|
||||
if(local[1].type!=vm_str)
|
||||
return 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 name=local[1];
|
||||
|
@ -515,18 +565,19 @@ var builtin_open(var* local,gc& ngc)
|
|||
if(!res)
|
||||
return nas_err("open","failed to open file <"+name.str()+">");
|
||||
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;
|
||||
}
|
||||
|
||||
var builtin_close(var* local,gc& ngc)
|
||||
{
|
||||
var fd=local[1];
|
||||
if(!fd.objchk(nas_obj::file))
|
||||
return nas_err("close","not a valid filehandle");
|
||||
fclose((FILE*)fd.obj().ptr);
|
||||
fd.obj().ptr=nullptr;
|
||||
fd.obj().clear();
|
||||
return nil;
|
||||
}
|
||||
|
||||
var builtin_read(var* local,gc& ngc)
|
||||
{
|
||||
var fd=local[1];
|
||||
|
@ -549,6 +600,7 @@ var builtin_read(var* local,gc& ngc)
|
|||
delete []buff;
|
||||
return {vm_num,res};
|
||||
}
|
||||
|
||||
var builtin_write(var* local,gc& ngc)
|
||||
{
|
||||
var fd=local[1];
|
||||
|
@ -559,6 +611,7 @@ var builtin_write(var* local,gc& ngc)
|
|||
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)};
|
||||
}
|
||||
|
||||
var builtin_seek(var* local,gc& ngc)
|
||||
{
|
||||
var fd=local[1];
|
||||
|
@ -568,6 +621,7 @@ var builtin_seek(var* local,gc& ngc)
|
|||
return nas_err("seek","not a valid filehandle");
|
||||
return {vm_num,(f64)fseek((FILE*)fd.obj().ptr,pos.num(),whence.num())};
|
||||
}
|
||||
|
||||
var builtin_tell(var* local,gc& ngc)
|
||||
{
|
||||
var fd=local[1];
|
||||
|
@ -575,6 +629,7 @@ var builtin_tell(var* local,gc& ngc)
|
|||
return nas_err("tell","not a valid filehandle");
|
||||
return {vm_num,(f64)ftell((FILE*)fd.obj().ptr)};
|
||||
}
|
||||
|
||||
var builtin_readln(var* local,gc& ngc)
|
||||
{
|
||||
var fd=local[1];
|
||||
|
@ -594,6 +649,7 @@ var builtin_readln(var* local,gc& ngc)
|
|||
return str;
|
||||
return nil;
|
||||
}
|
||||
|
||||
var builtin_stat(var* local,gc& ngc)
|
||||
{
|
||||
var name=local[1];
|
||||
|
@ -618,6 +674,7 @@ var builtin_stat(var* local,gc& ngc)
|
|||
};
|
||||
return ret;
|
||||
}
|
||||
|
||||
var builtin_eof(var* local,gc& ngc)
|
||||
{
|
||||
var fd=local[1];
|
||||
|
@ -625,6 +682,7 @@ var builtin_eof(var* local,gc& ngc)
|
|||
return nas_err("readln","not a valid filehandle");
|
||||
return {vm_num,(f64)feof((FILE*)fd.obj().ptr)};
|
||||
}
|
||||
|
||||
var builtin_fld(var* local,gc& ngc)
|
||||
{
|
||||
// bits.fld(s,0,3);
|
||||
|
@ -648,6 +706,7 @@ var builtin_fld(var* local,gc& ngc)
|
|||
res|=1<<(bit+len-i-1);
|
||||
return {vm_num,(f64)res};
|
||||
}
|
||||
|
||||
var builtin_sfld(var* local,gc& ngc)
|
||||
{
|
||||
// bits.sfld(s,0,3);
|
||||
|
@ -674,6 +733,7 @@ var builtin_sfld(var* local,gc& ngc)
|
|||
res|=~((1<<len)-1);
|
||||
return {vm_num,(f64)((i32)res)};
|
||||
}
|
||||
|
||||
var builtin_setfld(var* local,gc& ngc)
|
||||
{
|
||||
// bits.setfld(s,0,8,69);
|
||||
|
@ -703,6 +763,7 @@ var builtin_setfld(var* local,gc& ngc)
|
|||
}
|
||||
return nil;
|
||||
}
|
||||
|
||||
var builtin_buf(var* local,gc& ngc)
|
||||
{
|
||||
var length=local[1];
|
||||
|
@ -713,14 +774,16 @@ var builtin_buf(var* local,gc& ngc)
|
|||
s.resize(length.num(),'\0');
|
||||
return str;
|
||||
}
|
||||
|
||||
var builtin_sleep(var* local,gc& ngc)
|
||||
{
|
||||
var val=local[1];
|
||||
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)));
|
||||
return nil;
|
||||
}
|
||||
|
||||
var builtin_pipe(var* local,gc& ngc)
|
||||
{
|
||||
#ifndef _WIN32
|
||||
|
@ -734,6 +797,7 @@ var builtin_pipe(var* local,gc& ngc)
|
|||
#endif
|
||||
return nas_err("pipe","not supported");
|
||||
}
|
||||
|
||||
var builtin_fork(var* local,gc& ngc)
|
||||
{
|
||||
#ifndef _WIN32
|
||||
|
@ -744,6 +808,7 @@ var builtin_fork(var* local,gc& ngc)
|
|||
#endif
|
||||
return nas_err("fork","not supported");
|
||||
}
|
||||
|
||||
var builtin_waitpid(var* local,gc& ngc)
|
||||
{
|
||||
var pid=local[1];
|
||||
|
@ -760,14 +825,7 @@ var builtin_waitpid(var* local,gc& ngc)
|
|||
#endif
|
||||
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 path=local[1];
|
||||
|
@ -785,9 +843,10 @@ var builtin_opendir(var* local,gc& ngc)
|
|||
return nas_err("opendir","cannot open dir <"+path.str()+">");
|
||||
#endif
|
||||
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;
|
||||
}
|
||||
|
||||
var builtin_readdir(var* local,gc& ngc)
|
||||
{
|
||||
var handle=local[1];
|
||||
|
@ -803,19 +862,16 @@ var builtin_readdir(var* local,gc& ngc)
|
|||
return p?ngc.newstr(p->d_name):nil;
|
||||
#endif
|
||||
}
|
||||
|
||||
var builtin_closedir(var* local,gc& ngc)
|
||||
{
|
||||
var handle=local[1];
|
||||
if(!handle.objchk(nas_obj::dir))
|
||||
return nas_err("closedir","not a valid dir handle");
|
||||
#ifndef _MSC_VER
|
||||
closedir((DIR*)handle.obj().ptr);
|
||||
#else
|
||||
FindClose(handle.obj().ptr);
|
||||
#endif
|
||||
handle.obj().ptr=nullptr;
|
||||
handle.obj().clear();
|
||||
return nil;
|
||||
}
|
||||
|
||||
var builtin_chdir(var* local,gc& ngc)
|
||||
{
|
||||
var path=local[1];
|
||||
|
@ -823,6 +879,7 @@ var builtin_chdir(var* local,gc& ngc)
|
|||
return {vm_num,(f64)-1};
|
||||
return {vm_num,(f64)chdir(path.str().c_str())};
|
||||
}
|
||||
|
||||
var builtin_environ(var* local,gc& ngc)
|
||||
{
|
||||
var res=ngc.temp=ngc.alloc(vm_vec);
|
||||
|
@ -832,6 +889,7 @@ var builtin_environ(var* local,gc& ngc)
|
|||
ngc.temp=nil;
|
||||
return res;
|
||||
}
|
||||
|
||||
var builtin_getcwd(var* local,gc& ngc)
|
||||
{
|
||||
char buf[1024];
|
||||
|
@ -839,6 +897,7 @@ var builtin_getcwd(var* local,gc& ngc)
|
|||
return nil;
|
||||
return ngc.newstr(buf);
|
||||
}
|
||||
|
||||
var builtin_getenv(var* local,gc& ngc)
|
||||
{
|
||||
var envvar=local[1];
|
||||
|
@ -847,14 +906,7 @@ var builtin_getenv(var* local,gc& ngc)
|
|||
char* res=getenv(envvar.str().c_str());
|
||||
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 dlname=local[1];
|
||||
|
@ -874,9 +926,10 @@ var builtin_dlopen(var* local,gc& ngc)
|
|||
if(!ptr)
|
||||
return nas_err("dlopen","cannot open dynamic lib <"+dlname.str()+">");
|
||||
var ret=ngc.alloc(vm_obj);
|
||||
ret.obj().set(nas_obj::dylib,ptr,dylib_dtor);
|
||||
ret.obj().set(nas_obj::dylib,ptr);
|
||||
return ret;
|
||||
}
|
||||
|
||||
var builtin_dlsym(var* local,gc& ngc)
|
||||
{
|
||||
var lib=local[1];
|
||||
|
@ -901,25 +954,22 @@ var builtin_dlsym(var* local,gc& ngc)
|
|||
ret.obj().set(nas_obj::faddr,ptr);
|
||||
return ret;
|
||||
}
|
||||
|
||||
var builtin_dlclose(var* local,gc& ngc)
|
||||
{
|
||||
var libptr=local[1];
|
||||
if(!libptr.objchk(nas_obj::dylib))
|
||||
return nas_err("dlclose","\"lib\" is not a valid dynamic lib");
|
||||
#ifdef _WIN32
|
||||
FreeLibrary((HMODULE)libptr.obj().ptr);
|
||||
#else
|
||||
dlclose(libptr.obj().ptr);
|
||||
#endif
|
||||
libptr.obj().ptr=nullptr;
|
||||
libptr.obj().clear();
|
||||
return nil;
|
||||
}
|
||||
|
||||
var builtin_dlcall(var* local,gc& ngc)
|
||||
{
|
||||
var fp=local[1];
|
||||
var args=local[2];
|
||||
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;
|
||||
return ((mod)fp.obj().ptr)(vec.data(),vec.size(),&ngc);
|
||||
}
|
||||
|
@ -950,6 +1000,7 @@ string tohex(u32 num)
|
|||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
string md5(const string& src)
|
||||
{
|
||||
std::vector<u32> buff;
|
||||
|
@ -1020,6 +1071,7 @@ string md5(const string& src)
|
|||
}
|
||||
return tohex(atmp)+tohex(btmp)+tohex(ctmp)+tohex(dtmp);
|
||||
}
|
||||
|
||||
var builtin_md5(var* local,gc& ngc)
|
||||
{
|
||||
var str=local[1];
|
||||
|
@ -1066,6 +1118,7 @@ var builtin_cocreate(var* local,gc& ngc)
|
|||
|
||||
return co;
|
||||
}
|
||||
|
||||
var builtin_coresume(var* local,gc& ngc)
|
||||
{
|
||||
if(ngc.cort)
|
||||
|
@ -1078,6 +1131,7 @@ var builtin_coresume(var* local,gc& ngc)
|
|||
ngc.ctxchg(co.co());
|
||||
return ngc.top[0];
|
||||
}
|
||||
|
||||
var builtin_coyield(var* local,gc& ngc)
|
||||
{
|
||||
if(!ngc.cort)
|
||||
|
@ -1087,6 +1141,7 @@ var builtin_coyield(var* local,gc& ngc)
|
|||
// then builtin_coresume will return it
|
||||
return local[1];
|
||||
}
|
||||
|
||||
var builtin_costatus(var* local,gc& ngc)
|
||||
{
|
||||
var co=local[1];
|
||||
|
@ -1100,10 +1155,12 @@ var builtin_costatus(var* local,gc& ngc)
|
|||
}
|
||||
return nil;
|
||||
}
|
||||
|
||||
var builtin_corun(var* local,gc& ngc)
|
||||
{
|
||||
return ngc.cort?one:zero;
|
||||
}
|
||||
|
||||
var builtin_millisec(var* local,gc& ngc)
|
||||
{
|
||||
f64 res=std::chrono::duration_cast<std::chrono::milliseconds>
|
||||
|
@ -1111,12 +1168,14 @@ var builtin_millisec(var* local,gc& ngc)
|
|||
.count();
|
||||
return {vm_num,res};
|
||||
}
|
||||
|
||||
var builtin_sysargv(var* local,gc& ngc)
|
||||
{
|
||||
var res=ngc.alloc(vm_vec);
|
||||
res.vec().elems=ngc.env_argv;
|
||||
return res;
|
||||
}
|
||||
|
||||
var builtin_logtime(var* local,gc& ngc)
|
||||
{
|
||||
time_t t=time(nullptr);
|
||||
|
|
10
nasal_dbg.h
10
nasal_dbg.h
|
@ -95,19 +95,15 @@ void debugger::callsort(const u64* arr)
|
|||
std::sort(opcall.begin(),opcall.end(),
|
||||
[](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)
|
||||
{
|
||||
u64 rate=i.second*100/total;
|
||||
if(!rate)
|
||||
{
|
||||
std::clog<<"\n ...";
|
||||
break;
|
||||
}
|
||||
std::clog<<"\n "<<opname[i.first]
|
||||
<<" : "<<i.second<<" ("<<rate<<"%)";
|
||||
std::clog<<" "<<opname[i.first]<<" : "<<i.second<<" ("<<rate<<"%)\n";
|
||||
}
|
||||
std::clog<<"\n total : "<<total<<'\n';
|
||||
std::clog<<" total : "<<total<<'\n';
|
||||
}
|
||||
|
||||
void debugger::stepinfo()
|
||||
|
|
95
nasal_gc.h
95
nasal_gc.h
|
@ -1,5 +1,20 @@
|
|||
#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 <queue>
|
||||
#include <unordered_map>
|
||||
|
@ -156,8 +171,7 @@ struct nas_obj
|
|||
{
|
||||
enum obj_t:u32
|
||||
{
|
||||
null,
|
||||
file,
|
||||
file=1,
|
||||
dir,
|
||||
dylib,
|
||||
faddr
|
||||
|
@ -166,25 +180,47 @@ struct nas_obj
|
|||
/* new object is initialized when creating */
|
||||
u32 type;
|
||||
void* ptr;
|
||||
/* RAII destroyer */
|
||||
/* default destroyer does nothing */
|
||||
typedef void (*dest)(void*);
|
||||
dest dtor;
|
||||
|
||||
nas_obj():type(obj_t::null),ptr(nullptr),dtor(nullptr){}
|
||||
private:
|
||||
void obj_file_dtor()
|
||||
{
|
||||
fclose((FILE*)ptr);
|
||||
}
|
||||
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();}
|
||||
void set(u32 t=obj_t::null,void* p=nullptr,dest d=nullptr)
|
||||
void set(u32 t=0,void* p=nullptr)
|
||||
{
|
||||
type=t;
|
||||
ptr=p;
|
||||
dtor=d;
|
||||
}
|
||||
void clear()
|
||||
{
|
||||
if(dtor && ptr)
|
||||
dtor(ptr);
|
||||
if(!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;
|
||||
dtor=nullptr;
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -481,7 +517,7 @@ struct gc
|
|||
|
||||
/* values for analysis */
|
||||
u64 size[gc_tsize];
|
||||
u64 count[gc_tsize];
|
||||
u64 gcnt[gc_tsize];
|
||||
u64 acnt[gc_tsize];
|
||||
i64 worktime;
|
||||
|
||||
|
@ -580,7 +616,7 @@ void gc::init(const std::vector<string>& s,const std::vector<string>& argv)
|
|||
worktime=0;
|
||||
|
||||
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(u32 j=0;j<ini[i];++j)
|
||||
{
|
||||
|
@ -621,16 +657,27 @@ void gc::clear()
|
|||
}
|
||||
void gc::info()
|
||||
{
|
||||
const char* name[]={" str"," vec"," hash"," func","upval"," obj"," co"};
|
||||
std::cout<<"\ngarbage collector info(gc/alloc)\n";
|
||||
const char* name[]={"str ","vec ","hash ","func ","upval","obj ","co "};
|
||||
std::cout<<"\ngarbage collector info (gc count|alloc count|memory size)\n";
|
||||
u32 maxlen=0;
|
||||
for(u8 i=0;i<gc_tsize;++i)
|
||||
if(count[i] || acnt[i])
|
||||
std::cout<<" "<<name[i]<<" | "<<count[i]<<","<<acnt[i]<<"\n";
|
||||
std::cout<<" time | "<<(worktime*1.0/1000000000)<<"s\n";
|
||||
std::cout<<"\nmemory allocator info(max size)\n";
|
||||
{
|
||||
u32 len=std::to_string(gcnt[i]).length();
|
||||
maxlen=maxlen<len?len:maxlen;
|
||||
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)
|
||||
if(ini[i] || size[i])
|
||||
std::cout<<" "<<name[i]<<" | "<<ini[i]+size[i]*incr[i]<<" (+"<<size[i]<<")\n";
|
||||
if(gcnt[i] || acnt[i] || ini[i] || size[i])
|
||||
{
|
||||
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)
|
||||
{
|
||||
|
@ -638,7 +685,7 @@ var gc::alloc(u8 type)
|
|||
++acnt[index];
|
||||
if(unused[index].empty())
|
||||
{
|
||||
++count[index];
|
||||
++gcnt[index];
|
||||
auto begin=std::chrono::high_resolution_clock::now();
|
||||
mark();
|
||||
sweep();
|
||||
|
|
11
stl/lib.nas
11
stl/lib.nas
|
@ -268,13 +268,10 @@ var assert=func(condition,message="assertion failed!"){
|
|||
# get time stamp, this will return a timestamp object
|
||||
var maketimestamp=func(){
|
||||
var t=0;
|
||||
var millisec=func(){
|
||||
return __millisec;
|
||||
}
|
||||
return {
|
||||
stamp:func(){t=millisec();},
|
||||
elapsedMSec:func(){return millisec()-t;},
|
||||
elapsedUSec:func(){return (millisec()-t)*1000;}
|
||||
stamp:func(){t=__millisec();},
|
||||
elapsedMSec:func(){return __millisec()-t;},
|
||||
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.
|
||||
dlclose: func(lib){return __dlclose; },
|
||||
# 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.
|
||||
|
|
|
@ -44,6 +44,7 @@ var testfile=[
|
|||
"calc.nas",
|
||||
"choice.nas",
|
||||
"class.nas",
|
||||
"console3D.nas",
|
||||
"coroutine.nas",
|
||||
"diff.nas",
|
||||
"donuts.nas",
|
||||
|
|
|
@ -189,8 +189,8 @@ var main=func() {
|
|||
var rd=vec3norm([2,uv[0],uv[1]]);
|
||||
ro=rotateY(ro,0.25);
|
||||
rd=rotateY(rd,0.25);
|
||||
ro=rotateZ(ro,t*0.025);
|
||||
rd=rotateZ(rd,t*0.025);
|
||||
ro=rotateZ(ro,t*0.03);
|
||||
rd=rotateZ(rd,t*0.03);
|
||||
var diff=1;
|
||||
for (var k=0;k<5;k+=1){
|
||||
var minIt=99999;
|
||||
|
|
|
@ -3,6 +3,8 @@ var mod=func(n,a){
|
|||
}
|
||||
|
||||
var main=func(run_time){
|
||||
var ts=maketimestamp();
|
||||
|
||||
var (sin,cos)=(math.sin,math.cos);
|
||||
var chars=split("",".,-~:;=!*#$@");
|
||||
|
||||
|
@ -13,6 +15,7 @@ var main=func(run_time){
|
|||
|
||||
print("\e[2J");
|
||||
for(var run=0;run<run_time;run+=1){
|
||||
ts.stamp();
|
||||
forindex(var i;b){
|
||||
b[i]=" ";
|
||||
z[i]=0;
|
||||
|
@ -41,12 +44,9 @@ var main=func(run_time){
|
|||
A+=0.00004;
|
||||
B+=0.00002;
|
||||
}
|
||||
println(" ",int(1/(ts.elapsedMSec()/1000))," fps ");
|
||||
print(screen);
|
||||
}
|
||||
}
|
||||
|
||||
var frames=5e2;
|
||||
var ts=maketimestamp();
|
||||
ts.stamp();
|
||||
main(frames);
|
||||
println(int(frames/(ts.elapsedMSec()/1000))," fps");
|
||||
main(5e2);
|
|
@ -45,6 +45,7 @@ var filechecksum=func(){
|
|||
"./test/bfs.nas", "./test/bigloop.nas",
|
||||
"./test/bp.nas", "./test/calc.nas",
|
||||
"./test/choice.nas", "./test/class.nas",
|
||||
"./test/console3D.nas",
|
||||
"./test/coroutine.nas", "./test/diff.nas",
|
||||
"./test/donuts.nas",
|
||||
"./test/exception.nas", "./test/fib.nas",
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
# wave collapse function 2022/4/10
|
||||
# by ValKmjolnir
|
||||
srand();
|
||||
var interval=1/160;
|
||||
var table=[
|
||||
# c ,w,a,s,d
|
||||
["═",0,1,0,1],
|
||||
|
@ -98,6 +97,7 @@ var map=func(){
|
|||
if(os.platform()=="windows")
|
||||
system("chcp 65001");
|
||||
map.new(80);
|
||||
var interval=1/160;
|
||||
for(var iter=0;iter<100;iter+=1){
|
||||
map.print(1);
|
||||
map.next();
|
||||
|
|
Loading…
Reference in New Issue