FOR_BC
This commit is contained in:
parent
a6d15846f6
commit
f922aa2422
19
src/vm.c
19
src/vm.c
@ -33,8 +33,13 @@ enum {
|
||||
RETD = 29, // return a namespace of exported items
|
||||
SYSV = 30, // N; get system function N
|
||||
LOCU = 31, // N0,N1; like LOCO but overrides the slot with bi_optOut
|
||||
BC_SIZE = 32
|
||||
};
|
||||
|
||||
#define FOR_BC(F) F(PUSH) F(VARO) F(VARM) F(ARRO) F(ARRM) F(FN1C) F(FN2C) F(OP1D) F(OP2D) F(TR2D) \
|
||||
F(TR3D) F(SETN) F(SETU) F(SETM) F(POPS) F(DFND) F(FN1O) F(FN2O) F(CHKV) F(TR3O) \
|
||||
F(OP2H) F(LOCO) F(LOCM) F(VFYM) F(SETH) F(RETN) F(FLDO) F(FLDM) F(NSPM) F(RETD) F(SYSV) F(LOCU)
|
||||
|
||||
i32* nextBC(i32* p) {
|
||||
switch(*p) {
|
||||
case PUSH: case DFND: case ARRO: case ARRM:
|
||||
@ -69,14 +74,9 @@ i32 stackDiff(i32* p) {
|
||||
}
|
||||
char* nameBC(i32* p) {
|
||||
switch(*p) { default: return "(unknown)";
|
||||
case PUSH:return "PUSH";case VARO:return "VARO";case VARM:return "VARM";case ARRO:return "ARRO";
|
||||
case ARRM:return "ARRM";case FN1C:return "FN1C";case FN2C:return "FN2C";case OP1D:return "OP1D";
|
||||
case OP2D:return "OP2D";case TR2D:return "TR2D";case TR3D:return "TR3D";case SETN:return "SETN";
|
||||
case SETU:return "SETU";case SETM:return "SETM";case POPS:return "POPS";case DFND:return "DFND";
|
||||
case FN1O:return "FN1O";case FN2O:return "FN2O";case CHKV:return "CHKV";case TR3O:return "TR3O";
|
||||
case OP2H:return "OP2H";case LOCO:return "LOCO";case LOCM:return "LOCM";case VFYM:return "VFYM";
|
||||
case SETH:return "SETH";case RETN:return "RETN";case FLDO:return "FLDO";case FLDM:return "FLDM";
|
||||
case NSPM:return "NSPM";case RETD:return "RETD";case SYSV:return "SYSV";case LOCU:return "LOCU";
|
||||
#define F(X) case X: return #X;
|
||||
FOR_BC(F)
|
||||
#undef F
|
||||
}
|
||||
}
|
||||
void printBC(i32* p) {
|
||||
@ -286,6 +286,7 @@ B evalBC(Body* b, Scope* sc) { // doesn't consume
|
||||
#define P(N) B N=POP;
|
||||
#define ADD(X) { B tr=X; *(gStack++) = tr; } // if ordering is needed
|
||||
// #define ADD(X) *(gStack++) = X; } // if ordering is not needed
|
||||
|
||||
while(true) {
|
||||
#ifdef DEBUG_VM
|
||||
i32* sbc = bc;
|
||||
@ -295,7 +296,7 @@ B evalBC(Body* b, Scope* sc) { // doesn't consume
|
||||
printBC(sbc); printf("@%d << ", bcPos);
|
||||
for (i32 i = 0; i < b->maxStack; i++) { if(i)printf(" ⋄ "); print(gStack[i]); } puts(""); fflush(stdout);
|
||||
bcCtr++;
|
||||
for (i32 i = 0; i < sc->varAm; i++) validate(sc->vars[i]);
|
||||
for (i32 i = 0; i < sc->varAm; i++) VALIDATE(sc->vars[i]);
|
||||
#endif
|
||||
switch(*bc++) {
|
||||
case POPS: dec(POP); break;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user