static void createCaller(void) { FUNCTIONCALL *params = Alloc(sizeof(FUNCTIONCALL)); TYPE *args = realArgs(lambdas->func); SYMBOL *func = makeID(sc_member, args, NULL, overloadNameTab[CI_FUNC]); SYMBOL *lambdaCall = search(isstructured(basetype(lambdas->func->tp)->btp) ? "__lambdaCallS" : "__lambdaCall", globalNameSpace->syms); BLOCKDATA block1, block2; STATEMENT *st; lambdaCall = (SYMBOL *)lambdaCall->tp->syms->table[0]->p; func->parentClass = lambdas->cls; func->linkage = lk_virtual; func->isInline = FALSE; func->omitFrame = TRUE; memset(&block1, 0, sizeof(BLOCKDATA)); memset(&block2, 0, sizeof(BLOCKDATA)); insertFunc(lambdas->cls, func); InsertInline(func); st = stmtNode(NULL, &block2, isstructured(basetype(lambdas->func->tp)->btp) ? st_expr : st_return); st->select = varNode(en_func, NULL); st->select->v.func = params; params->arguments = Alloc(sizeof(INITLIST)); params->arguments->exp = varNode(en_pc, lambdas->func); params->arguments->tp = &stdpointer; params->ascall = TRUE; params->sp = func; params->fcall = varNode(en_pc, lambdaCall); params->functp = func->tp; st = stmtNode(NULL, &block1, st_block); st->lower = block2.head; st->blockTail = block2.blockTail; func->inlineFunc.stmt = stmtNode(NULL, NULL, st_block); func->inlineFunc.stmt->lower = block1.head; func->inlineFunc.stmt->blockTail = block1.blockTail; }
static VOID OnRoutine(RTN rtn, VOID *) { if (RTN_Name(rtn) == "DoInline" || RTN_Name(rtn) == "DoAll") InsertInline(rtn); if (RTN_Name(rtn) == "DoNoBridge" || RTN_Name(rtn) == "DoAll") InsertNoBridge(rtn); if (RTN_Name(rtn) == "DoBridge" || RTN_Name(rtn) == "DoAll") InsertBridge(rtn); if (RTN_Name(rtn) == "DoIfInlineThenInline" || RTN_Name(rtn) == "DoAll") InsertIfInlineThenInline(rtn); if (RTN_Name(rtn) == "DoIfInlineThenNoBridge" || RTN_Name(rtn) == "DoAll") InsertIfInlineThenNoBridge(rtn); if (RTN_Name(rtn) == "DoIfInlineThenBridge" || RTN_Name(rtn) == "DoAll") InsertIfInlineThenBridge(rtn); if (RTN_Name(rtn) == "DoIfNoBridgeThenInline" || RTN_Name(rtn) == "DoAll") InsertIfNoBridgeThenInline(rtn); if (RTN_Name(rtn) == "DoIfNoBridgeThenNoBridge" || RTN_Name(rtn) == "DoAll") InsertIfNoBridgeThenNoBridge(rtn); if (RTN_Name(rtn) == "DoIfNoBridgeThenBridge" || RTN_Name(rtn) == "DoAll") InsertIfNoBridgeThenBridge(rtn); if (RTN_Name(rtn) == "DoIfBridgeThenInline" || RTN_Name(rtn) == "DoAll") InsertIfBridgeThenInline(rtn); if (RTN_Name(rtn) == "DoIfBridgeThenNoBridge" || RTN_Name(rtn) == "DoAll") InsertIfBridgeThenNoBridge(rtn); if (RTN_Name(rtn) == "DoIfBridgeThenBridge" || RTN_Name(rtn) == "DoAll") InsertIfBridgeThenBridge(rtn); }
static void createConverter(SYMBOL *self) { SYMBOL *caller = createPtrCaller(self); TYPE *args = realArgs(lambdas->func); SYMBOL *func = makeID(sc_member, Alloc(sizeof(TYPE)), NULL, overloadNameTab[CI_CAST]); BLOCKDATA block1, block2; STATEMENT *st; EXPRESSION *exp; SYMBOL *sym = makeID(sc_parameter, &stdvoid, NULL, AnonymousName()); HASHREC *hr = Alloc(sizeof(HASHREC)); func->tp->type = bt_func; func->tp->btp = Alloc(sizeof(TYPE)); func->tp->btp->type = bt_pointer; func->tp->btp->size = getSize(bt_pointer); func->tp->btp->btp = args; func->tp->syms = CreateHashTable(1); func->linkage = lk_virtual; func->isInline = FALSE; hr->p = (struct _hrintern_ *)sym; func->tp->syms->table[0] = hr; func->parentClass = lambdas->cls; memset(&block1, 0, sizeof(BLOCKDATA)); memset(&block2, 0, sizeof(BLOCKDATA)); func->castoperator = TRUE; insertFunc(lambdas->cls, func); InsertInline(func); InsertInline(caller); st = stmtNode(NULL, &block2, st_return); st->select = varNode(en_pc, caller); st = stmtNode(NULL, &block1, st_block); st->lower = block2.head; st->blockTail = block2. blockTail; func->inlineFunc.stmt = stmtNode(NULL, NULL, st_block); func->inlineFunc.stmt->lower = block1.head; func->inlineFunc.stmt->blockTail = block1.blockTail; }