buzzvm_state CBuzzController::RegisterFunctions() { /* Pointer to this controller */ buzzvm_pushs(m_tBuzzVM, buzzvm_string_register(m_tBuzzVM, "controller")); buzzvm_pushuserdata(m_tBuzzVM, this); buzzvm_gstore(m_tBuzzVM); /* BuzzLOG */ buzzvm_pushs(m_tBuzzVM, buzzvm_string_register(m_tBuzzVM, "log")); buzzvm_pushcc(m_tBuzzVM, buzzvm_function_register(m_tBuzzVM, BuzzLOG)); buzzvm_gstore(m_tBuzzVM); /* BuzzDebug */ buzzvm_pushs(m_tBuzzVM, buzzvm_string_register(m_tBuzzVM, "debug")); buzzvm_pushcc(m_tBuzzVM, buzzvm_function_register(m_tBuzzVM, BuzzDebug)); buzzvm_gstore(m_tBuzzVM); return m_tBuzzVM->state; }
int buzzvm_vstig_create(buzzvm_t vm) { buzzvm_lnum_assert(vm, 1); /* Get vstig id */ buzzvm_lload(vm, 1); buzzvm_type_assert(vm, 1, BUZZTYPE_INT); uint16_t id = buzzvm_stack_at(vm, 1)->i.value; buzzvm_pop(vm); /* Look for virtual stigmergy */ buzzvstig_t* vs = buzzdict_get(vm->vstigs, &id, buzzvstig_t); if(vs) /* Found, destroy it */ buzzdict_remove(vm->vstigs, &id); /* Create a new virtual stigmergy */ buzzvstig_t nvs = buzzvstig_new(); buzzdict_set(vm->vstigs, &id, &nvs); /* Create a table and add data and methods */ buzzobj_t t = buzzheap_newobj(vm->heap, BUZZTYPE_TABLE); buzzvm_push(vm, t); buzzvm_pushs(vm, buzzvm_string_register(vm, "size")); buzzvm_pushcc(vm, buzzvm_function_register(vm, buzzvm_vstig_size)); buzzvm_tput(vm); buzzvm_push(vm, t); buzzvm_pushs(vm, buzzvm_string_register(vm, "put")); buzzvm_pushcc(vm, buzzvm_function_register(vm, buzzvm_vstig_put)); buzzvm_tput(vm); buzzvm_push(vm, t); buzzvm_pushs(vm, buzzvm_string_register(vm, "get")); buzzvm_pushcc(vm, buzzvm_function_register(vm, buzzvm_vstig_get)); buzzvm_tput(vm); buzzvm_push(vm, t); buzzvm_pushs(vm, buzzvm_string_register(vm, "onconflict")); buzzvm_pushcc(vm, buzzvm_function_register(vm, buzzvm_vstig_setonconflict)); buzzvm_tput(vm); buzzvm_push(vm, t); buzzvm_pushs(vm, buzzvm_string_register(vm, "onconflictlost")); buzzvm_pushcc(vm, buzzvm_function_register(vm, buzzvm_vstig_setonconflictlost)); buzzvm_tput(vm); buzzvm_push(vm, t); buzzvm_pushs(vm, buzzvm_string_register(vm, "id")); buzzvm_pushi(vm, id); buzzvm_tput(vm); /* Push the table on the stack */ buzzvm_push(vm, t); /* Return */ return buzzvm_ret1(vm); }
buzzvm_state CBuzzControllerFootBot::RegisterFunctions() { /* Register base functions */ CBuzzController::RegisterFunctions(); if(m_pcWheels) { /* BuzzSetWheels */ buzzvm_pushs(m_tBuzzVM, buzzvm_string_register(m_tBuzzVM, "set_wheels", 1)); buzzvm_pushcc(m_tBuzzVM, buzzvm_function_register(m_tBuzzVM, BuzzSetWheels)); buzzvm_gstore(m_tBuzzVM); /* BuzzGoTo */ buzzvm_pushs(m_tBuzzVM, buzzvm_string_register(m_tBuzzVM, "goto", 1)); buzzvm_pushcc(m_tBuzzVM, buzzvm_function_register(m_tBuzzVM, BuzzGoTo)); buzzvm_gstore(m_tBuzzVM); } if(m_pcLEDs) { /* BuzzSetLEDs */ buzzvm_pushs(m_tBuzzVM, buzzvm_string_register(m_tBuzzVM, "setleds", 1)); buzzvm_pushcc(m_tBuzzVM, buzzvm_function_register(m_tBuzzVM, BuzzSetLEDs)); buzzvm_gstore(m_tBuzzVM); } return m_tBuzzVM->state; }
int buzzvstig_register(struct buzzvm_s* vm) { /* Push 'stigmergy' table */ buzzvm_pushs(vm, buzzvm_string_register(vm, "stigmergy", 1)); buzzvm_pusht(vm); /* Add 'create' function */ buzzvm_dup(vm); buzzvm_pushs(vm, buzzvm_string_register(vm, "create", 1)); buzzvm_pushcc(vm, buzzvm_function_register(vm, buzzvstig_create)); buzzvm_tput(vm); /* Register the 'stigmergy' table */ buzzvm_gstore(vm); return vm->state; }
buzzvm_state CBuzzControllerEFootBot::RegisterFunctions() { /* Register base functions */ CBuzzController::RegisterFunctions(); Register("robot_type", 99); if(m_pcWheels) { /* BuzzSetWheelsFb */ buzzvm_pushs(m_tBuzzVM, buzzvm_string_register(m_tBuzzVM, "set_wheels", 1)); buzzvm_pushcc(m_tBuzzVM, buzzvm_function_register(m_tBuzzVM, BuzzSetWheelsFb)); buzzvm_gstore(m_tBuzzVM); /* BuzzGoTo */ buzzvm_pushs(m_tBuzzVM, buzzvm_string_register(m_tBuzzVM, "goto", 1)); buzzvm_pushcc(m_tBuzzVM, buzzvm_function_register(m_tBuzzVM, BuzzGoTo)); buzzvm_gstore(m_tBuzzVM); /* BuzzGet */ } if(m_pcLEDs) { /* BuzzSetLEDsFb */ buzzvm_pushs(m_tBuzzVM, buzzvm_string_register(m_tBuzzVM, "setleds", 1)); buzzvm_pushcc(m_tBuzzVM, buzzvm_function_register(m_tBuzzVM, BuzzSetLEDsFb)); buzzvm_gstore(m_tBuzzVM); } /* BuzzStartCharging */ if(m_batterySensor) { buzzvm_pushs(m_tBuzzVM, buzzvm_string_register(m_tBuzzVM, "start_charging", 1)); buzzvm_pushcc(m_tBuzzVM, buzzvm_function_register(m_tBuzzVM, BuzzStartCharging)); buzzvm_gstore(m_tBuzzVM); } /* BuzzStopCharging */ if(m_batterySensor) { buzzvm_pushs(m_tBuzzVM, buzzvm_string_register(m_tBuzzVM, "stop_charging", 1)); buzzvm_pushcc(m_tBuzzVM, buzzvm_function_register(m_tBuzzVM, BuzzStopCharging)); buzzvm_gstore(m_tBuzzVM); } /* BuzzStartProcessing */ if(m_batterySensor) { buzzvm_pushs(m_tBuzzVM, buzzvm_string_register(m_tBuzzVM, "start_processing", 1)); buzzvm_pushcc(m_tBuzzVM, buzzvm_function_register(m_tBuzzVM, BuzzStartProcessing)); buzzvm_gstore(m_tBuzzVM); } /* BuzzStopProcessing */ if(m_batterySensor) { buzzvm_pushs(m_tBuzzVM, buzzvm_string_register(m_tBuzzVM, "stop_processing", 1)); buzzvm_pushcc(m_tBuzzVM, buzzvm_function_register(m_tBuzzVM, BuzzStopProcessing)); buzzvm_gstore(m_tBuzzVM); } return m_tBuzzVM->state; }
int main(int argc, char** argv) { /* Parse command line */ if(argc != 2) { fprintf(stderr, "Usage:\n\t%s <file.bo>\n\n", argv[0]); return 0; } /* Open file */ int fd = open(argv[1], O_RDONLY); if(fd < 0) perror(argv[1]); /* Read data */ size_t bcode_size = lseek(fd, 0, SEEK_END); lseek(fd, 0, SEEK_SET); uint8_t* bcode_buf = (uint8_t*)malloc(bcode_size); ssize_t rd; size_t tot = 0; while(tot < bcode_size) { rd = read(fd, bcode_buf + tot, bcode_size - tot); if(rd < 0) perror(argv[1]); tot += rd; } close(fd); /* Create new VM */ buzzvm_t vm = buzzvm_new(1); /* Set byte code */ buzzvm_set_bcode(vm, bcode_buf, bcode_size); /* Register hook function */ buzzvm_pushs(vm, buzzvm_string_register(vm, "hook")); buzzvm_pushcc(vm, buzzvm_function_register(vm, hook)); buzzvm_gstore(vm); /* Run byte code and dump state */ do dump(vm); while(buzzvm_step(vm) == BUZZVM_STATE_READY); if(vm->state == BUZZVM_STATE_DONE) { dump(vm); fprintf(stdout, "%s: execution terminated correctly\n\n", argv[1]); } else { fprintf(stderr, "%s: execution terminated abnormally: %s\n\n", argv[1], buzzvm_error_desc[vm->error]); } /* Destroy VM */ free(bcode_buf); buzzvm_destroy(&vm); return 0; }
buzzvm_state CBuzzControllerFootBot::RegisterFunctions() { /* Register base functions */ CBuzzController::RegisterFunctions(); if(m_pcWheels) { /* BuzzSetWheels */ buzzvm_pushs(m_tBuzzVM, buzzvm_string_register(m_tBuzzVM, "set_wheels", 1)); buzzvm_pushcc(m_tBuzzVM, buzzvm_function_register(m_tBuzzVM, BuzzSetWheels)); buzzvm_gstore(m_tBuzzVM); /* BuzzGoTo with Cartesian coordinates */ buzzvm_pushs(m_tBuzzVM, buzzvm_string_register(m_tBuzzVM, "goto", 1)); buzzvm_pushcc(m_tBuzzVM, buzzvm_function_register(m_tBuzzVM, BuzzGoToC)); buzzvm_gstore(m_tBuzzVM); buzzvm_pushs(m_tBuzzVM, buzzvm_string_register(m_tBuzzVM, "gotoc", 1)); buzzvm_pushcc(m_tBuzzVM, buzzvm_function_register(m_tBuzzVM, BuzzGoToC)); buzzvm_gstore(m_tBuzzVM); /* BuzzGoTo with Polar coordinates */ buzzvm_pushs(m_tBuzzVM, buzzvm_string_register(m_tBuzzVM, "gotop", 1)); buzzvm_pushcc(m_tBuzzVM, buzzvm_function_register(m_tBuzzVM, BuzzGoToP)); buzzvm_gstore(m_tBuzzVM); } if(m_pcLEDs) { /* BuzzSetLEDs */ buzzvm_pushs(m_tBuzzVM, buzzvm_string_register(m_tBuzzVM, "set_leds", 1)); buzzvm_pushcc(m_tBuzzVM, buzzvm_function_register(m_tBuzzVM, BuzzSetLEDs)); buzzvm_gstore(m_tBuzzVM); } if(m_pcCamera) { /* BuzzCameraEnable */ buzzvm_pushs(m_tBuzzVM, buzzvm_string_register(m_tBuzzVM, "camera_enable", 1)); buzzvm_pushcc(m_tBuzzVM, buzzvm_function_register(m_tBuzzVM, BuzzCameraEnable)); buzzvm_gstore(m_tBuzzVM); } if(m_pcCamera) { /* BuzzCameraDisable */ buzzvm_pushs(m_tBuzzVM, buzzvm_string_register(m_tBuzzVM, "camera_disable", 1)); buzzvm_pushcc(m_tBuzzVM, buzzvm_function_register(m_tBuzzVM, BuzzCameraDisable)); buzzvm_gstore(m_tBuzzVM); } return m_tBuzzVM->state; }
buzzvm_state CBuzzControllerSpiri::RegisterFunctions() { /* Register base functions */ if(CBuzzController::RegisterFunctions() != BUZZVM_STATE_READY) return m_tBuzzVM->state; /* BuzzTakeOff */ if(m_pcPropellers && m_pcPosition) { buzzvm_pushs(m_tBuzzVM, buzzvm_string_register(m_tBuzzVM, "takeoff", 1)); buzzvm_pushcc(m_tBuzzVM, buzzvm_function_register(m_tBuzzVM, BuzzTakeOff)); buzzvm_gstore(m_tBuzzVM); } /* BuzzLand */ if(m_pcPropellers && m_pcPosition) { buzzvm_pushs(m_tBuzzVM, buzzvm_string_register(m_tBuzzVM, "land", 1)); buzzvm_pushcc(m_tBuzzVM, buzzvm_function_register(m_tBuzzVM, BuzzLand)); buzzvm_gstore(m_tBuzzVM); } /* BuzzGoTo */ if(m_pcPropellers) { buzzvm_pushs(m_tBuzzVM, buzzvm_string_register(m_tBuzzVM, "goto", 1)); buzzvm_pushcc(m_tBuzzVM, buzzvm_function_register(m_tBuzzVM, BuzzGoTo)); buzzvm_gstore(m_tBuzzVM); } /* BuzzRotate */ if(m_pcPropellers) { buzzvm_pushs(m_tBuzzVM, buzzvm_string_register(m_tBuzzVM, "rotate", 1)); buzzvm_pushcc(m_tBuzzVM, buzzvm_function_register(m_tBuzzVM, BuzzRotate)); buzzvm_gstore(m_tBuzzVM); } /* BuzzCameraEnable */ if(m_pcCamera) { buzzvm_pushs(m_tBuzzVM, buzzvm_string_register(m_tBuzzVM, "camera_enable", 1)); buzzvm_pushcc(m_tBuzzVM, buzzvm_function_register(m_tBuzzVM, BuzzCameraEnable)); buzzvm_gstore(m_tBuzzVM); } /* BuzzCameraDisable */ if(m_pcCamera) { buzzvm_pushs(m_tBuzzVM, buzzvm_string_register(m_tBuzzVM, "camera_disable", 1)); buzzvm_pushcc(m_tBuzzVM, buzzvm_function_register(m_tBuzzVM, BuzzCameraDisable)); buzzvm_gstore(m_tBuzzVM); } return m_tBuzzVM->state; }
buzzvm_state CBuzzControllerFootBot::RegisterFunctions() { /* Register base functions */ CBuzzController::RegisterFunctions(); if(m_pcWheels) { /* BuzzSetWheels */ buzzvm_pushs(m_tBuzzVM, buzzvm_string_register(m_tBuzzVM, "set_wheels", 1)); buzzvm_pushcc(m_tBuzzVM, buzzvm_function_register(m_tBuzzVM, BuzzSetWheels)); buzzvm_gstore(m_tBuzzVM); /* BuzzGoTo with Cartesian coordinates */ buzzvm_pushs(m_tBuzzVM, buzzvm_string_register(m_tBuzzVM, "goto", 1)); buzzvm_pushcc(m_tBuzzVM, buzzvm_function_register(m_tBuzzVM, BuzzGoToC)); buzzvm_gstore(m_tBuzzVM); buzzvm_pushs(m_tBuzzVM, buzzvm_string_register(m_tBuzzVM, "gotoc", 1)); buzzvm_pushcc(m_tBuzzVM, buzzvm_function_register(m_tBuzzVM, BuzzGoToC)); buzzvm_gstore(m_tBuzzVM); /* BuzzGoTo with Polar coordinates */ buzzvm_pushs(m_tBuzzVM, buzzvm_string_register(m_tBuzzVM, "gotop", 1)); buzzvm_pushcc(m_tBuzzVM, buzzvm_function_register(m_tBuzzVM, BuzzGoToP)); buzzvm_gstore(m_tBuzzVM); } if(m_pcLEDs) { /* BuzzSetLEDs */ buzzvm_pushs(m_tBuzzVM, buzzvm_string_register(m_tBuzzVM, "set_leds", 1)); buzzvm_pushcc(m_tBuzzVM, buzzvm_function_register(m_tBuzzVM, BuzzSetLEDs)); buzzvm_gstore(m_tBuzzVM); } if(m_pcCamera) { /* BuzzCameraEnable */ buzzvm_pushs(m_tBuzzVM, buzzvm_string_register(m_tBuzzVM, "camera_enable", 1)); buzzvm_pushcc(m_tBuzzVM, buzzvm_function_register(m_tBuzzVM, BuzzCameraEnable)); buzzvm_gstore(m_tBuzzVM); } if(m_pcCamera) { /* BuzzCameraDisable */ buzzvm_pushs(m_tBuzzVM, buzzvm_string_register(m_tBuzzVM, "camera_disable", 1)); buzzvm_pushcc(m_tBuzzVM, buzzvm_function_register(m_tBuzzVM, BuzzCameraDisable)); buzzvm_gstore(m_tBuzzVM); } /* BuzzSetMap */ buzzvm_pushs(m_tBuzzVM, buzzvm_string_register(m_tBuzzVM, "set_argos_string_map", 1)); buzzvm_pushcc(m_tBuzzVM, buzzvm_function_register(m_tBuzzVM, BuzzSetArgosMap)); buzzvm_gstore(m_tBuzzVM); /* DrawCoorinateSystem */ buzzvm_pushs(m_tBuzzVM, buzzvm_string_register(m_tBuzzVM, "show_coordinate_system", 1)); buzzvm_pushcc(m_tBuzzVM, buzzvm_function_register(m_tBuzzVM, BuzzShowCoordinateSystem)); buzzvm_gstore(m_tBuzzVM); /* Get border robots */ buzzvm_pushs(m_tBuzzVM, buzzvm_string_register(m_tBuzzVM, "show_border_robots", 1)); buzzvm_pushcc(m_tBuzzVM, buzzvm_function_register(m_tBuzzVM, BuzzShowBorderRobots)); buzzvm_gstore(m_tBuzzVM); /* remove CS */ buzzvm_pushs(m_tBuzzVM, buzzvm_string_register(m_tBuzzVM, "remove_coordinate_system", 1)); buzzvm_pushcc(m_tBuzzVM, buzzvm_function_register(m_tBuzzVM, BuzzRemoveCS)); buzzvm_gstore(m_tBuzzVM); /* read map */ buzzvm_pushs(m_tBuzzVM, buzzvm_string_register(m_tBuzzVM, "set_argos_map", 1)); buzzvm_pushcc(m_tBuzzVM, buzzvm_function_register(m_tBuzzVM, BuzzSetMap)); buzzvm_gstore(m_tBuzzVM); buzzvm_pushs(m_tBuzzVM, buzzvm_string_register(m_tBuzzVM, "set_argos_path", 1)); buzzvm_pushcc(m_tBuzzVM, buzzvm_function_register(m_tBuzzVM, BuzzSetPath)); buzzvm_gstore(m_tBuzzVM); buzzvm_pushs(m_tBuzzVM, buzzvm_string_register(m_tBuzzVM, "draw_obstacles", 1)); buzzvm_pushcc(m_tBuzzVM, buzzvm_function_register(m_tBuzzVM, BuzzDrawObstacles)); buzzvm_gstore(m_tBuzzVM); return m_tBuzzVM->state; }
int main(int argc, char** argv) { /* The bytecode filename */ char* bcfname; /* The debugging information file name */ char* dbgfname; /* Whether or not to show the assembly information */ int trace = 0; /* Parse command line */ if(argc < 3 || argc > 4) usage(argv[0], 0); if(argc == 3) { bcfname = argv[1]; dbgfname = argv[2]; } else { bcfname = argv[2]; dbgfname = argv[3]; if(strcmp(argv[1], "--trace") != 0) { fprintf(stderr, "error: %s: unrecognized option '%s'\n", argv[0], argv[1]); usage(argv[0], 1); } trace = 1; } /* Read bytecode and fill in data structure */ FILE* fd = fopen(bcfname, "rb"); if(!fd) perror(bcfname); fseek(fd, 0, SEEK_END); size_t bcode_size = ftell(fd); rewind(fd); uint8_t* bcode_buf = (uint8_t*)malloc(bcode_size); if(fread(bcode_buf, 1, bcode_size, fd) < bcode_size) { perror(bcfname); } fclose(fd); /* Read debug information */ buzzdebug_t dbg_buf = buzzdebug_new(); if(!buzzdebug_fromfile(dbg_buf, dbgfname)) { perror(dbgfname); } /* Create new VM */ buzzvm_t vm = buzzvm_new(1); /* Set byte code */ buzzvm_set_bcode(vm, bcode_buf, bcode_size); /* Register hook functions */ buzzvm_pushs(vm, buzzvm_string_register(vm, "print", 1)); buzzvm_pushcc(vm, buzzvm_function_register(vm, print)); buzzvm_gstore(vm); /* Run byte code */ do if(trace) buzzdebug_stack_dump(vm, 1, stdout); while(buzzvm_step(vm) == BUZZVM_STATE_READY); /* Done running, check final state */ int retval; if(vm->state == BUZZVM_STATE_DONE) { /* Execution terminated without errors */ if(trace) buzzdebug_stack_dump(vm, 1, stdout); fprintf(stdout, "%s: execution terminated correctly\n\n", bcfname); retval = 0; } else { /* Execution terminated with errors */ if(trace) buzzdebug_stack_dump(vm, 1, stdout); buzzdebug_entry_t dbg = *buzzdebug_info_get_fromoffset(dbg_buf, &vm->pc); if(dbg != NULL) { fprintf(stderr, "%s: execution terminated abnormally at %s:%" PRIu64 ":%" PRIu64 " : %s\n\n", bcfname, dbg->fname, dbg->line, dbg->col, vm->errormsg); } else { fprintf(stderr, "%s: execution terminated abnormally at bytecode offset %d: %s\n\n", bcfname, vm->pc, vm->errormsg); } retval = 1; } /* Destroy VM */ free(bcode_buf); buzzdebug_destroy(&dbg_buf); buzzvm_destroy(&vm); /* All done */ return retval; }
buzzvm_state CBuzzController::RegisterFunctions() { /* * Pointer to this controller */ buzzvm_pushs(m_tBuzzVM, buzzvm_string_register(m_tBuzzVM, "controller", 1)); buzzvm_pushu(m_tBuzzVM, this); buzzvm_gstore(m_tBuzzVM); /* * BuzzLOG */ buzzvm_pushs(m_tBuzzVM, buzzvm_string_register(m_tBuzzVM, "log", 1)); buzzvm_pushcc(m_tBuzzVM, buzzvm_function_register(m_tBuzzVM, BuzzLOG)); buzzvm_gstore(m_tBuzzVM); /* * Buzz debug facilities */ /* Initialize debug table */ buzzvm_pushs(m_tBuzzVM, buzzvm_string_register(m_tBuzzVM, "debug", 1)); buzzvm_pusht(m_tBuzzVM); /* debug.print() */ buzzvm_dup(m_tBuzzVM); buzzvm_pushs(m_tBuzzVM, buzzvm_string_register(m_tBuzzVM, "print", 1)); buzzvm_pushcc(m_tBuzzVM, buzzvm_function_register(m_tBuzzVM, BuzzDebugPrint)); buzzvm_tput(m_tBuzzVM); /* Initialize debug.rays table */ buzzvm_dup(m_tBuzzVM); buzzvm_pushs(m_tBuzzVM, buzzvm_string_register(m_tBuzzVM, "rays", 1)); buzzvm_pusht(m_tBuzzVM); /* debug.rays.add() */ buzzvm_dup(m_tBuzzVM); buzzvm_pushs(m_tBuzzVM, buzzvm_string_register(m_tBuzzVM, "add", 1)); buzzvm_pushcc(m_tBuzzVM, buzzvm_function_register(m_tBuzzVM, BuzzDebugRayAdd)); buzzvm_tput(m_tBuzzVM); /* debug.rays.clear() */ buzzvm_dup(m_tBuzzVM); buzzvm_pushs(m_tBuzzVM, buzzvm_string_register(m_tBuzzVM, "clear", 1)); buzzvm_pushcc(m_tBuzzVM, buzzvm_function_register(m_tBuzzVM, BuzzDebugRayClear)); buzzvm_tput(m_tBuzzVM); /* Finalize debug.rays table */ buzzvm_tput(m_tBuzzVM); if(m_pcPos != NULL) { /* Initialize debug.trajectory table */ buzzvm_dup(m_tBuzzVM); buzzvm_pushs(m_tBuzzVM, buzzvm_string_register(m_tBuzzVM, "trajectory", 1)); buzzvm_pusht(m_tBuzzVM); /* debug.trajectory.enable() */ buzzvm_dup(m_tBuzzVM); buzzvm_pushs(m_tBuzzVM, buzzvm_string_register(m_tBuzzVM, "enable", 1)); buzzvm_pushcc(m_tBuzzVM, buzzvm_function_register(m_tBuzzVM, BuzzDebugTrajectoryEnable)); buzzvm_tput(m_tBuzzVM); /* debug.trajectory.disable() */ buzzvm_dup(m_tBuzzVM); buzzvm_pushs(m_tBuzzVM, buzzvm_string_register(m_tBuzzVM, "disable", 1)); buzzvm_pushcc(m_tBuzzVM, buzzvm_function_register(m_tBuzzVM, BuzzDebugTrajectoryDisable)); buzzvm_tput(m_tBuzzVM); /* debug.trajectory.clear() */ buzzvm_dup(m_tBuzzVM); buzzvm_pushs(m_tBuzzVM, buzzvm_string_register(m_tBuzzVM, "clear", 1)); buzzvm_pushcc(m_tBuzzVM, buzzvm_function_register(m_tBuzzVM, BuzzDebugTrajectoryClear)); buzzvm_tput(m_tBuzzVM); /* Finalize debug.trajectory table */ buzzvm_tput(m_tBuzzVM); } /* Finalize debug table */ buzzvm_gstore(m_tBuzzVM); return m_tBuzzVM->state; }
buzzvm_state buzzvm_step(buzzvm_t vm) { /* buzzvm_dump(vm); */ /* Can't execute if not ready */ if(vm->state != BUZZVM_STATE_READY) return vm->state; /* Execute GC */ buzzheap_gc(vm); /* Fetch instruction and (potential) argument */ uint8_t instr = vm->bcode[vm->pc]; /* Execute instruction */ switch(instr) { case BUZZVM_INSTR_NOP: { inc_pc(); break; } case BUZZVM_INSTR_DONE: { buzzvm_done(vm); break; } case BUZZVM_INSTR_PUSHNIL: { inc_pc(); buzzvm_pushnil(vm); break; } case BUZZVM_INSTR_DUP: { inc_pc(); buzzvm_dup(vm); break; } case BUZZVM_INSTR_POP: { if(buzzvm_pop(vm) != BUZZVM_STATE_READY) return vm->state; inc_pc(); break; } case BUZZVM_INSTR_RET0: { if(buzzvm_ret0(vm) != BUZZVM_STATE_READY) return vm->state; assert_pc(vm->pc); break; } case BUZZVM_INSTR_RET1: { if(buzzvm_ret1(vm) != BUZZVM_STATE_READY) return vm->state; assert_pc(vm->pc); break; } case BUZZVM_INSTR_ADD: { buzzvm_add(vm); inc_pc(); break; } case BUZZVM_INSTR_SUB: { buzzvm_sub(vm); inc_pc(); break; } case BUZZVM_INSTR_MUL: { buzzvm_mul(vm); inc_pc(); break; } case BUZZVM_INSTR_DIV: { buzzvm_div(vm); inc_pc(); break; } case BUZZVM_INSTR_MOD: { buzzvm_mod(vm); inc_pc(); break; } case BUZZVM_INSTR_POW: { buzzvm_pow(vm); inc_pc(); break; } case BUZZVM_INSTR_UNM: { buzzvm_unm(vm); inc_pc(); break; } case BUZZVM_INSTR_AND: { buzzvm_and(vm); inc_pc(); break; } case BUZZVM_INSTR_OR: { buzzvm_or(vm); inc_pc(); break; } case BUZZVM_INSTR_NOT: { buzzvm_not(vm); inc_pc(); break; } case BUZZVM_INSTR_EQ: { buzzvm_eq(vm); inc_pc(); break; } case BUZZVM_INSTR_NEQ: { buzzvm_neq(vm); inc_pc(); break; } case BUZZVM_INSTR_GT: { buzzvm_gt(vm); inc_pc(); break; } case BUZZVM_INSTR_GTE: { buzzvm_gte(vm); inc_pc(); break; } case BUZZVM_INSTR_LT: { buzzvm_lt(vm); inc_pc(); break; } case BUZZVM_INSTR_LTE: { buzzvm_lte(vm); inc_pc(); break; } case BUZZVM_INSTR_GLOAD: { inc_pc(); buzzvm_gload(vm); break; } case BUZZVM_INSTR_GSTORE: { inc_pc(); if(buzzvm_gstore(vm) != BUZZVM_STATE_READY) return vm->state; break; } case BUZZVM_INSTR_PUSHT: { buzzvm_pusht(vm); inc_pc(); break; } case BUZZVM_INSTR_TPUT: { if(buzzvm_tput(vm) != BUZZVM_STATE_READY) return vm->state; inc_pc(); break; } case BUZZVM_INSTR_TGET: { if(buzzvm_tget(vm) != BUZZVM_STATE_READY) return vm->state; inc_pc(); break; } case BUZZVM_INSTR_CALLC: { inc_pc(); if(buzzvm_callc(vm) != BUZZVM_STATE_READY) return vm->state; assert_pc(vm->pc); break; } case BUZZVM_INSTR_CALLS: { inc_pc(); if(buzzvm_calls(vm) != BUZZVM_STATE_READY) return vm->state; assert_pc(vm->pc); break; } case BUZZVM_INSTR_PUSHF: { inc_pc(); get_arg(float); if(buzzvm_pushf(vm, arg) != BUZZVM_STATE_READY) return vm->state; break; } case BUZZVM_INSTR_PUSHI: { inc_pc(); get_arg(int32_t); if(buzzvm_pushi(vm, arg) != BUZZVM_STATE_READY) return vm->state; break; } case BUZZVM_INSTR_PUSHS: { inc_pc(); get_arg(int32_t); if(buzzvm_pushs(vm, arg) != BUZZVM_STATE_READY) return vm->state; break; } case BUZZVM_INSTR_PUSHCN: { inc_pc(); get_arg(uint32_t); if(buzzvm_pushcn(vm, arg) != BUZZVM_STATE_READY) return vm->state; break; } case BUZZVM_INSTR_PUSHCC: { inc_pc(); get_arg(uint32_t); if(buzzvm_pushcc(vm, arg) != BUZZVM_STATE_READY) return vm->state; break; } case BUZZVM_INSTR_PUSHL: { inc_pc(); get_arg(uint32_t); if(buzzvm_pushl(vm, arg) != BUZZVM_STATE_READY) return vm->state; break; } case BUZZVM_INSTR_LLOAD: { inc_pc(); get_arg(uint32_t); buzzvm_lload(vm, arg); break; } case BUZZVM_INSTR_LSTORE: { inc_pc(); get_arg(uint32_t); buzzvm_lstore(vm, arg); break; } case BUZZVM_INSTR_JUMP: { inc_pc(); get_arg(uint32_t); vm->pc = arg; assert_pc(vm->pc); break; } case BUZZVM_INSTR_JUMPZ: { inc_pc(); get_arg(uint32_t); buzzvm_stack_assert(vm, 1); if(buzzvm_stack_at(vm, 1)->o.type == BUZZTYPE_NIL || (buzzvm_stack_at(vm, 1)->o.type == BUZZTYPE_INT && buzzvm_stack_at(vm, 1)->i.value == 0)) { vm->pc = arg; assert_pc(vm->pc); } buzzvm_pop(vm); break; } case BUZZVM_INSTR_JUMPNZ: { inc_pc(); get_arg(uint32_t); buzzvm_stack_assert(vm, 1); if(buzzvm_stack_at(vm, 1)->o.type != BUZZTYPE_NIL && (buzzvm_stack_at(vm, 1)->o.type != BUZZTYPE_INT || buzzvm_stack_at(vm, 1)->i.value != 0)) { vm->pc = arg; assert_pc(vm->pc); } buzzvm_pop(vm); break; } default: buzzvm_seterror(vm, BUZZVM_ERROR_INSTR, NULL); break; } return vm->state; }