IO_METHOD(IoObject, messageForString) { /*doc Compiler messageForString(aString, optionalLabelString) Returns the compiled message object for aString. */ IoSymbol *string = IoMessage_locals_seqArgAt_(m, locals, 0); IoSymbol *label = IoMessage_rawLabel(m); if (IoMessage_argCount(m) > 1) { label = IoMessage_locals_symbolArgAt_(m, locals, 1); } return IoMessage_newFromText_labelSymbol_(IOSTATE, CSTRING((IoSymbol *)string), (IoSymbol *)label); }
IoObject *IoMessage_locals_performOn_(IoMessage *self, IoObject *locals, IoObject *target) { IoState *state = IOSTATE; IoMessage *m = self; IoObject *result = target; IoObject *cachedTarget = target; //IoObject *semicolonSymbol = state->semicolonSymbol; //IoMessageData *md; IoMessageData *md; if (state->receivedSignal) { IoState_callUserInterruptHandler(IOSTATE); } do { //md = DATA(m); //printf("%s %i\n", CSTRING(IoMessage_name(m)), state->stopStatus); //printf(" %s\n", CSTRING(IoMessage_name(m))); if(state->showAllMessages) { printf("M:%s:%s:%i\n", CSTRING(IoMessage_name(m)), CSTRING(IoMessage_rawLabel(m)), IoMessage_rawLineNumber(m)); } md = DATA(m); if(md->name == state->semicolonSymbol) { target = cachedTarget; } else { result = md->cachedResult; // put it on the stack? /* if(state->debugOn) { char *s = CSTRING(DATA(m)->name); printf("%s\n", s); if (strcmp(s, "clone") == 0) { printf("found '%s'\n", s); } } */ if (!result) { IoState_pushRetainPool(state); #ifdef IOMESSAGE_INLINE_PERFORM if(IoObject_tag(target)->performFunc == NULL) { result = IoObject_perform(target, locals, m); } else { result = IoObject_tag(target)->performFunc(target, locals, m); } #else result = IoObject_tag(target)->performFunc(target, locals, m); #endif IoState_popRetainPoolExceptFor_(state, result); } //IoObject_freeIfUnreferenced(target); target = result; if (state->stopStatus != MESSAGE_STOP_STATUS_NORMAL) { return state->returnValue; /* result = state->returnValue; if (result) { //IoState_stackRetain_(state, result); return result; } printf("IoBlock no result!\n"); return state->ioNil; */ } } } while ((m = md->next)); return result; }