static void initializePatterns(OverloadPtr x) { if (x->patternsInitializedState == 1) return; if (x->patternsInitializedState == -1) error("unholy recursion detected"); assert(x->patternsInitializedState == 0); x->patternsInitializedState = -1; CodePtr code = x->code; llvm::ArrayRef<PatternVar> pvars = code->patternVars; EnvPtr patternEnv = new Env(x->env); initializePatternEnv(patternEnv, pvars, x->cells, x->multiCells); assert(x->target.ptr()); x->callablePattern = evaluateOnePattern(x->target, patternEnv); llvm::ArrayRef<FormalArgPtr> formalArgs = code->formalArgs; for (size_t i = 0; i < formalArgs.size(); ++i) { FormalArgPtr y = formalArgs[i]; PatternPtr pattern; if (y->type.ptr()) { if (y->varArg) { ExprPtr unpack = new Unpack(y->type.ptr()); unpack->location = y->type->location; x->varArgPattern = evaluateMultiPattern(new ExprList(unpack), patternEnv); pattern = NULL; } else { pattern = evaluateOnePattern(y->type, patternEnv); } } x->argPatterns.push_back(pattern); } x->patternsInitializedState = 1; }
static void initializePatterns(OverloadPtr x) { if (x->patternsInitializedState == 1) return; if (x->patternsInitializedState == -1) error("unholy recursion detected"); assert(x->patternsInitializedState == 0); x->patternsInitializedState = -1; CodePtr code = x->code; const vector<PatternVar> &pvars = code->patternVars; x->patternEnv = new Env(x->env); for (unsigned i = 0; i < pvars.size(); ++i) { if (pvars[i].isMulti) { MultiPatternCellPtr multiCell = new MultiPatternCell(NULL); x->multiCells.push_back(multiCell); x->cells.push_back(NULL); addLocal(x->patternEnv, pvars[i].name, multiCell.ptr()); } else { PatternCellPtr cell = new PatternCell(NULL); x->cells.push_back(cell); x->multiCells.push_back(NULL); addLocal(x->patternEnv, pvars[i].name, cell.ptr()); } } assert(x->target.ptr()); x->callablePattern = evaluateOnePattern(x->target, x->patternEnv); const vector<FormalArgPtr> &formalArgs = code->formalArgs; for (unsigned i = 0; i < formalArgs.size(); ++i) { FormalArgPtr y = formalArgs[i]; PatternPtr pattern; if (y->type.ptr()) pattern = evaluateOnePattern(y->type, x->patternEnv); x->argPatterns.push_back(pattern); } if (code->formalVarArg.ptr() && code->formalVarArg->type.ptr()) { ExprPtr unpack = new Unpack(code->formalVarArg->type.ptr()); unpack->location = code->formalVarArg->type->location; x->varArgPattern = evaluateMultiPattern(new ExprList(unpack), x->patternEnv); } x->patternsInitializedState = 1; }