mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-10 04:22:20 +02:00
Fixed comptime const evals within comptime
This commit is contained in:
parent
1ee32434a5
commit
6c3944170d
5 changed files with 47 additions and 13 deletions
|
@ -267,7 +267,7 @@ namespace System
|
|||
static extern void Comptime_EmitAddInterface(int32 typeId, int32 ifaceTypeId);
|
||||
static extern void Comptime_EmitMethodEntry(int64 methodHandle, StringView text);
|
||||
static extern void Comptime_EmitMethodExit(int64 methodHandle, StringView text);
|
||||
static extern void Comptime_EmitMixin(String text);
|
||||
static extern void Comptime_EmitMixin(StringView text);
|
||||
|
||||
[Comptime(OnlyFromComptime=true)]
|
||||
public static MethodBuilder CreateMethod(Type owner, StringView methodName, Type returnType, MethodFlags methodFlags)
|
||||
|
@ -302,14 +302,14 @@ namespace System
|
|||
}
|
||||
|
||||
[Comptime(ConstEval=true)]
|
||||
public static void Mixin(String text)
|
||||
public static void Mixin(StringView text)
|
||||
{
|
||||
if (Compiler.IsComptime)
|
||||
Comptime_EmitMixin(text);
|
||||
}
|
||||
|
||||
[Comptime]
|
||||
public static void MixinRoot(String text)
|
||||
public static void MixinRoot(StringView text)
|
||||
{
|
||||
if (Compiler.IsComptime)
|
||||
Comptime_EmitMixin(text);
|
||||
|
|
|
@ -3066,6 +3066,11 @@ bool BfExprEvaluator::IsComptime()
|
|||
return (mModule->mIsComptimeModule) || ((mBfEvalExprFlags & BfEvalExprFlags_Comptime) != 0);
|
||||
}
|
||||
|
||||
bool BfExprEvaluator::IsConstEval()
|
||||
{
|
||||
return ((mBfEvalExprFlags & BfEvalExprFlags_Comptime) != 0);
|
||||
}
|
||||
|
||||
bool BfExprEvaluator::IsComptimeEntry()
|
||||
{
|
||||
if (mModule->mIsComptimeModule)
|
||||
|
@ -3741,7 +3746,7 @@ void BfExprEvaluator::Visit(BfLiteralExpression* literalExpr)
|
|||
|
||||
void BfExprEvaluator::Visit(BfStringInterpolationExpression* stringInterpolationExpression)
|
||||
{
|
||||
if (IsComptimeEntry())
|
||||
if (IsConstEval())
|
||||
{
|
||||
mModule->Fail("Const evaluation of string interpolation not allowed", stringInterpolationExpression);
|
||||
}
|
||||
|
@ -4267,6 +4272,7 @@ BfTypedValue BfExprEvaluator::LookupIdentifier(BfIdentifierNode* identifierNode,
|
|||
void BfExprEvaluator::Visit(BfIdentifierNode* identifierNode)
|
||||
{
|
||||
auto autoComplete = GetAutoComplete();
|
||||
|
||||
if (autoComplete != NULL)
|
||||
autoComplete->CheckIdentifier(identifierNode, true);
|
||||
|
||||
|
@ -4276,7 +4282,11 @@ void BfExprEvaluator::Visit(BfIdentifierNode* identifierNode)
|
|||
mModule->CheckTypeRefFixit(identifierNode);
|
||||
if ((autoComplete != NULL) && (autoComplete->CheckFixit(identifierNode)))
|
||||
{
|
||||
if (mModule->mCurMethodInstance != NULL)
|
||||
if ((mModule->mCurMethodState != NULL) && (mModule->mCurMethodState->mClosureState != NULL) && (mModule->mCurMethodState->mClosureState->mCapturing))
|
||||
{
|
||||
// During this phase we don't have lambda and local method params available so they would result in erroneous fixits
|
||||
}
|
||||
else if (mModule->mCurMethodInstance != NULL)
|
||||
{
|
||||
BfType* fieldType = mExpectingType;
|
||||
if (fieldType == NULL)
|
||||
|
@ -5751,6 +5761,8 @@ BfTypedValue BfExprEvaluator::CreateCall(BfAstNode* targetSrc, BfMethodInstance*
|
|||
}
|
||||
}
|
||||
|
||||
if (methodInstance->mReturnType->IsValuelessType())
|
||||
return BfTypedValue(mModule->mBfIRBuilder->GetFakeVal(), returnType);
|
||||
return mModule->GetDefaultTypedValue(returnType, true, BfDefaultValueKind_Undef);
|
||||
}
|
||||
|
||||
|
@ -6920,7 +6932,7 @@ BfTypedValue BfExprEvaluator::CreateCall(BfAstNode* targetSrc, const BfTypedValu
|
|||
if (methodDef->mMethodType == BfMethodType_Extension)
|
||||
numElements++;
|
||||
|
||||
if (IsComptimeEntry())
|
||||
if (IsConstEval())
|
||||
{
|
||||
if ((wantType->IsArray()) || (wantType->IsInstanceOf(mModule->mCompiler->mSpanTypeDef)))
|
||||
{
|
||||
|
@ -7410,7 +7422,7 @@ BfTypedValue BfExprEvaluator::CreateCall(BfAstNode* targetSrc, const BfTypedValu
|
|||
else
|
||||
{
|
||||
// We need to make a temp and get the addr of that
|
||||
if ((!wantsSplat) && (!argValue.IsValuelessType()) && (!argValue.IsAddr()) && (!IsComptimeEntry()))
|
||||
if ((!wantsSplat) && (!argValue.IsValuelessType()) && (!argValue.IsAddr()) && (!IsConstEval()))
|
||||
{
|
||||
argValue = mModule->MakeAddressable(argValue);
|
||||
}
|
||||
|
@ -7430,7 +7442,7 @@ BfTypedValue BfExprEvaluator::CreateCall(BfAstNode* targetSrc, const BfTypedValu
|
|||
{
|
||||
if (argValue)
|
||||
{
|
||||
if (IsComptimeEntry())
|
||||
if (IsConstEval())
|
||||
{
|
||||
auto constant = mModule->mBfIRBuilder->GetConstant(expandedParamsArray.mValue);
|
||||
BF_ASSERT(constant->mConstType == BfConstType_Agg);
|
||||
|
@ -8008,7 +8020,7 @@ BfTypedValue BfExprEvaluator::CheckEnumCreation(BfAstNode* targetSrc, BfTypeInst
|
|||
BfIRValue enumValue;
|
||||
BfTypedValue result;
|
||||
|
||||
bool wantConst = IsComptimeEntry();
|
||||
bool wantConst = IsConstEval();
|
||||
|
||||
if (wantConst)
|
||||
{
|
||||
|
@ -15158,7 +15170,7 @@ BfTypedValue BfExprEvaluator::MakeCallableTarget(BfAstNode* targetSrc, BfTypedVa
|
|||
|
||||
if ((target.mType->IsStruct()) && (!target.IsAddr()))
|
||||
{
|
||||
if (IsComptimeEntry())
|
||||
if (IsConstEval())
|
||||
return target;
|
||||
target = mModule->MakeAddressable(target);
|
||||
}
|
||||
|
|
|
@ -410,6 +410,7 @@ public:
|
|||
virtual bool CheckAllowValue(const BfTypedValue& typedValue, BfAstNode* refNode);
|
||||
BfAutoComplete* GetAutoComplete();
|
||||
bool IsComptime();
|
||||
bool IsConstEval();
|
||||
bool IsComptimeEntry();
|
||||
int GetStructRetIdx(BfMethodInstance* methodInstance, bool forceStatic = false);
|
||||
BfTypedValue SetupNullConditional(BfTypedValue target, BfTokenNode* dotToken);
|
||||
|
|
|
@ -5078,11 +5078,19 @@ bool CeContext::Execute(CeFunction* startFunction, uint8* startStackPtr, uint8*
|
|||
SetAndRestoreValue<BfMethodInstance*> prevMethodInstance(mCurModule->mCurMethodInstance, mCallerMethodInstance);
|
||||
SetAndRestoreValue<BfTypeInstance*> prevTypeInstance(mCurModule->mCurTypeInstance, mCallerTypeInstance);
|
||||
|
||||
int32 strInstAddr = *(int32*)((uint8*)stackPtr + 0);
|
||||
// int32 strInstAddr = *(int32*)((uint8*)stackPtr + 0);
|
||||
// String emitStr;
|
||||
// if (!GetStringFromAddr(strInstAddr, emitStr))
|
||||
// {
|
||||
// _Fail("Invalid String");
|
||||
// return false;
|
||||
// }
|
||||
|
||||
addr_ce strViewPtr = *(addr_ce*)((uint8*)stackPtr);
|
||||
String emitStr;
|
||||
if (!GetStringFromAddr(strInstAddr, emitStr))
|
||||
if (!GetStringFromStringView(strViewPtr, emitStr))
|
||||
{
|
||||
_Fail("Invalid String");
|
||||
_Fail("Invalid StringView");
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -424,6 +424,15 @@ namespace Tests
|
|||
}
|
||||
}
|
||||
|
||||
[Comptime]
|
||||
static int GetMixinVal()
|
||||
{
|
||||
int a = 23;
|
||||
Compiler.Mixin("a += 100;");
|
||||
Compiler.MixinRoot(scope String("b += 200;"));
|
||||
return a;
|
||||
}
|
||||
|
||||
[Test]
|
||||
public static void TestBasics()
|
||||
{
|
||||
|
@ -493,6 +502,10 @@ namespace Tests
|
|||
GetTupleField<decltype(tuple), const 1>.Type tupType1;
|
||||
Test.Assert(typeof(decltype(tupType0)) == typeof(int16));
|
||||
Test.Assert(typeof(decltype(tupType1)) == typeof(float));
|
||||
|
||||
int b = 34;
|
||||
Test.Assert(GetMixinVal() == 123);
|
||||
Test.Assert(b == 234);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue