void invokeSelector(EngineState *s, reg_t object, int selectorId, int k_argc, StackPtr k_argp, int argc, const reg_t *argv) { int i; int framesize = 2 + 1 * argc; int slc_type; StackPtr stackframe = k_argp + k_argc; stackframe[0] = make_reg(0, selectorId); // The selector we want to call stackframe[1] = make_reg(0, argc); // Argument count slc_type = lookupSelector(s->_segMan, object, selectorId, NULL, NULL); if (slc_type == kSelectorNone) { error("Selector '%s' of object at %04x:%04x could not be invoked", g_sci->getKernel()->getSelectorName(selectorId).c_str(), PRINT_REG(object)); } if (slc_type == kSelectorVariable) { error("Attempting to invoke variable selector %s of object %04x:%04x", g_sci->getKernel()->getSelectorName(selectorId).c_str(), PRINT_REG(object)); } for (i = 0; i < argc; i++) stackframe[2 + i] = argv[i]; // Write each argument ExecStack *xstack; // Now commit the actual function: xstack = send_selector(s, object, object, stackframe, framesize, stackframe); xstack->sp += argc + 2; xstack->fp += argc + 2; run_vm(s); // Start a new vm }
void Display::on_key_down(SDL_KeyboardEvent &e) { switch(e.keysym.sym) { case SDLK_ESCAPE: sdl->quit(); break; case SDLK_PAGEUP: if(current != NULL) current->display->pageup(); break; case SDLK_PAGEDOWN: if(current != NULL) current->display->pagedown(); break; case SDLK_RCTRL: case SDLK_LCTRL: state.key_ctrl = true; break; default: if(cli.display->on_key(e)) send_selector(); break; } }
void SciEngine::initStackBaseWithSelector(Selector selector) { _gamestate->stack_base[0] = make_reg(0, (uint16)selector); _gamestate->stack_base[1] = NULL_REG; // Register the first element on the execution stack if (!send_selector(_gamestate, _gameObjectAddress, _gameObjectAddress, _gamestate->stack_base, 2, _gamestate->stack_base)) { _console->printObject(_gameObjectAddress); error("initStackBaseWithSelector: error while registering the first selector in the call stack"); } }
void Display::on_click(SDL_MouseButtonEvent &e) { if(current != NULL) { //adjust mouse coordinates to that of the selected viewport e.x -= current->rect.x; e.y -= current->rect.y; current->display->on_click(e); send_selector(); } }
void Display::on_text(SDL_TextInputEvent &e) { cli.display->on_text(e); send_selector(); }