first step trying to make this project compiled by MSVC: using indirect-threading, change `\e` to `\033`.

This commit is contained in:
ValKmjolnir 2022-07-16 01:02:33 +08:00
parent 29084143d6
commit f1f48b4881
5 changed files with 140 additions and 2 deletions

7
.gitignore vendored
View File

@ -31,6 +31,13 @@
*.out *.out
*.app *.app
# VS C++ sln
*.sln
*.vcxproj
*.vcxproj.filters
*.vcxproj.user
# misc
nasal nasal
.vscode .vscode
dump dump

View File

@ -2,7 +2,10 @@
#define __NASAL_H__ #define __NASAL_H__
#define __nasver "10.0" #define __nasver "10.0"
#ifndef _MSC_VER
#include <unistd.h> #include <unistd.h>
#include <dirent.h>
#endif
#include <cstdint> #include <cstdint>
#include <cstdlib> #include <cstdlib>
@ -26,7 +29,6 @@
#include <sys/stat.h> #include <sys/stat.h>
#include <fcntl.h> #include <fcntl.h>
#include <dirent.h>
#include <sys/timeb.h> #include <sys/timeb.h>
#ifdef _WIN32 #ifdef _WIN32
@ -160,7 +162,11 @@ std::string rawstr(const std::string& str,const size_t maxlen=0)
case '\v': ret+="\\v"; break; case '\v': ret+="\\v"; break;
case '\f': ret+="\\f"; break; case '\f': ret+="\\f"; break;
case '\r': ret+="\\r"; break; case '\r': ret+="\\r"; break;
#ifdef _MSC_VER
case '\033':ret+="\\e";break;
#else
case '\e': ret+="\\e"; break; case '\e': ret+="\\e"; break;
#endif
case '\"': ret+="\\\"";break; case '\"': ret+="\\\"";break;
case '\'': ret+="\\\'";break; case '\'': ret+="\\\'";break;
case '\\': ret+="\\\\";break; case '\\': ret+="\\\\";break;

View File

@ -181,6 +181,7 @@ void nasal_dbg::run(
detail_info=true; detail_info=true;
fsize=linker.get_file().size(); fsize=linker.get_file().size();
init(gen.get_strs(),gen.get_nums(),gen.get_code(),linker.get_file(),argv); init(gen.get_strs(),gen.get_nums(),gen.get_code(),linker.get_file(),argv);
#ifndef _MSC_VER
const void* oprs[]= const void* oprs[]=
{ {
&&vmexit, &&intg, &&intl, &&loadg, &&vmexit, &&intg, &&intl, &&loadg,
@ -211,6 +212,63 @@ void nasal_dbg::run(
} }
// goto the first operand // goto the first operand
goto *code[pc]; 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<const nafunc> 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: vmexit:
if(top>=canary) if(top>=canary)
@ -219,6 +277,7 @@ vmexit:
imm.clear(); imm.clear();
std::cout<<"[debug] debugger exited\n"; std::cout<<"[debug] debugger exited\n";
return; return;
#ifndef _MSC_VER
#define dbg(op) {interact();op();if(top<canary)goto *code[++pc];goto vmexit;} #define dbg(op) {interact();op();if(top<canary)goto *code[++pc];goto vmexit;}
intg: dbg(opr_intg ); intg: dbg(opr_intg );
@ -295,6 +354,7 @@ mupval: dbg(opr_mupval);
mcallv: dbg(opr_mcallv); mcallv: dbg(opr_mcallv);
mcallh: dbg(opr_mcallh); mcallh: dbg(opr_mcallh);
ret: dbg(opr_ret ); ret: dbg(opr_ret );
#endif
} }
#endif #endif

View File

@ -291,7 +291,11 @@ std::string nasal_lexer::str_gen()
case '0': str+='\0'; break; case '0': str+='\0'; break;
case 'a': str+='\a'; break; case 'a': str+='\a'; break;
case 'b': str+='\b'; break; case 'b': str+='\b'; break;
#ifdef _MSC_VER
case 'e': str+='\033'; break;
#else
case 'e': str+='\e'; break; case 'e': str+='\e'; break;
#endif
case 't': str+='\t'; break; case 't': str+='\t'; break;
case 'n': str+='\n'; break; case 'n': str+='\n'; break;
case 'v': str+='\v'; break; case 'v': str+='\v'; break;

View File

@ -965,6 +965,8 @@ void nasal_vm::run(
{ {
detail_info=detail; detail_info=detail;
init(gen.get_strs(),gen.get_nums(),gen.get_code(),linker.get_file(),argv); init(gen.get_strs(),gen.get_nums(),gen.get_code(),linker.get_file(),argv);
uint64_t count[op_ret+1]={0};
#ifndef _MSC_VER
const void* oprs[]= const void* oprs[]=
{ {
&&vmexit, &&intg, &&intl, &&loadg, &&vmexit, &&intg, &&intl, &&loadg,
@ -987,7 +989,6 @@ void nasal_vm::run(
&&slc2, &&mcallg, &&mcalll, &&mupval, &&slc2, &&mcallg, &&mcalll, &&mupval,
&&mcallv, &&mcallh, &&ret &&mcallv, &&mcallh, &&ret
}; };
uint64_t count[op_ret+1]={0};
std::vector<const void*> code; std::vector<const void*> code;
for(auto& i:gen.get_code()) for(auto& i:gen.get_code())
{ {
@ -996,6 +997,63 @@ void nasal_vm::run(
} }
// goto the first operand // goto the first operand
goto *code[pc]; 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<const nafunc> 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: vmexit:
if(top>=canary) if(top>=canary)
@ -1007,6 +1065,8 @@ vmexit:
gc.clear(); gc.clear();
imm.clear(); imm.clear();
return; return;
#ifndef _MSC_VER
// may cause stackoverflow // may cause stackoverflow
#define exec_operand(op,num) {\ #define exec_operand(op,num) {\
op();\ op();\
@ -1092,5 +1152,6 @@ mupval: exec_operand(opr_mupval,op_mupval); // +1
mcallv: exec_opnodie(opr_mcallv,op_mcallv); // -0 mcallv: exec_opnodie(opr_mcallv,op_mcallv); // -0
mcallh: exec_opnodie(opr_mcallh,op_mcallh); // -0 mcallh: exec_opnodie(opr_mcallh,op_mcallh); // -0
ret: exec_opnodie(opr_ret ,op_ret ); // -2 ret: exec_opnodie(opr_ret ,op_ret ); // -2
#endif
} }
#endif #endif