mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-10 12:32:20 +02:00
Fixed non-composites 'in' parameters
This commit is contained in:
parent
309e3cb02a
commit
0cf9135b8a
5 changed files with 51 additions and 8 deletions
|
@ -578,6 +578,7 @@ public:
|
||||||
enum BfTypedValueKind
|
enum BfTypedValueKind
|
||||||
{
|
{
|
||||||
BfTypedValueKind_Addr,
|
BfTypedValueKind_Addr,
|
||||||
|
BfTypedValueKind_VolatileAddr,
|
||||||
BfTypedValueKind_CopyOnMutateAddr,
|
BfTypedValueKind_CopyOnMutateAddr,
|
||||||
BfTypedValueKind_CopyOnMutateAddr_Derived,
|
BfTypedValueKind_CopyOnMutateAddr_Derived,
|
||||||
BfTypedValueKind_ReadOnlyAddr,
|
BfTypedValueKind_ReadOnlyAddr,
|
||||||
|
@ -586,7 +587,7 @@ enum BfTypedValueKind
|
||||||
BfTypedValueKind_ReadOnlyTempAddr,
|
BfTypedValueKind_ReadOnlyTempAddr,
|
||||||
BfTypedValueKind_ThisAddr,
|
BfTypedValueKind_ThisAddr,
|
||||||
BfTypedValueKind_BaseAddr,
|
BfTypedValueKind_BaseAddr,
|
||||||
BfTypedValueKind_ReadOnlyThisAddr,
|
BfTypedValueKind_ReadOnlyThisAddr,
|
||||||
BfTypedValueKind_ReadOnlyBaseAddr,
|
BfTypedValueKind_ReadOnlyBaseAddr,
|
||||||
|
|
||||||
BfTypedValueKind_Value,
|
BfTypedValueKind_Value,
|
||||||
|
@ -750,6 +751,11 @@ public:
|
||||||
mKind = (BfTypedValueKind)((int)mKind - 1);
|
mKind = (BfTypedValueKind)((int)mKind - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool IsVolatile() const
|
||||||
|
{
|
||||||
|
return mKind == BfTypedValueKind_VolatileAddr;
|
||||||
|
}
|
||||||
|
|
||||||
bool IsSplat() const
|
bool IsSplat() const
|
||||||
{
|
{
|
||||||
return (mKind >= BfTypedValueKind_SplatHead) && (mKind <= BfTypedValueKind_ParamsSplat);
|
return (mKind >= BfTypedValueKind_SplatHead) && (mKind <= BfTypedValueKind_ParamsSplat);
|
||||||
|
|
|
@ -5093,6 +5093,9 @@ BfTypedValue BfExprEvaluator::LoadField(BfAstNode* targetSrc, BfTypedValue targe
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((fieldDef->mIsVolatile) && (retVal.IsAddr()))
|
||||||
|
retVal.mKind = BfTypedValueKind_VolatileAddr;
|
||||||
|
|
||||||
if (wantsLoadValue)
|
if (wantsLoadValue)
|
||||||
retVal = mModule->LoadValue(retVal, NULL, mIsVolatileReference);
|
retVal = mModule->LoadValue(retVal, NULL, mIsVolatileReference);
|
||||||
else
|
else
|
||||||
|
@ -5902,8 +5905,8 @@ void BfExprEvaluator::ResolveArgValues(BfResolvedArgs& resolvedArgs, BfResolveAr
|
||||||
resolvedArg.mResolvedType = argValue.mType;
|
resolvedArg.mResolvedType = argValue.mType;
|
||||||
if (resolvedArg.mResolvedType->IsRef())
|
if (resolvedArg.mResolvedType->IsRef())
|
||||||
argValue.mKind = BfTypedValueKind_Value;
|
argValue.mKind = BfTypedValueKind_Value;
|
||||||
else if ((!resolvedArg.mResolvedType->IsStruct()) && (!resolvedArg.mResolvedType->IsSizedArray()) && (!resolvedArg.mResolvedType->IsValuelessType()))
|
if (exprEvaluator.mIsVolatileReference)
|
||||||
argValue = mModule->LoadValue(argValue, NULL, exprEvaluator.mIsVolatileReference);
|
resolvedArg.mArgFlags = (BfArgFlags)(resolvedArg.mArgFlags | BfArgFlag_Volatile);
|
||||||
}
|
}
|
||||||
resolvedArg.mUncastedTypedValue = argValue;
|
resolvedArg.mUncastedTypedValue = argValue;
|
||||||
resolvedArg.mTypedValue = argValue;
|
resolvedArg.mTypedValue = argValue;
|
||||||
|
|
|
@ -21,7 +21,8 @@ enum BfArgFlags
|
||||||
BfArgFlag_UninitializedExpr = 0x400,
|
BfArgFlag_UninitializedExpr = 0x400,
|
||||||
BfArgFlag_StringInterpolateFormat = 0x800,
|
BfArgFlag_StringInterpolateFormat = 0x800,
|
||||||
BfArgFlag_StringInterpolateArg = 0x1000,
|
BfArgFlag_StringInterpolateArg = 0x1000,
|
||||||
BfArgFlag_Cascade = 0x2000
|
BfArgFlag_Cascade = 0x2000,
|
||||||
|
BfArgFlag_Volatile = 0x8000
|
||||||
};
|
};
|
||||||
|
|
||||||
enum BfResolveArgsFlags
|
enum BfResolveArgsFlags
|
||||||
|
|
|
@ -12583,11 +12583,9 @@ BfTypedValue BfModule::LoadValue(BfTypedValue typedValue, BfAstNode* refNode, bo
|
||||||
{
|
{
|
||||||
return BfTypedValue(loadedVal, typedValue.mType, false);
|
return BfTypedValue(loadedVal, typedValue.mType, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*if (isVolatile)
|
|
||||||
mBfIRBuilder->CreateFence(BfIRFenceType_AcquireRelease);*/
|
|
||||||
PopulateType(typedValue.mType, BfPopulateType_Data);
|
PopulateType(typedValue.mType, BfPopulateType_Data);
|
||||||
loadedVal = mBfIRBuilder->CreateAlignedLoad(loadedVal, std::max(1, (int)typedValue.mType->mAlign), isVolatile);
|
loadedVal = mBfIRBuilder->CreateAlignedLoad(loadedVal, std::max(1, (int)typedValue.mType->mAlign), isVolatile || typedValue.IsVolatile());
|
||||||
}
|
}
|
||||||
return BfTypedValue(loadedVal, typedValue.mType, false);
|
return BfTypedValue(loadedVal, typedValue.mType, false);
|
||||||
}
|
}
|
||||||
|
@ -14739,6 +14737,8 @@ BfTypedValue BfModule::ReferenceStaticField(BfFieldInstance* fieldInstance)
|
||||||
if (type->IsValuelessType())
|
if (type->IsValuelessType())
|
||||||
return BfTypedValue(globalValue, type);
|
return BfTypedValue(globalValue, type);
|
||||||
|
|
||||||
|
if (fieldDef->mIsVolatile)
|
||||||
|
return BfTypedValue(globalValue, type, BfTypedValueKind_VolatileAddr);
|
||||||
return BfTypedValue(globalValue, type, !fieldDef->mIsConst);
|
return BfTypedValue(globalValue, type, !fieldDef->mIsConst);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -159,6 +159,29 @@ namespace Tests
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void InInt(in int a)
|
||||||
|
{
|
||||||
|
Test.Assert(a == 123);
|
||||||
|
#unwarn
|
||||||
|
int* aPtr = &a;
|
||||||
|
*aPtr = 234;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void CopyStructA(StructA sa)
|
||||||
|
{
|
||||||
|
#unwarn
|
||||||
|
StructA* saPtr = &sa;
|
||||||
|
saPtr.mA += 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void InStructA(in StructA sa)
|
||||||
|
{
|
||||||
|
#unwarn
|
||||||
|
StructA* saPtr = &sa;
|
||||||
|
saPtr.mA += 1000;
|
||||||
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public static void TestBasics()
|
public static void TestBasics()
|
||||||
{
|
{
|
||||||
|
@ -206,6 +229,16 @@ namespace Tests
|
||||||
|
|
||||||
var v = ObjMethod(.. scope String());
|
var v = ObjMethod(.. scope String());
|
||||||
Test.Assert(v.GetType() == typeof(String));
|
Test.Assert(v.GetType() == typeof(String));
|
||||||
|
|
||||||
|
int b = 123;
|
||||||
|
InInt(b);
|
||||||
|
Test.Assert(b == 234);
|
||||||
|
|
||||||
|
StructA sa4 = .(400, 401);
|
||||||
|
CopyStructA(sa4);
|
||||||
|
Test.Assert(sa4.mA == 400);
|
||||||
|
InStructA(sa4);
|
||||||
|
Test.Assert(sa4.mA == 1400);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue