static void initializeLambdaWithoutFreeVars(LambdaPtr x, EnvPtr env, string const &closureDataName, string const &lname) { IdentifierPtr name = new Identifier(lname); name->location = x->location; x->lambdaProc = new Procedure(name, PRIVATE); x->lambdaProc->lambda = x; CodePtr code = new Code(); code->location = x->location; for (unsigned i = 0; i < x->formalArgs.size(); ++i) { code->formalArgs.push_back(x->formalArgs[i]); } if (x->formalVarArg.ptr()) { code->formalVarArg = x->formalVarArg; } code->body = x->body; ExprPtr procRef = new ObjectExpr(x->lambdaProc.ptr()); procRef->location = x->location; OverloadPtr overload = new Overload(procRef, code, false, false); overload->env = env; overload->location = x->location; addProcedureOverload(x->lambdaProc, overload); x->converted = procRef; }
static void initOverload(OverloadPtr x) { EnvPtr env = overloadPatternEnv(x); PatternPtr pattern = evaluateOnePattern(x->target, env); ObjectPtr obj = derefDeep(pattern); if (obj == NULL) { x->nameIsPattern = true; addPatternOverload(x); } else { switch (obj->objKind) { case PROCEDURE : { Procedure *proc = (Procedure *)obj.ptr(); addProcedureOverload(proc, env, x); break; } case RECORD_DECL : { RecordDecl *r = (RecordDecl *)obj.ptr(); r->overloads.insert(r->overloads.begin(), x); break; } case VARIANT_DECL : { VariantDecl *v = (VariantDecl *)obj.ptr(); v->overloads.insert(v->overloads.begin(), x); break; } case TYPE : { Type *t = (Type *)obj.ptr(); t->overloads.insert(t->overloads.begin(), x); break; } case PRIM_OP : { if (isOverloadablePrimOp(obj)) addPrimOpOverload((PrimOp *)obj.ptr(), x); else error(x->target, "invalid overload target"); break; } case GLOBAL_ALIAS : { GlobalAlias *a = (GlobalAlias*)obj.ptr(); if (!a->hasParams()) error(x->target, "invalid overload target"); a->overloads.insert(a->overloads.begin(), x); break; } case INTRINSIC : { error(x->target, "invalid overload target"); } default : { error(x->target, "invalid overload target"); } } } }