| 4664 | } |
| 4665 | |
| 4666 | BfTypedValue BfModule::GetFieldInitializerValue(BfFieldInstance* fieldInstance, BfExpression* initializer, BfFieldDef* fieldDef, BfType* fieldType, bool doStore) |
| 4667 | { |
| 4668 | if (fieldDef == NULL) |
| 4669 | fieldDef = fieldInstance->GetFieldDef(); |
| 4670 | if (fieldType == NULL) |
| 4671 | fieldType = fieldInstance->GetResolvedType(); |
| 4672 | if (initializer == NULL) |
| 4673 | { |
| 4674 | if (fieldDef == NULL) |
| 4675 | return BfTypedValue(); |
| 4676 | initializer = fieldDef->GetInitializer(); |
| 4677 | } |
| 4678 | |
| 4679 | BfTypedValue staticVarRef; |
| 4680 | |
| 4681 | BfTypedValue result; |
| 4682 | if (initializer == NULL) |
| 4683 | { |
| 4684 | result = GetDefaultTypedValue(fieldInstance->mResolvedType); |
| 4685 | } |
| 4686 | else |
| 4687 | { |
| 4688 | if (mCompiler->mIsResolveOnly) |
| 4689 | { |
| 4690 | if (auto sourceClassifier = mCompiler->mResolvePassData->GetSourceClassifier(initializer)) |
| 4691 | { |
| 4692 | sourceClassifier->SetElementType(initializer, BfSourceElementType_Normal); |
| 4693 | sourceClassifier->VisitChildNoRef(initializer); |
| 4694 | } |
| 4695 | } |
| 4696 | |
| 4697 | if ((mCurTypeInstance->IsPayloadEnum()) && (fieldDef->IsEnumCaseEntry())) |
| 4698 | { |
| 4699 | Fail("Enums with payloads cannot have explicitly-defined discriminators", initializer); |
| 4700 | BfConstResolver constResolver(this); |
| 4701 | constResolver.Resolve(initializer); |
| 4702 | return GetDefaultTypedValue(fieldType); |
| 4703 | } |
| 4704 | else if (mCurTypeInstance->IsUnspecializedTypeVariation()) |
| 4705 | { |
| 4706 | return GetDefaultTypedValue(fieldType); |
| 4707 | } |
| 4708 | else if (fieldDef->mIsConst) |
| 4709 | { |
| 4710 | int ceExecuteId = -1; |
| 4711 | if (mCompiler->mCeMachine != NULL) |
| 4712 | ceExecuteId = mCompiler->mCeMachine->mExecuteId; |
| 4713 | |
| 4714 | BfTypeState typeState; |
| 4715 | typeState.mType = mCurTypeInstance; |
| 4716 | typeState.mCurTypeDef = fieldDef->mDeclaringType; |
| 4717 | typeState.mCurFieldDef = fieldDef; |
| 4718 | SetAndRestoreValue<BfTypeState*> prevTypeState(mContext->mCurTypeState, &typeState); |
| 4719 | |
| 4720 | BfConstResolver constResolver(this); |
| 4721 | if (fieldType->IsVar()) |
| 4722 | return constResolver.Resolve(initializer); |
| 4723 | else |
nothing calls this directly
no test coverage detected