diff --git a/module/makefile b/module/makefile index 189c653..1f985b9 100644 --- a/module/makefile +++ b/module/makefile @@ -3,6 +3,8 @@ dynamic_libs_so=libfib.so libkey.so libnasock.so libmat.so dynamic_libs_dll=libfib.dll libkey.dll libnasock.dll libmat.dll +used_header= ../nasal.h ../nasal_gc.h + STD=c++14 all: $(dynamic_libs_so) @@ -10,45 +12,45 @@ all: $(dynamic_libs_so) winall: $(dynamic_libs_dll) @ echo [Compiling] done -libfib.so: fib.cpp +libfib.so: fib.cpp $(used_header) @ 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 +libfib.dll: fib.cpp $(used_header) @ 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 +libkey.so: keyboard.cpp $(used_header) @ 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 +libkey.dll: keyboard.cpp $(used_header) @ 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 +libnasock.so: nasocket.cpp $(used_header) @ 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 +libnasock.dll: nasocket.cpp $(used_header) @ 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 -libmat.so: matrix.cpp +libmat.so: matrix.cpp $(used_header) @ echo "[Compiling] libmat.so" @ $(CXX) -std=$(STD) -c -O3 matrix.cpp -fPIC -o matrix.o @ $(CXX) -shared -o libmat.so matrix.o @ rm matrix.o -libmat.dll: matrix.cpp +libmat.dll: matrix.cpp $(used_header) @ echo [Compiling] libmat.dll @ $(CXX) -std=$(STD) -c -O3 matrix.cpp -fPIC -o matrix.o -static @ $(CXX) -shared -o libmat.dll matrix.o -static diff --git a/nasal_builtin.h b/nasal_builtin.h index 776bb9f..8ddb933 100644 --- a/nasal_builtin.h +++ b/nasal_builtin.h @@ -1201,6 +1201,30 @@ var builtin_sysargv(var* local,gc& ngc) { return res; } +var builtin_gcextend(var* local,gc& ngc) { + var type=local[1]; + if (type.type!=vm_str) { + return nil; + } + auto& s=type.str(); + if (s=="str") { + ngc.extend(vm_str); + } else if (s=="vec") { + ngc.extend(vm_vec); + } else if (s=="hash") { + ngc.extend(vm_hash); + } else if (s=="func") { + ngc.extend(vm_func); + } else if (s=="upval") { + ngc.extend(vm_upval); + } else if (s=="obj") { + ngc.extend(vm_obj); + } else if (s=="co") { + ngc.extend(vm_co); + } + return nil; +} + var builtin_logtime(var* local,gc& ngc) { time_t t=time(nullptr); tm* tm_t=localtime(&t); @@ -1315,6 +1339,7 @@ struct { {"__corun" ,builtin_corun }, {"__millisec",builtin_millisec}, {"__sysargv", builtin_sysargv }, + {"__gcextd", builtin_gcextend}, {"__logtime", builtin_logtime }, {nullptr, nullptr } }; diff --git a/nasal_gc.h b/nasal_gc.h index 3c7c0bf..cdd2f15 100644 --- a/nasal_gc.h +++ b/nasal_gc.h @@ -94,8 +94,8 @@ struct var { var(const u8 t,var* n):type(t) {val.addr=n;} // copy var(const var& nr):type(nr.type),val(nr.val) {} - bool operator==(const var& nr) {return type==nr.type && val.gcobj==nr.val.gcobj;} - bool operator!=(const var& nr) {return type!=nr.type || val.gcobj!=nr.val.gcobj;} + bool operator==(const var& nr) const {return type==nr.type && val.gcobj==nr.val.gcobj;} + bool operator!=(const var& nr) const {return type!=nr.type || val.gcobj!=nr.val.gcobj;} // number and string can be translated to each other f64 tonum(); string tostr(); @@ -115,23 +115,21 @@ struct var { }; struct nas_vec { - bool printed; std::vector elems; + bool printed; nas_vec():printed(false) {} - friend std::ostream& operator<<(std::ostream&,nas_vec&); - usize size() {return elems.size();} + usize size() const {return elems.size();} var get_val(const i32); var* get_mem(const i32); }; struct nas_hash { - bool printed; std::unordered_map elems; + bool printed; nas_hash():printed(false) {} - friend std::ostream& operator<<(std::ostream&,nas_hash&); - usize size() {return elems.size();} + usize size() const {return elems.size();} var get_val(const string&); var* get_mem(const string&); }; @@ -236,12 +234,14 @@ struct nas_co { funcr({vm_nil,(f64)0}), upvalr({vm_nil,(f64)0}), status(nas_co::suspended) { - for(u32 i=0;i&,const std::vector&); void clear(); void info(); @@ -577,8 +578,7 @@ void gc::mark() { } } -void gc::sweep() -{ +void gc::sweep() { for(auto i:memory) { if (i->mark==GC_UNCOLLECTED) { i->clear(); @@ -590,6 +590,16 @@ void gc::sweep() } } +void gc::extend(u8 type) { + u8 index=type-vm_str; + ++size[index]; + for(u32 i=0;i& s,const std::vector& argv) { // initiaize function register funcr=nil; @@ -661,7 +671,7 @@ void gc::info() { } } double t=worktime*1.0/1000000000; // seconds - std::cout<<" time | "<<(t<0.1? t*1000:t)<<(t<0.1? "ms\n":"s\n"); + std::cout<<" time | "<<(t<0.1? t*1000:t)<<(t<0.1? " ms\n":" s\n"); if (total) { std::cout<<" avg | "<mark=GC_UNCOLLECTED; diff --git a/nasal_vm.h b/nasal_vm.h index 24f44fb..dd543b2 100644 --- a/nasal_vm.h +++ b/nasal_vm.h @@ -828,7 +828,7 @@ inline void vm::o_slc() { var val=(top--)[0]; var res=top[-1].vec().get_val(val.tonum()); if (res.type==vm_none) { - die("out of range:"+std::to_string(val.tonum())); + die("index "+std::to_string(val.tonum())+" out of range"); return; } top[0].vec().elems.push_back(res); @@ -854,7 +854,7 @@ inline void vm::o_slc2() { } if (num1<-size || num1>=size || num2<-size || num2>=size) { - die("index "+std::to_string(num1)+":"+std::to_string(num2)+" out of range."); + die("index "+std::to_string(num1)+":"+std::to_string(num2)+" out of range"); return; } else if (num1<=num2) { for(i32 i=num1;i<=num2;++i) { @@ -890,12 +890,12 @@ inline void vm::o_mcallv() { if (vec.type==vm_vec) { memr=vec.vec().get_mem(val.tonum()); if (!memr) { - die("out of range:"+std::to_string(val.tonum())); + die("index "+std::to_string(val.tonum())+" out of range"); return; } } else if (vec.type==vm_hash) { // do mcallh but use the mcallv way if (val.type!=vm_str) { - die("must use string as the key"); + die("key must be string"); return; } nas_hash& ref=vec.hash(); @@ -958,8 +958,10 @@ inline void vm::o_ret() { auto& upval=up.upval(); auto size=func.func().lsize; upval.onstk=false; - for(u32 i=0;i100){ - mem_occ=0; - } - var cpu_occ=nil; - while((cpu_occ=coroutine.resume(co)[0])==nil){ - var key=libkey.nonblock(); - if(key!=nil and chr(key)=="q") - return; - } - println("\e[1;1H\e[1m Operating system : \e[0m",is_windows_platform?"\e[31m":"\e[36m",os.platform(),"\e[0m"); - println("\e[2;1H\e[1m Current time : \e[0m\e[36m",os.time(),"\e[0m"); - println("\e[3;1H\e[1m Memory total(GB) : \e[0m\e[36m",mem.MemTotal/1024/1024,"\e[0m"); - println("\e[4;1H\e[1m Memory free(GB) : \e[0m\e[36m",mem.MemFree/1024/1024,"\e[0m"); - println("\e[5;1H\e[1m Memory occupation(%): \e[0m",mem_occ>60?"\e[91m":"\e[32m",bar.bar(mem_occ/100)~" ",mem_occ,"\e[0m "); - println("\e[6;1H\e[1m CPU occupation(%) : \e[0m",cpu_occ>90?"\e[91m":"\e[32m",bar.bar(cpu_occ/100)~" ",cpu_occ,"\e[0m "); - - for(var i=0;i0.5?-1:1); statistics[int(size(statistics)/2+u*size(statistics)/2)]+=1; } - var s=["","","",""]; + var s=["","",""]; foreach(var st;statistics){ var max_rate=100/size(statistics); var rate=st/total*100; @@ -118,17 +89,117 @@ func(){ } } } - var tmp=""; + var tmp=""; for(var i=0;i100){ + mem_occ=0; + } + var cpu_occ=nil; + while((cpu_occ=coroutine.resume(co)[0])==nil){ + var key=libkey.nonblock(); + coroutine.resume(rd); + if(key!=nil and chr(key)=="q") + return; + } + + if(is_windows_platform or is_macos_platform){ + # sorry this is not real data + cpu_occ=rand()*10; + mem_occ=rand()*10+40; + } + + for(var i=0;i60?"\e[91m":"\e[32m",bar.bar(mem_occ/100)~" ",mem_occ,"\e[0m "); + println("\e[6;1H\e[1m CPU occupation(%) : \e[0m",cpu_occ>90?"\e[91m":"\e[32m",bar.bar(cpu_occ/100)~" ",cpu_occ,"\e[0m "); + + var tmp=""; + for(var i=0;i<70;i+=1){ + tmp~="-"; + } + + var s=["","",""]; + foreach(var occ;cpu_occupation_log){ + var max_rate=50/size(s); + var rate=occ; + for(var i=size(s)-1;i>=0;i-=1){ + if(rate>=max_rate){ + s[i]~="█"; + rate-=max_rate; + }else{ + s[i]~=rise[rate/max_rate*size(rise)]; + rate=0; + } + } + } println("\e[7;1H \e[32m+"~tmp~"+\e[0m"); println("\e[8;1H \e[32m|",s[0],"|\e[0m"); println("\e[9;1H \e[32m|",s[1],"|\e[0m"); println("\e[10;1H \e[32m|",s[2],"|\e[0m"); - println("\e[11;1H \e[32m|",s[3],"|\e[0m"); - println("\e[12;1H \e[32m+"~tmp~"+\e[0m"); + println("\e[11;1H \e[32m+"~tmp~"+\e[0m"); - println("\e[13;1H Press 'q' to quit."); + var s=["","",""]; + foreach(var occ;mem_occupation_log){ + var max_rate=100/size(s); + var rate=occ; + for(var i=size(s)-1;i>=0;i-=1){ + if(rate>=max_rate){ + s[i]~="█"; + rate-=max_rate; + }else{ + s[i]~=rise[rate/max_rate*size(rise)]; + rate=0; + } + } + } + println("\e[12;1H \e[32m|",s[0],"|\e[0m"); + println("\e[13;1H \e[32m|",s[1],"|\e[0m"); + println("\e[14;1H \e[32m|",s[2],"|\e[0m"); + println("\e[15;1H \e[32m+"~tmp~"+\e[0m"); + + println("\e[20;1H Press 'q' to quit."); } }(); \ No newline at end of file diff --git a/test/qrcode.nas b/test/qrcode.nas index 6db4747..b1e0f38 100644 --- a/test/qrcode.nas +++ b/test/qrcode.nas @@ -1,25 +1,33 @@ var code=[ - [1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1], - [1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1], - [1,0,1,1,1,0,1,0,0,0,0,0,0,0,1,0,1,1,1,0,1], - [1,0,1,1,1,0,1,0,0,0,0,0,0,0,1,0,1,1,1,0,1], - [1,0,1,1,1,0,1,0,0,0,0,0,0,0,1,0,1,1,1,0,1], - [1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1], - [1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1], - [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0], - [1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0], - [1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0], - [1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0], - [1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0], - [1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0], - [1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0], - [1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0], + [1,1,1,1,1,1,1,0,1,0,0,1,1,0,1,0,1,0,1,1,0,0,1,1,1,1,1,1,1], + [1,0,0,0,0,0,1,0,0,1,1,0,0,1,0,0,0,1,1,1,1,0,1,0,0,0,0,0,1], + [1,0,1,1,1,0,1,0,0,0,1,0,1,1,1,1,0,0,0,1,1,0,1,0,1,1,1,0,1], + [1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,1,1,1,0,1,1,0,1,0,1,1,1,0,1], + [1,0,1,1,1,0,1,0,0,1,0,1,0,1,1,0,1,0,1,1,0,0,1,0,1,1,1,0,1], + [1,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,1,0,0,1,0,1,0,0,0,0,0,1], + [1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1], + [0,0,0,0,0,0,0,0,1,0,1,0,1,1,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0], + [1,1,0,1,1,0,1,0,0,1,1,1,1,0,1,1,1,1,0,1,0,0,1,0,0,0,0,0,1], + [1,1,0,1,0,0,0,1,1,1,0,0,1,1,1,1,0,1,1,1,0,1,0,1,1,0,1,1,0], + [1,0,1,1,0,1,1,1,0,0,1,1,1,1,0,1,1,0,1,0,1,0,0,1,1,0,1,0,0], + [0,0,0,0,1,0,0,1,0,1,1,0,1,0,0,1,1,1,1,1,1,1,1,1,0,1,0,0,1], + [0,0,0,0,0,1,1,1,1,1,0,1,0,0,0,1,0,0,0,1,0,0,1,1,0,0,0,0,1], + [1,1,0,0,1,1,0,1,1,1,0,1,0,1,0,1,1,1,1,1,0,0,1,1,1,1,1,1,1], + [1,1,1,0,0,1,1,1,1,1,1,0,0,1,1,1,0,1,0,1,1,1,1,0,1,0,1,0,1], + [0,0,1,0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,1,0,0,0,1,1,0,1,0,1], + [0,1,0,0,0,0,1,0,0,0,0,1,1,1,0,1,0,0,0,1,1,1,0,0,0,1,0,0,0], + [1,0,1,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,1,1,0,0,0,0,1,0,1,1,0], + [1,1,1,1,0,1,1,1,1,0,0,1,1,1,0,1,1,1,0,1,0,0,0,0,1,1,0,0,1], + [1,1,1,1,1,1,0,0,0,1,1,0,0,1,0,1,1,0,1,1,0,0,1,0,0,1,1,0,0], + [1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,1,1,0,0,1,1,1,1,1,1,1,1,0], + [0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,1,1,0,1,0,0,0,1,1,0,0,0], + [1,1,1,1,1,1,1,0,0,0,0,1,0,1,1,1,1,0,0,1,1,0,1,0,1,1,0,0,0], + [1,0,0,0,0,0,1,0,0,1,1,1,0,0,0,1,0,1,1,1,1,0,0,0,1,0,0,0,1], + [1,0,1,1,1,0,1,0,1,1,0,1,1,0,0,0,1,0,0,1,1,1,1,1,1,1,0,1,1], + [1,0,1,1,1,0,1,0,1,0,1,1,0,1,0,1,0,1,1,0,0,1,0,0,0,0,0,1,1], + [1,0,1,1,1,0,1,0,0,0,0,0,1,1,0,1,1,0,1,0,1,1,0,1,1,0,1,1,1], + [1,0,0,0,0,0,1,0,1,0,0,1,1,0,1,1,1,0,0,0,0,0,1,1,0,1,1,0,1], + [1,1,1,1,1,1,1,0,1,0,0,1,0,1,0,1,1,0,0,1,1,0,1,0,1,0,0,0,0], ]; # enable unicode @@ -30,35 +38,4 @@ for(var i=0;i=0;i-=1){ - vec[i]=bits.u32_and(1,len); - len=int(len/2); - } - println(vec); - - var bitstr=[]; - for(var i=0;i=0;j-=1){ - tmp[j]=bits.u32_and(1,c); - c=int(c/2); - } - foreach(var j;tmp) - append(bitstr,j); - } - println(bitstr); - - var end=[0,0,0,0]; - println(end); -} - -transfer("github.com/ValKmjolnir"); \ No newline at end of file +} \ No newline at end of file