int main(int argc, char *argv[]) { printf("vm\n"); if(argc < 2) { printf("usage: %s <vm-file>\n", argv[0]); } else { FILE *fp; fp = fopen(argv[1], "rb"); if(fp == NULL) { printf("can't open file %s\n", argv[1]); } else { printf("opened file\n"); struct fn_node fn_root; struct vm_env env; fn_root = load_bytecode(fp, &env); fclose(fp); printf("dump:\n\n"); dump_bytecode(fn_root); eval_bc_fn(fn_root, &env, 0); free_bytecode(fn_root); } } return 0; }
static void dump( FILE *sourcefh, EcInt level, EC_OBJ obj ) { EC_OBJ sub; EcInt i; if (EC_NULLP(obj)) return; if (EC_ARRAYP(obj)) { IND0; ec_fprintf( stdout, "ARRAY %r:\n", obj ); fflush( stdout ); if (option_all) { for (i = 0; i < EC_ARRAYLEN(obj); i++) { sub = EcArrayGet( obj, i ); IND1; ec_fprintf( stdout, "ELEMENT %ld: %w\n", i, sub ); fflush( stdout ); dump( sourcefh, level + 1, sub ); fflush( stdout ); } } } else if (EC_PACKAGEP(obj)) { IND0; ec_fprintf( stdout, "PACKAGE %r:\n", obj ); fflush( stdout ); dump( sourcefh, level + 1, EC_PACKAGECODE(obj) ); fflush( stdout ); if (option_all) { for (i = 0; i < EC_PACKAGENEXPORT(obj); i++) { ec_fprintf( stdout, "\n" ); fflush( stdout ); sub = EcArrayGet( EC_PACKAGEFRAME(obj), EC_PACKAGEEXPORT(obj)[i].pos ); IND1; ec_fprintf( stdout, "EXPORTED %k at %ld: %w\n", EC_PACKAGEEXPORT(obj)[i].sym, (long)i, sub ); fflush( stdout ); dump( sourcefh, level + 1, sub ); fflush( stdout ); } dump( sourcefh, level + 1, EC_PACKAGEFRAME(obj) ); fflush( stdout ); } } else if (EC_COMPILEDP(obj)) { IND0; ec_fprintf( stdout, "BYTECODE %r:\n", obj ); fflush( stdout ); dump_bytecode( sourcefh, level + 1, obj, 0 ); fflush( stdout ); } else if (EC_HANDLERP(obj)) { IND0; ec_fprintf( stdout, "HANDLER %r:\n", obj ); fflush( stdout ); if (option_all) { dump( sourcefh, level + 1, EC_HANDLERCODE(obj) ); fflush( stdout ); } } else if (EC_CLASSP(obj)) { IND0; ec_fprintf( stdout, "CLASS %r:\n", obj ); fflush( stdout ); if (option_all) { EcUInt symid; for (i = 0; i < EC_CLASSNMETHODS(obj); i++) { symid = EC_CLASSMTABLE(obj)[i].symid; sub = EC_CLASSMTABLE(obj)[i].impl; IND1; ec_fprintf( stdout, "METHOD %k: %w\n", symid, sub ); fflush( stdout ); dump( sourcefh, level + 1, sub ); fflush( stdout ); } for (i = 0; i < EC_CLASSNCMETHODS(obj); i++) { symid = EC_CLASSCMTABLE(obj)[i].symid; sub = EC_CLASSCMTABLE(obj)[i].impl; IND1; ec_fprintf( stdout, "CLASS METHOD %k: %w\n", symid, sub ); fflush( stdout ); dump( sourcefh, level + 1, sub ); fflush( stdout ); } } } fflush( stdout ); }