diff --git a/makefile b/makefile index e246b5b..5b1c9b4 100644 --- a/makefile +++ b/makefile @@ -15,17 +15,17 @@ SRC=\ nasal_dbg.h\ nasal.h -STD=-std=c++11 +STD=14 nasal:$(SRC) - $(CXX) $(STD) -O3 main.cpp -o nasal -fno-exceptions -ldl -Wshadow -Wall + $(CXX) -std=c++$(STD) -O3 main.cpp -o nasal -fno-exceptions -ldl -Wshadow -Wall nasal.exe:$(SRC) - $(CXX) $(STD) -O3 main.cpp -o nasal.exe -fno-exceptions -Wshadow -Wall -static + $(CXX) -std=c++$(STD) -O3 main.cpp -o nasal.exe -fno-exceptions -Wshadow -Wall -static stable-release:$(SRC) - $(CXX) $(STD) -O2 main.cpp -o nasal -fno-exceptions -ldl -Wshadow -Wall + $(CXX) -std=c++$(STD) -O2 main.cpp -o nasal -fno-exceptions -ldl -Wshadow -Wall stable-release-mingw:$(SRC) - $(CXX) $(STD) -O2 main.cpp -o nasal.exe -fno-exceptions -Wshadow -Wall -static + $(CXX) -std=c++$(STD) -O2 main.cpp -o nasal.exe -fno-exceptions -Wshadow -Wall -static test:nasal @ ./nasal -o -e test/ascii-art.nas diff --git a/module/makefile b/module/makefile index f8b1dd7..234a28d 100644 --- a/module/makefile +++ b/module/makefile @@ -1,31 +1,31 @@ .PHONY=clean all mingw-all -CPPSTANDARD=-std=c++11 +STD=14 libfib.so: fib.cpp - $(CXX) $(CPPSTANDARD) -c -O3 fib.cpp -fPIC -o fib.o + $(CXX) -std=c++$(STD) -c -O3 fib.cpp -fPIC -o fib.o $(CXX) -shared -o libfib.so fib.o rm fib.o libfib.dll: fib.cpp - $(CXX) $(CPPSTANDARD) -c -O3 fib.cpp -fPIC -o fib.o + $(CXX) -std=c++$(STD) -c -O3 fib.cpp -fPIC -o fib.o $(CXX) -shared -o libfib.dll fib.o del fib.o libkey.so: keyboard.cpp - $(CXX) $(CPPSTANDARD) -c -O3 keyboard.cpp -fPIC -o keyboard.o + $(CXX) -std=c++$(STD) -c -O3 keyboard.cpp -fPIC -o keyboard.o $(CXX) -shared -o libkey.so keyboard.o rm keyboard.o libkey.dll: keyboard.cpp - $(CXX) $(CPPSTANDARD) -c -O3 keyboard.cpp -fPIC -o keyboard.o -static + $(CXX) -std=c++$(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 - $(CXX) $(CPPSTANDARD) -c -O3 nasocket.cpp -fPIC -o nasocket.o + $(CXX) -std=c++$(STD) -c -O3 nasocket.cpp -fPIC -o nasocket.o $(CXX) -shared -o libnasock.so nasocket.o rm nasocket.o libnasock.dll: nasocket.cpp - $(CXX) $(CPPSTANDARD) -c -O3 nasocket.cpp -fPIC -o nasocket.o -lwsock32 -static + $(CXX) -std=c++$(STD) -c -O3 nasocket.cpp -fPIC -o nasocket.o -lwsock32 -static $(CXX) -shared -o libnasock.dll nasocket.o -lwsock32 -static del nasocket.o diff --git a/nasal_builtin.h b/nasal_builtin.h index 182e52c..efea11c 100644 --- a/nasal_builtin.h +++ b/nasal_builtin.h @@ -389,7 +389,10 @@ nas_ref builtin_die(nas_ref* local,nasal_gc& gc) nas_ref str=local[1]; if(str.type!=vm_str) return nas_err("die","\"str\" must be string"); - std::cerr<<"[vm] error: "< // use SetConsoleTextAttribute +struct for_reset +{ + CONSOLE_SCREEN_BUFFER_INFO scr; + for_reset(){ + GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE),&scr); + } +}reset_ter_color; #endif +std::ostream& bold_red(std::ostream& s) +{ +#ifdef _WIN32 + SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0x0c); +#else + s<<"\033[91;1m"; +#endif + return s; +} +std::ostream& bold_cyan(std::ostream& s) +{ +#ifdef _WIN32 + SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0x03); +#else + s<<"\033[36;1m"; +#endif + return s; +} +std::ostream& bold_orange(std::ostream& s) +{ +#ifdef _WIN32 + SetConsoleTextAttribute(GetStdHandle(STD_ERROR_HANDLE),0x0e); +#else + s<<"\033[93;1m"; +#endif + return s; +} +std::ostream& bold_white(std::ostream& s) +{ +#ifdef _WIN32 + SetConsoleTextAttribute(GetStdHandle(STD_ERROR_HANDLE),0x0f); +#else + s<<"\033[0m\033[1m"; +#endif + return s; +} +std::ostream& reset(std::ostream& s) +{ +#ifdef _WIN32 + SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),reset_ter_color.scr.wAttributes); +#else + s<<"\033[0m"; +#endif + return s; +} + class fstreamline { protected: @@ -18,14 +71,13 @@ protected: public: void load(const string& f) { - if(file==f) // don't need to load a loaded file - return; + if(file==f) return; // don't need to load a loaded file file=f; res.clear(); std::ifstream fin(f,std::ios::binary); if(fin.fail()) { - std::cerr<<"[src] cannot open file <"<\n"; + std::cerr<\n"; std::exit(1); } string line; @@ -49,45 +101,30 @@ class nasal_err:public fstreamline { private: u32 error; - void printstg(const char* stage) - { -#ifdef _WIN32 - CONSOLE_SCREEN_BUFFER_INFO scrinfo; - GetConsoleScreenBufferInfo(GetStdHandle(STD_ERROR_HANDLE),&scrinfo); - SetConsoleTextAttribute(GetStdHandle(STD_ERROR_HANDLE),0x03); - std::cerr<<"["; - SetConsoleTextAttribute(GetStdHandle(STD_ERROR_HANDLE),0x0c); - std::cerr< #include +#include "nasal_err.h" + enum vm_type:u8{ /* none-gc object */ vm_none=0, @@ -721,7 +723,10 @@ void nasal_gc::ctxreserve() // use to print error log and return error value nas_ref nas_err(const string& err_f,const string& info) { - std::cerr<<"[vm] "< #include +#include "nasal_err.h" + class nasal_vm { protected: @@ -207,8 +209,9 @@ void nasal_vm::bytecodeinfo(const char* header,const u32 p) void nasal_vm::traceback() { nas_ref* bottom=stack+bytecode[0].num; // bytecode[0] is op_intg + nas_ref* main_ctx_top=gc.stack==stack?top:gc.mctx.top; // if error occurs in coroutine, this works std::stack ret; - for(nas_ref* i=bottom;i<=top;++i) + for(nas_ref* i=bottom;i<=main_ctx_top;++i) if(i->type==vm_ret) ret.push(i->ret()); ret.push(pc); // store the position program crashed @@ -314,7 +317,10 @@ void nasal_vm::detail() [[noreturn]] void nasal_vm::die(const string& str) { - std::cout<<"[vm] "<