| 16115 | } |
| 16116 | |
| 16117 | BfTypedValue BfModule::CreateOutVariable(BfAstNode* refNode, BfVariableDeclaration* variableDeclaration, BfAstNode* paramNameNode, BfType* variableType, BfTypedValue initValue) |
| 16118 | { |
| 16119 | bool isRef = false; |
| 16120 | bool isLet = (variableDeclaration != NULL) && (variableDeclaration->mTypeRef->IsExact<BfLetTypeReference>()); |
| 16121 | bool isVar = (variableDeclaration == NULL) || (variableDeclaration->mTypeRef->IsExact<BfVarTypeReference>()); |
| 16122 | |
| 16123 | if (variableDeclaration != NULL) |
| 16124 | { |
| 16125 | if (auto varRefTypeReference = BfNodeDynCast<BfVarRefTypeReference>(variableDeclaration->mTypeRef)) |
| 16126 | { |
| 16127 | isRef = true; |
| 16128 | isLet = varRefTypeReference->mVarToken->GetToken() == BfToken_Let; |
| 16129 | isVar = varRefTypeReference->mVarToken->GetToken() == BfToken_Var; |
| 16130 | } |
| 16131 | } |
| 16132 | |
| 16133 | BfLocalVariable* localVar = new BfLocalVariable(); |
| 16134 | if ((variableDeclaration != NULL) && (variableDeclaration->mNameNode != NULL)) |
| 16135 | { |
| 16136 | localVar->mName = variableDeclaration->mNameNode->ToString(); |
| 16137 | localVar->mNameNode = BfNodeDynCast<BfIdentifierNode>(variableDeclaration->mNameNode); |
| 16138 | } |
| 16139 | else |
| 16140 | { |
| 16141 | if (paramNameNode != NULL) |
| 16142 | { |
| 16143 | localVar->mName = "__"; |
| 16144 | paramNameNode->ToString(localVar->mName); |
| 16145 | localVar->mName += "_"; |
| 16146 | localVar->mName += StrFormat("%d", mCurMethodState->GetRootMethodState()->mCurLocalVarId); |
| 16147 | } |
| 16148 | else |
| 16149 | localVar->mName = "__" + StrFormat("%d", mCurMethodState->GetRootMethodState()->mCurLocalVarId); |
| 16150 | } |
| 16151 | |
| 16152 | localVar->mResolvedType = variableType; |
| 16153 | if (isRef) |
| 16154 | { |
| 16155 | localVar->mResolvedType = CreateRefType(localVar->mResolvedType); |
| 16156 | } |
| 16157 | |
| 16158 | PopulateType(variableType); |
| 16159 | if (!variableType->IsValuelessType()) |
| 16160 | localVar->mAddr = CreateAlloca(localVar->mResolvedType); |
| 16161 | localVar->mIsReadOnly = isLet; |
| 16162 | localVar->mReadFromId = 0; |
| 16163 | localVar->mWrittenToId = 0; |
| 16164 | localVar->mAssignedKind = BfLocalVarAssignKind_Unconditional; |
| 16165 | CheckVariableDef(localVar); |
| 16166 | localVar->Init(); |
| 16167 | AddLocalVariableDef(localVar, true); |
| 16168 | |
| 16169 | BfExprEvaluator exprEvaluator(this); |
| 16170 | exprEvaluator.CheckVariableDeclaration(refNode, false, false, false); |
| 16171 | |
| 16172 | auto argValue = BfTypedValue(localVar->mAddr, CreateRefType(variableType, BfRefType::RefKind_Out)); |
| 16173 | |
| 16174 | if (isRef) |
no test coverage detected