diff --git a/.gitignore b/.gitignore index ee49fd1..76ad02e 100644 --- a/.gitignore +++ b/.gitignore @@ -31,6 +31,13 @@ *.out *.app +# VS C++ sln +*.sln +*.vcxproj +*.vcxproj.filters +*.vcxproj.user + +# misc nasal .vscode dump \ No newline at end of file diff --git a/nasal.h b/nasal.h index d4e2870..ac5cb46 100644 --- a/nasal.h +++ b/nasal.h @@ -2,7 +2,10 @@ #define __NASAL_H__ #define __nasver "10.0" +#ifndef _MSC_VER #include +#include +#endif #include #include @@ -26,7 +29,6 @@ #include #include -#include #include #ifdef _WIN32 @@ -160,7 +162,11 @@ std::string rawstr(const std::string& str,const size_t maxlen=0) case '\v': ret+="\\v"; break; case '\f': ret+="\\f"; break; case '\r': ret+="\\r"; break; +#ifdef _MSC_VER + case '\033':ret+="\\e";break; +#else case '\e': ret+="\\e"; break; +#endif case '\"': ret+="\\\"";break; case '\'': ret+="\\\'";break; case '\\': ret+="\\\\";break; diff --git a/nasal_dbg.h b/nasal_dbg.h index cc0777d..37f6acc 100644 --- a/nasal_dbg.h +++ b/nasal_dbg.h @@ -181,6 +181,7 @@ void nasal_dbg::run( detail_info=true; fsize=linker.get_file().size(); init(gen.get_strs(),gen.get_nums(),gen.get_code(),linker.get_file(),argv); +#ifndef _MSC_VER const void* oprs[]= { &&vmexit, &&intg, &&intl, &&loadg, @@ -211,6 +212,63 @@ void nasal_dbg::run( } // goto the first operand goto *code[pc]; +#else + typedef void (nasal_dbg::*nafunc)(); + const nafunc oprs[]= + { + nullptr, &nasal_dbg::opr_intg, + &nasal_dbg::opr_intl, &nasal_dbg::opr_loadg, + &nasal_dbg::opr_loadl, &nasal_dbg::opr_loadu, + &nasal_dbg::opr_pnum, &nasal_dbg::opr_pnil, + &nasal_dbg::opr_pstr, &nasal_dbg::opr_newv, + &nasal_dbg::opr_newh, &nasal_dbg::opr_newf, + &nasal_dbg::opr_happ, &nasal_dbg::opr_para, + &nasal_dbg::opr_deft, &nasal_dbg::opr_dyn, + &nasal_dbg::opr_unot, &nasal_dbg::opr_usub, + &nasal_dbg::opr_add, &nasal_dbg::opr_sub, + &nasal_dbg::opr_mul, &nasal_dbg::opr_div, + &nasal_dbg::opr_lnk, &nasal_dbg::opr_addc, + &nasal_dbg::opr_subc, &nasal_dbg::opr_mulc, + &nasal_dbg::opr_divc, &nasal_dbg::opr_lnkc, + &nasal_dbg::opr_addeq, &nasal_dbg::opr_subeq, + &nasal_dbg::opr_muleq, &nasal_dbg::opr_diveq, + &nasal_dbg::opr_lnkeq, &nasal_dbg::opr_addeqc, + &nasal_dbg::opr_subeqc, &nasal_dbg::opr_muleqc, + &nasal_dbg::opr_diveqc, &nasal_dbg::opr_lnkeqc, + &nasal_dbg::opr_meq, &nasal_dbg::opr_eq, + &nasal_dbg::opr_neq, &nasal_dbg::opr_less, + &nasal_dbg::opr_leq, &nasal_dbg::opr_grt, + &nasal_dbg::opr_geq, &nasal_dbg::opr_lessc, + &nasal_dbg::opr_leqc, &nasal_dbg::opr_grtc, + &nasal_dbg::opr_geqc, &nasal_dbg::opr_pop, + &nasal_dbg::opr_jmp, &nasal_dbg::opr_jt, + &nasal_dbg::opr_jf, &nasal_dbg::opr_cnt, + &nasal_dbg::opr_findex, &nasal_dbg::opr_feach, + &nasal_dbg::opr_callg, &nasal_dbg::opr_calll, + &nasal_dbg::opr_upval, &nasal_dbg::opr_callv, + &nasal_dbg::opr_callvi, &nasal_dbg::opr_callh, + &nasal_dbg::opr_callfv, &nasal_dbg::opr_callfh, + &nasal_dbg::opr_callb, &nasal_dbg::opr_slcbeg, + &nasal_dbg::opr_slcend, &nasal_dbg::opr_slc, + &nasal_dbg::opr_slc2, &nasal_dbg::opr_mcallg, + &nasal_dbg::opr_mcalll, &nasal_dbg::opr_mupval, + &nasal_dbg::opr_mcallv, &nasal_dbg::opr_mcallh, + &nasal_dbg::opr_ret + }; + std::vector code; + for(auto& i:gen.get_code()) + { + code.push_back(oprs[i.op]); + imm.push_back(i.num); + } + while(code[pc]){ + interact(); + (this->*code[pc])(); + if(top>=canary) + break; + ++pc; + } +#endif vmexit: if(top>=canary) @@ -219,6 +277,7 @@ vmexit: imm.clear(); std::cout<<"[debug] debugger exited\n"; return; +#ifndef _MSC_VER #define dbg(op) {interact();op();if(top code; for(auto& i:gen.get_code()) { @@ -996,6 +997,63 @@ void nasal_vm::run( } // goto the first operand goto *code[pc]; +#else + typedef void (nasal_vm::*nafunc)(); + const nafunc oprs[]= + { + nullptr, &nasal_vm::opr_intg, + &nasal_vm::opr_intl, &nasal_vm::opr_loadg, + &nasal_vm::opr_loadl, &nasal_vm::opr_loadu, + &nasal_vm::opr_pnum, &nasal_vm::opr_pnil, + &nasal_vm::opr_pstr, &nasal_vm::opr_newv, + &nasal_vm::opr_newh, &nasal_vm::opr_newf, + &nasal_vm::opr_happ, &nasal_vm::opr_para, + &nasal_vm::opr_deft, &nasal_vm::opr_dyn, + &nasal_vm::opr_unot, &nasal_vm::opr_usub, + &nasal_vm::opr_add, &nasal_vm::opr_sub, + &nasal_vm::opr_mul, &nasal_vm::opr_div, + &nasal_vm::opr_lnk, &nasal_vm::opr_addc, + &nasal_vm::opr_subc, &nasal_vm::opr_mulc, + &nasal_vm::opr_divc, &nasal_vm::opr_lnkc, + &nasal_vm::opr_addeq, &nasal_vm::opr_subeq, + &nasal_vm::opr_muleq, &nasal_vm::opr_diveq, + &nasal_vm::opr_lnkeq, &nasal_vm::opr_addeqc, + &nasal_vm::opr_subeqc, &nasal_vm::opr_muleqc, + &nasal_vm::opr_diveqc, &nasal_vm::opr_lnkeqc, + &nasal_vm::opr_meq, &nasal_vm::opr_eq, + &nasal_vm::opr_neq, &nasal_vm::opr_less, + &nasal_vm::opr_leq, &nasal_vm::opr_grt, + &nasal_vm::opr_geq, &nasal_vm::opr_lessc, + &nasal_vm::opr_leqc, &nasal_vm::opr_grtc, + &nasal_vm::opr_geqc, &nasal_vm::opr_pop, + &nasal_vm::opr_jmp, &nasal_vm::opr_jt, + &nasal_vm::opr_jf, &nasal_vm::opr_cnt, + &nasal_vm::opr_findex, &nasal_vm::opr_feach, + &nasal_vm::opr_callg, &nasal_vm::opr_calll, + &nasal_vm::opr_upval, &nasal_vm::opr_callv, + &nasal_vm::opr_callvi, &nasal_vm::opr_callh, + &nasal_vm::opr_callfv, &nasal_vm::opr_callfh, + &nasal_vm::opr_callb, &nasal_vm::opr_slcbeg, + &nasal_vm::opr_slcend, &nasal_vm::opr_slc, + &nasal_vm::opr_slc2, &nasal_vm::opr_mcallg, + &nasal_vm::opr_mcalll, &nasal_vm::opr_mupval, + &nasal_vm::opr_mcallv, &nasal_vm::opr_mcallh, + &nasal_vm::opr_ret + }; + std::vector code; + for(auto& i:gen.get_code()) + { + code.push_back(oprs[i.op]); + imm.push_back(i.num); + } + while(code[pc]){ + (this->*code[pc])(); + ++count[num]; + if(top>=canary) + break; + ++pc; + } +#endif vmexit: if(top>=canary) @@ -1007,6 +1065,8 @@ vmexit: gc.clear(); imm.clear(); return; + +#ifndef _MSC_VER // may cause stackoverflow #define exec_operand(op,num) {\ op();\ @@ -1092,5 +1152,6 @@ mupval: exec_operand(opr_mupval,op_mupval); // +1 mcallv: exec_opnodie(opr_mcallv,op_mcallv); // -0 mcallh: exec_opnodie(opr_mcallh,op_mcallh); // -0 ret: exec_opnodie(opr_ret ,op_ret ); // -2 +#endif } #endif \ No newline at end of file