From 4fd69c6ce437e89fd586b8ca0346a47d46044c8d Mon Sep 17 00:00:00 2001 From: ValKmjolnir Date: Sun, 6 Nov 2022 18:20:10 +0800 Subject: [PATCH] :rocket: optimize code --- lib.nas | 11 ++-- makefile | 11 ++-- module/makefile | 32 +++++----- nasal_builtin.h | 137 ++++++++++++++++++++++++++++++------------ nasal_dbg.h | 10 +-- nasal_gc.h | 95 +++++++++++++++++++++-------- stl/lib.nas | 11 ++-- test/calc.nas | 1 + test/console3D.nas | 4 +- test/donuts.nas | 10 +-- test/md5compare.nas | 1 + test/wavecollapse.nas | 2 +- 12 files changed, 212 insertions(+), 113 deletions(-) diff --git a/lib.nas b/lib.nas index 08a1c4d..0a9db19 100644 --- a/lib.nas +++ b/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. diff --git a/makefile b/makefile index 2d5252c..d315eb6 100644 --- a/makefile +++ b/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 diff --git a/module/makefile b/module/makefile index 2359b07..ea14aff 100644 --- a/module/makefile +++ b/module/makefile @@ -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 diff --git a/nasal_builtin.h b/nasal_builtin.h index 57ac3ae..62bb22c 100644 --- a/nasal_builtin.h +++ b/nasal_builtin.h @@ -37,6 +37,7 @@ var builtin_print(var* local,gc& ngc) std::cout<"); 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<"); #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 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 @@ -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); diff --git a/nasal_dbg.h b/nasal_dbg.h index c721139..8227835 100644 --- a/nasal_dbg.h +++ b/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 "< +#include +#else +#include +#include +#endif + +#ifdef _WIN32 +#include +#else +#include +#endif + +#include #include #include #include @@ -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& s,const std::vector& argv) worktime=0; for(u8 i=0;i