void kp_table_dump(ktap_State *ks, Table *t) { int i, count = 0; kp_printf(ks, "{"); for (i = 0; i < t->sizearray; i++) { Tvalue *v = &t->array[i]; if (isnil(v)) continue; if (count) kp_printf(ks, ", "); kp_printf(ks, "(%d: ", i + 1); kp_showobj(ks, v); kp_printf(ks, ")"); count++; } for (i = 0; i < sizenode(t); i++) { Node *n = &t->node[i]; if (isnil(gkey(n))) continue; if (count) kp_printf(ks, ", "); kp_printf(ks, "("); kp_showobj(ks, gkey(n)); kp_printf(ks, ": "); kp_showobj(ks, gval(n)); kp_printf(ks, ")"); count++; } kp_printf(ks, "}"); }
static int ktap_lib_print(ktap_State *ks) { int i; int n = GetArgN(ks); for (i = 1; i <= n; i++) { Tvalue *arg = GetArg(ks, i); if (i > 1) kp_printf(ks, "\t"); kp_showobj(ks, arg); } kp_printf(ks, "\n"); return 0; }
static int ktap_lib_print(ktap_state *ks) { int i; int n = kp_arg_nr(ks); for (i = 1; i <= n; i++) { ktap_value *arg = kp_arg(ks, i); if (i > 1) kp_puts(ks, "\t"); kp_showobj(ks, arg); } kp_puts(ks, "\n"); return 0; }
/* this is a debug function used for check bytecode chunk file */ static void dump_function(int level, ktap_proto *f) { int i; printf("\n----------------------------------------------------\n"); printf("function %d [level %d]:\n", function_nr++, level); printf("linedefined: %d\n", f->linedefined); printf("lastlinedefined: %d\n", f->lastlinedefined); printf("numparams: %d\n", f->numparams); printf("is_vararg: %d\n", f->is_vararg); printf("maxstacksize: %d\n", f->maxstacksize); printf("source: %s\n", getstr(f->source)); printf("sizelineinfo: %d \t", f->sizelineinfo); for (i = 0; i < f->sizelineinfo; i++) printf("%d ", f->lineinfo[i]); printf("\n"); printf("sizek: %d\n", f->sizek); for (i = 0; i < f->sizek; i++) { switch(f->k[i].type) { case KTAP_TNIL: printf("\tNIL\n"); break; case KTAP_TBOOLEAN: printf("\tBOOLEAN: "); printf("%d\n", f->k[i].val.b); break; case KTAP_TNUMBER: printf("\tTNUMBER: "); printf("%ld\n", f->k[i].val.n); break; case KTAP_TSHRSTR: case KTAP_TLNGSTR: printf("\tTSTRING: "); printf("%s\n", svalue(&(f->k[i]))); break; default: printf("\tUnknow constant type %d: ", f->k[i].type); kp_showobj(NULL, &(f->k[i])); printf("\n"); } } printf("sizelocvars: %d\n", f->sizelocvars); for (i = 0; i < f->sizelocvars; i++) { printf("\tlocvars: %s startpc: %d endpc: %d\n", getstr(f->locvars[i].varname), f->locvars[i].startpc, f->locvars[i].endpc); } printf("sizeupvalues: %d\n", f->sizeupvalues); for (i = 0; i < f->sizeupvalues; i++) { printf("\tname: %s instack: %d idx: %d\n", getstr(f->upvalues[i].name), f->upvalues[i].instack, f->upvalues[i].idx); } printf("\n"); printf("sizecode: %d\n", f->sizecode); for (i = 0; i < f->sizecode; i++) decode_instruction(f, f->code[i]); printf("sizep: %d\n", f->sizep); for (i = 0; i < f->sizep; i++) dump_function(level + 1, f->p[i]); }
static void decode_instruction(ktap_proto *f, int instr) { int opcode = GET_OPCODE(instr); ktap_value *k; k = f->k; printf("%.8x\t", instr); printf("%s\t", ktap_opnames[opcode]); switch (opcode) { case OP_MOVE: printf("\t"); print_base(GETARG_A(instr)); printf(" <- "); print_base(GETARG_B(instr)); break; case OP_GETTABUP: print_base(GETARG_A(instr)); printf(" <- "); print_upvalue(GETARG_B(instr)); printf("{"); print_RKC(instr); printf("}"); break; case OP_GETTABLE: print_base(GETARG_A(instr)); printf(" <- "); print_base(GETARG_B(instr)); printf("{"); print_RKC(instr); printf("}"); break; case OP_SETTABLE: print_base(GETARG_A(instr)); printf("{"); print_RKB(instr); printf("}"); printf(" <- "); print_RKC(instr); break; case OP_LOADK: printf("\t"); print_base(GETARG_A(instr)); printf(" <- "); kp_showobj(NULL, k + GETARG_Bx(instr)); break; case OP_CALL: printf("\t"); print_base(GETARG_A(instr)); break; case OP_JMP: printf("\t%d", GETARG_sBx(instr)); break; case OP_CLOSURE: printf("\t"); print_base(GETARG_A(instr)); printf(" <- closure(func starts from line %d)", f->p[GETARG_Bx(instr)]->lineinfo[0]); break; case OP_SETTABUP: print_upvalue(GETARG_A(instr)); printf("{"); print_RKB(instr); printf("} <- "); print_RKC(instr); break; case OP_GETUPVAL: print_base(GETARG_A(instr)); printf(" <- "); print_upvalue(GETARG_B(instr)); break; case OP_NEWTABLE: print_base(GETARG_A(instr)); printf(" <- {}"); default: break; } printf("\n"); }