IoMessage *IoMessage_newParseNextMessageChain(void *state, IoLexer *lexer) { IoCoroutine *current = IoState_currentCoroutine(state); Coro *coro = IoCoroutine_cid(current); size_t left = Coro_bytesLeftOnStack(coro); /* if (Coro_stackSpaceAlmostGone(coro)) { // need to make Coroutine support a stack of Coros which it frees when released // return IoCoroutine_internallyChain(current, context, IoMessage_...); Coro *newCoro = Coro_new(); ParseContext p = {state, lexer, newCoro, coro, NULL}; printf("Warning IoMessage_newParseNextMessageChain doing callc with %i bytes left to avoid stack overflow\n", left); Coro_startCoro_(coro, newCoro, &p, (CoroStartCallback *)IoMessage_coroNewParseNextMessageChain); Coro_free(newCoro); return p.result; } */ IoMessage *self = IoMessage_new(state); if (IoTokenType_isValidMessageName(IoLexer_topType(lexer))) { IoMessage_parseName(self, lexer); } if (IoLexer_topType(lexer) == OPENPAREN_TOKEN) { IoMessage_parseArgs(self, lexer); } if (IoTokenType_isValidMessageName(IoLexer_topType(lexer))) { IoMessage_parseNext(self, lexer); } while (IoLexer_topType(lexer) == TERMINATOR_TOKEN) { IoLexer_pop(lexer); if (IoTokenType_isValidMessageName(IoLexer_topType(lexer))) { IoMessage *eol = IoMessage_newWithName_(state, ((IoState*)state)->semicolonSymbol); IoMessage_rawSetNext(self, eol); IoMessage_parseNext(eol, lexer); } } return self; }
int Coro_stackSpaceAlmostGone(Coro *self) { return Coro_bytesLeftOnStack(self) < CORO_STACK_SIZE_MIN; }