mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-10 04:22:20 +02:00
Improved typeof(T).MinValue/MaxValue const resolution
This commit is contained in:
parent
d0ee1dda7b
commit
4ca73ae7be
3 changed files with 34 additions and 10 deletions
|
@ -418,6 +418,7 @@ BfCompiler::BfCompiler(BfSystem* bfSystem, bool isResolveOnly)
|
||||||
mCompilerTypeDef = NULL;
|
mCompilerTypeDef = NULL;
|
||||||
mDiagnosticsDebugTypeDef = NULL;
|
mDiagnosticsDebugTypeDef = NULL;
|
||||||
mIDisposableTypeDef = NULL;
|
mIDisposableTypeDef = NULL;
|
||||||
|
mIIntegerTypeDef = NULL;
|
||||||
mIPrintableTypeDef = NULL;
|
mIPrintableTypeDef = NULL;
|
||||||
mIHashableTypeDef = NULL;
|
mIHashableTypeDef = NULL;
|
||||||
mIComptimeTypeApply = NULL;
|
mIComptimeTypeApply = NULL;
|
||||||
|
@ -6695,6 +6696,7 @@ bool BfCompiler::DoCompile(const StringImpl& outputDirectory)
|
||||||
mCompilerTypeDef = _GetRequiredType("System.Compiler");
|
mCompilerTypeDef = _GetRequiredType("System.Compiler");
|
||||||
mDiagnosticsDebugTypeDef = _GetRequiredType("System.Diagnostics.Debug");
|
mDiagnosticsDebugTypeDef = _GetRequiredType("System.Diagnostics.Debug");
|
||||||
mIDisposableTypeDef = _GetRequiredType("System.IDisposable");
|
mIDisposableTypeDef = _GetRequiredType("System.IDisposable");
|
||||||
|
mIIntegerTypeDef = _GetRequiredType("System.IInteger");
|
||||||
mIPrintableTypeDef = _GetRequiredType("System.IPrintable");
|
mIPrintableTypeDef = _GetRequiredType("System.IPrintable");
|
||||||
mIHashableTypeDef = _GetRequiredType("System.IHashable");
|
mIHashableTypeDef = _GetRequiredType("System.IHashable");
|
||||||
mIComptimeTypeApply = _GetRequiredType("System.IComptimeTypeApply");
|
mIComptimeTypeApply = _GetRequiredType("System.IComptimeTypeApply");
|
||||||
|
|
|
@ -372,6 +372,7 @@ public:
|
||||||
BfTypeDef* mCompilerTypeDef;
|
BfTypeDef* mCompilerTypeDef;
|
||||||
BfTypeDef* mDiagnosticsDebugTypeDef;
|
BfTypeDef* mDiagnosticsDebugTypeDef;
|
||||||
BfTypeDef* mIDisposableTypeDef;
|
BfTypeDef* mIDisposableTypeDef;
|
||||||
|
BfTypeDef* mIIntegerTypeDef;
|
||||||
BfTypeDef* mIPrintableTypeDef;
|
BfTypeDef* mIPrintableTypeDef;
|
||||||
BfTypeDef* mIHashableTypeDef;
|
BfTypeDef* mIHashableTypeDef;
|
||||||
BfTypeDef* mIComptimeTypeApply;
|
BfTypeDef* mIComptimeTypeApply;
|
||||||
|
|
|
@ -10247,7 +10247,16 @@ bool BfExprEvaluator::LookupTypeProp(BfTypeOfExpression* typeOfExpr, BfIdentifie
|
||||||
auto genericParamInstance = mModule->GetGenericParamInstance((BfGenericParamType*)checkType);
|
auto genericParamInstance = mModule->GetGenericParamInstance((BfGenericParamType*)checkType);
|
||||||
if (((genericParamInstance->mGenericParamFlags & BfGenericParamFlag_Enum) != 0) ||
|
if (((genericParamInstance->mGenericParamFlags & BfGenericParamFlag_Enum) != 0) ||
|
||||||
((genericParamInstance->mTypeConstraint != NULL) && (genericParamInstance->mTypeConstraint->IsInstanceOf(mModule->mCompiler->mEnumTypeDef))))
|
((genericParamInstance->mTypeConstraint != NULL) && (genericParamInstance->mTypeConstraint->IsInstanceOf(mModule->mCompiler->mEnumTypeDef))))
|
||||||
foundMatch = true;
|
foundMatch = true;
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (auto constraint : genericParamInstance->mInterfaceConstraints)
|
||||||
|
{
|
||||||
|
if (constraint->IsInstanceOf(mModule->mCompiler->mIIntegerTypeDef))
|
||||||
|
foundMatch = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if ((mModule->mCurMethodInstance != NULL) && (mModule->mCurMethodInstance->mIsUnspecialized) && (mModule->mCurMethodInstance->mMethodInfoEx != NULL))
|
if ((mModule->mCurMethodInstance != NULL) && (mModule->mCurMethodInstance->mIsUnspecialized) && (mModule->mCurMethodInstance->mMethodInfoEx != NULL))
|
||||||
{
|
{
|
||||||
|
@ -10275,7 +10284,7 @@ bool BfExprEvaluator::LookupTypeProp(BfTypeOfExpression* typeOfExpr, BfIdentifie
|
||||||
{
|
{
|
||||||
auto primType = (BfPrimitiveType*)checkType;
|
auto primType = (BfPrimitiveType*)checkType;
|
||||||
|
|
||||||
if (typeInstance->IsEnum())
|
if ((typeInstance != NULL) && (typeInstance->IsEnum()))
|
||||||
{
|
{
|
||||||
if (typeInstance->mTypeInfoEx != NULL)
|
if (typeInstance->mTypeInfoEx != NULL)
|
||||||
{
|
{
|
||||||
|
@ -10288,31 +10297,43 @@ bool BfExprEvaluator::LookupTypeProp(BfTypeOfExpression* typeOfExpr, BfIdentifie
|
||||||
switch (primType->mTypeDef->mTypeCode)
|
switch (primType->mTypeDef->mTypeCode)
|
||||||
{
|
{
|
||||||
case BfTypeCode_Int8:
|
case BfTypeCode_Int8:
|
||||||
mResult = BfTypedValue(mModule->mBfIRBuilder->CreateConst(primType->mTypeDef->mTypeCode, isMin ? -0x80 : 0x7F), typeInstance);
|
mResult = BfTypedValue(mModule->mBfIRBuilder->CreateConst(primType->mTypeDef->mTypeCode, isMin ? -0x80 : 0x7F), primType);
|
||||||
return true;
|
return true;
|
||||||
case BfTypeCode_Int16:
|
case BfTypeCode_Int16:
|
||||||
mResult = BfTypedValue(mModule->mBfIRBuilder->CreateConst(primType->mTypeDef->mTypeCode, isMin ? -0x8000 : 0x7FFF), typeInstance);
|
mResult = BfTypedValue(mModule->mBfIRBuilder->CreateConst(primType->mTypeDef->mTypeCode, isMin ? -0x8000 : 0x7FFF), primType);
|
||||||
return true;
|
return true;
|
||||||
case BfTypeCode_Int32:
|
case BfTypeCode_Int32:
|
||||||
mResult = BfTypedValue(mModule->mBfIRBuilder->CreateConst(primType->mTypeDef->mTypeCode, isMin ? (uint64)-0x80000000LL : 0x7FFFFFFF), typeInstance);
|
mResult = BfTypedValue(mModule->mBfIRBuilder->CreateConst(primType->mTypeDef->mTypeCode, isMin ? (uint64)-0x80000000LL : 0x7FFFFFFF), primType);
|
||||||
return true;
|
return true;
|
||||||
case BfTypeCode_Int64:
|
case BfTypeCode_Int64:
|
||||||
mResult = BfTypedValue(mModule->mBfIRBuilder->CreateConst(primType->mTypeDef->mTypeCode, isMin ? (uint64)-0x8000000000000000LL : (uint64)0x7FFFFFFFFFFFFFFFLL), typeInstance);
|
mResult = BfTypedValue(mModule->mBfIRBuilder->CreateConst(primType->mTypeDef->mTypeCode, isMin ? (uint64)-0x8000000000000000LL : (uint64)0x7FFFFFFFFFFFFFFFLL), primType);
|
||||||
return true;
|
return true;
|
||||||
case BfTypeCode_UInt8:
|
case BfTypeCode_UInt8:
|
||||||
case BfTypeCode_Char8:
|
case BfTypeCode_Char8:
|
||||||
mResult = BfTypedValue(mModule->mBfIRBuilder->CreateConst(primType->mTypeDef->mTypeCode, isMin ? 0 : 0xFF), typeInstance);
|
mResult = BfTypedValue(mModule->mBfIRBuilder->CreateConst(primType->mTypeDef->mTypeCode, isMin ? 0 : 0xFF), primType);
|
||||||
return true;
|
return true;
|
||||||
case BfTypeCode_UInt16:
|
case BfTypeCode_UInt16:
|
||||||
case BfTypeCode_Char16:
|
case BfTypeCode_Char16:
|
||||||
mResult = BfTypedValue(mModule->mBfIRBuilder->CreateConst(primType->mTypeDef->mTypeCode, isMin ? 0 : 0xFFFF), typeInstance);
|
mResult = BfTypedValue(mModule->mBfIRBuilder->CreateConst(primType->mTypeDef->mTypeCode, isMin ? 0 : 0xFFFF), primType);
|
||||||
return true;
|
return true;
|
||||||
case BfTypeCode_UInt32:
|
case BfTypeCode_UInt32:
|
||||||
case BfTypeCode_Char32:
|
case BfTypeCode_Char32:
|
||||||
mResult = BfTypedValue(mModule->mBfIRBuilder->CreateConst(primType->mTypeDef->mTypeCode, isMin ? 0 : (uint64)0xFFFFFFFFLL), typeInstance);
|
mResult = BfTypedValue(mModule->mBfIRBuilder->CreateConst(primType->mTypeDef->mTypeCode, isMin ? 0 : (uint64)0xFFFFFFFFLL), primType);
|
||||||
return true;
|
return true;
|
||||||
case BfTypeCode_UInt64:
|
case BfTypeCode_UInt64:
|
||||||
mResult = BfTypedValue(mModule->mBfIRBuilder->CreateConst(primType->mTypeDef->mTypeCode, isMin ? 0 : (uint64)0xFFFFFFFFFFFFFFFFLL), typeInstance);
|
mResult = BfTypedValue(mModule->mBfIRBuilder->CreateConst(primType->mTypeDef->mTypeCode, isMin ? 0 : (uint64)0xFFFFFFFFFFFFFFFFLL), primType);
|
||||||
|
return true;
|
||||||
|
case BfTypeCode_IntPtr:
|
||||||
|
if (mModule->mSystem->mPtrSize == 8)
|
||||||
|
mResult = BfTypedValue(mModule->mBfIRBuilder->CreateConst(primType->mTypeDef->mTypeCode, isMin ? (uint64)-0x8000000000000000LL : (uint64)0x7FFFFFFFFFFFFFFFLL), primType);
|
||||||
|
else
|
||||||
|
mResult = BfTypedValue(mModule->mBfIRBuilder->CreateConst(primType->mTypeDef->mTypeCode, isMin ? (uint64)-0x80000000LL : 0x7FFFFFFF), primType);
|
||||||
|
return true;
|
||||||
|
case BfTypeCode_UIntPtr:
|
||||||
|
if (mModule->mSystem->mPtrSize == 8)
|
||||||
|
mResult = BfTypedValue(mModule->mBfIRBuilder->CreateConst(primType->mTypeDef->mTypeCode, isMin ? 0 : (uint64)0xFFFFFFFFFFFFFFFFLL), primType);
|
||||||
|
else
|
||||||
|
mResult = BfTypedValue(mModule->mBfIRBuilder->CreateConst(primType->mTypeDef->mTypeCode, isMin ? 0 : (uint64)0xFFFFFFFFLL), primType);
|
||||||
return true;
|
return true;
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue