⚡ first step trying to make this project compiled by MSVC: using indirect-threading, change `\e` to `\033`.
This commit is contained in:
parent
29084143d6
commit
f1f48b4881
|
@ -31,6 +31,13 @@
|
|||
*.out
|
||||
*.app
|
||||
|
||||
# VS C++ sln
|
||||
*.sln
|
||||
*.vcxproj
|
||||
*.vcxproj.filters
|
||||
*.vcxproj.user
|
||||
|
||||
# misc
|
||||
nasal
|
||||
.vscode
|
||||
dump
|
8
nasal.h
8
nasal.h
|
@ -2,7 +2,10 @@
|
|||
#define __NASAL_H__
|
||||
#define __nasver "10.0"
|
||||
|
||||
#ifndef _MSC_VER
|
||||
#include <unistd.h>
|
||||
#include <dirent.h>
|
||||
#endif
|
||||
|
||||
#include <cstdint>
|
||||
#include <cstdlib>
|
||||
|
@ -26,7 +29,6 @@
|
|||
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <dirent.h>
|
||||
#include <sys/timeb.h>
|
||||
|
||||
#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;
|
||||
|
|
60
nasal_dbg.h
60
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<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:
|
||||
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<canary)goto *code[++pc];goto vmexit;}
|
||||
|
||||
intg: dbg(opr_intg );
|
||||
|
@ -295,6 +354,7 @@ mupval: dbg(opr_mupval);
|
|||
mcallv: dbg(opr_mcallv);
|
||||
mcallh: dbg(opr_mcallh);
|
||||
ret: dbg(opr_ret );
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif
|
|
@ -291,7 +291,11 @@ std::string nasal_lexer::str_gen()
|
|||
case '0': str+='\0'; break;
|
||||
case 'a': str+='\a'; break;
|
||||
case 'b': str+='\b'; break;
|
||||
#ifdef _MSC_VER
|
||||
case 'e': str+='\033'; break;
|
||||
#else
|
||||
case 'e': str+='\e'; break;
|
||||
#endif
|
||||
case 't': str+='\t'; break;
|
||||
case 'n': str+='\n'; break;
|
||||
case 'v': str+='\v'; break;
|
||||
|
|
63
nasal_vm.h
63
nasal_vm.h
|
@ -965,6 +965,8 @@ void nasal_vm::run(
|
|||
{
|
||||
detail_info=detail;
|
||||
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[]=
|
||||
{
|
||||
&&vmexit, &&intg, &&intl, &&loadg,
|
||||
|
@ -987,7 +989,6 @@ void nasal_vm::run(
|
|||
&&slc2, &&mcallg, &&mcalll, &&mupval,
|
||||
&&mcallv, &&mcallh, &&ret
|
||||
};
|
||||
uint64_t count[op_ret+1]={0};
|
||||
std::vector<const void*> 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<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:
|
||||
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
|
Loading…
Reference in New Issue