| 9374 | } |
| 9375 | |
| 9376 | BfTypedValue BfModule::CreateValueFromExpression(BfExprEvaluator& exprEvaluator, BfExpression* expr, BfType* wantTypeRef, BfEvalExprFlags flags, BfType** outOrigType) |
| 9377 | { |
| 9378 | // |
| 9379 | { |
| 9380 | BP_ZONE("CreateValueFromExpression:CheckStack"); |
| 9381 | |
| 9382 | StackHelper stackHelper; |
| 9383 | if (!stackHelper.CanStackExpand(128 * 1024)) |
| 9384 | { |
| 9385 | BfTypedValue result; |
| 9386 | if (!stackHelper.Execute([&]() |
| 9387 | { |
| 9388 | result = CreateValueFromExpression(exprEvaluator, expr, wantTypeRef, flags, outOrigType); |
| 9389 | })) |
| 9390 | { |
| 9391 | Fail("Expression too complex to compile", expr); |
| 9392 | } |
| 9393 | return result; |
| 9394 | } |
| 9395 | } |
| 9396 | |
| 9397 | BP_ZONE("BfModule::CreateValueFromExpression"); |
| 9398 | |
| 9399 | if (outOrigType != NULL) |
| 9400 | *outOrigType = NULL; |
| 9401 | |
| 9402 | exprEvaluator.mExpectingType = wantTypeRef; |
| 9403 | exprEvaluator.mBfEvalExprFlags = (BfEvalExprFlags)(exprEvaluator.mBfEvalExprFlags | flags); |
| 9404 | exprEvaluator.mExplicitCast = (flags & BfEvalExprFlags_ExplicitCast) != 0; |
| 9405 | |
| 9406 | if ((flags & BfEvalExprFlags_CreateConditionalScope) != 0) |
| 9407 | { |
| 9408 | if ((mCurMethodState == NULL) || (mCurMethodState->mCurScope->mScopeKind != BfScopeKind_StatementTarget_Conditional)) |
| 9409 | { |
| 9410 | EvaluateWithNewConditionalScope(exprEvaluator, expr, flags); |
| 9411 | } |
| 9412 | else |
| 9413 | { |
| 9414 | SetAndRestoreValue<bool> prevIsConditional(mCurMethodState->mCurScope->mIsConditional, true); |
| 9415 | exprEvaluator.Evaluate(expr, (flags & BfEvalExprFlags_PropogateNullConditional) != 0, (flags & BfEvalExprFlags_IgnoreNullConditional) != 0, true); |
| 9416 | } |
| 9417 | } |
| 9418 | else |
| 9419 | exprEvaluator.Evaluate(expr, (flags & BfEvalExprFlags_PropogateNullConditional) != 0, (flags & BfEvalExprFlags_IgnoreNullConditional) != 0, true); |
| 9420 | |
| 9421 | if (!exprEvaluator.mResult) |
| 9422 | { |
| 9423 | if ((flags & BfEvalExprFlags_InferReturnType) != 0) |
| 9424 | return exprEvaluator.mResult; |
| 9425 | if (!mCompiler->mPassInstance->HasFailed()) |
| 9426 | { |
| 9427 | if (PreFail()) |
| 9428 | Fail("INTERNAL ERROR: No expression result returned but no error caught in expression evaluator", expr); |
| 9429 | } |
| 9430 | return BfTypedValue(); |
| 9431 | } |
| 9432 | auto typedVal = exprEvaluator.mResult; |
| 9433 | if (typedVal.mKind == BfTypedValueKind_GenericConstValue) |
no test coverage detected