diff --git a/IDEHelper/Compiler/BfDefBuilder.cpp b/IDEHelper/Compiler/BfDefBuilder.cpp index f7ce2175..5c017b0d 100644 --- a/IDEHelper/Compiler/BfDefBuilder.cpp +++ b/IDEHelper/Compiler/BfDefBuilder.cpp @@ -1972,8 +1972,8 @@ void BfDefBuilder::FinishTypeDef(bool wantsToString) auto methodDef = AddMethod(mCurTypeDef, BfMethodType_Normal, BfProtection_Protected, false, BF_METHODNAME_MARKMEMBERS); methodDef->mIsVirtual = true; methodDef->mIsOverride = true; - methodDef->mNoReflect = true; - methodDef->mNoSplat = true; + methodDef->mNoReflect = true; + methodDef->mCallingConvention = BfCallingConvention_Cdecl; mCurTypeDef->mHasOverrideMethods = true; } } diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index 09270ba3..dd104822 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -4955,7 +4955,7 @@ void BfExprEvaluator::PushThis(BfAstNode* targetSrc, BfTypedValue argVal, BfMeth if (argVal.mType->IsValuelessType()) return; - if ((!methodInstance->AllowsThisSplatting()) && (methodDef->mIsMutating)) + if ((!methodInstance->AllowsThisSplatting()) || (methodDef->mIsMutating)) { argVal = mModule->MakeAddressable(argVal); irArgs.push_back(argVal.mValue); diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index e908110c..808029f1 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -1098,7 +1098,7 @@ void BfModule::EnsureIRBuilder(bool dbgVerifyCodeGen) //mBfIRBuilder->mDbgVerifyCodeGen = true; if ( (mModuleName == "-") - //|| (mModuleName == "Vec2") + //|| (mModuleName == "Raylib_Color") //|| (mModuleName == "System_Int32") //|| (mModuleName == "Hey_Dude_Bro_TestClass") ) @@ -15143,6 +15143,11 @@ void BfModule::EmitGCMarkValue(BfTypedValue markVal, BfModuleMethodInstance mark if (markVal.mType != methodOwner) markVal = Cast(NULL, markVal, methodOwner); + if (markMemberMethodInstance.mMethodInstance->mIdHash == 0x1500000236LL) + { + NOP; + } + exprEvaluator.PushThis(NULL, markVal, markMemberMethodInstance.mMethodInstance, args); exprEvaluator.CreateCall(markMemberMethodInstance.mMethodInstance, markMemberMethodInstance.mFunc, false, args); } @@ -15286,14 +15291,13 @@ void BfModule::ProcessMethod_SetupParams(BfMethodInstance* methodInstance, BfTyp paramVar->mValue = mBfIRBuilder->GetArgument(argIdx); else paramVar->mValue = mBfIRBuilder->GetFakeVal(); - - + if ((thisType->IsSplattable()) && (methodInstance->AllowsThisSplatting())) { if (!thisType->IsTypedPrimitive()) paramVar->mIsSplat = true; } - else if (!methodDef->mIsMutating) + else if ((!methodDef->mIsMutating) && (methodInstance->mCallingConvention == BfCallingConvention_Unspecified)) paramVar->mIsLowered = thisType->GetLoweredType() != BfTypeCode_None; auto thisTypeInst = thisType->ToTypeInstance(); diff --git a/IDEHelper/Compiler/BfResolvedTypeUtils.cpp b/IDEHelper/Compiler/BfResolvedTypeUtils.cpp index 18f45889..030b9c40 100644 --- a/IDEHelper/Compiler/BfResolvedTypeUtils.cpp +++ b/IDEHelper/Compiler/BfResolvedTypeUtils.cpp @@ -659,7 +659,7 @@ bool BfMethodInstance::AllowsSplatting() { if (mCallingConvention != BfCallingConvention_Unspecified) return false; - return !mMethodDef->mNoSplat; + return true; } bool BfMethodInstance::AllowsThisSplatting() @@ -949,7 +949,7 @@ void BfMethodInstance::GetIRFunctionInfo(BfModule* module, BfIRType& returnType, { doSplat = true; } - else if (!mMethodDef->mIsMutating) + else if ((!mMethodDef->mIsMutating) && (mCallingConvention == BfCallingConvention_Unspecified)) checkLowered = true; } else diff --git a/IDEHelper/Compiler/BfSystem.h b/IDEHelper/Compiler/BfSystem.h index cdda7b5c..a13a8748 100644 --- a/IDEHelper/Compiler/BfSystem.h +++ b/IDEHelper/Compiler/BfSystem.h @@ -710,8 +710,7 @@ public: bool mHasAppend; bool mAlwaysInline; bool mNoReturn; - bool mIsMutating; - bool mNoSplat; + bool mIsMutating; bool mNoReflect; bool mIsSkipCall; bool mIsOperator; @@ -737,8 +736,7 @@ public: mIsPartial = false; mCLink = false; mNoReturn = false; - mIsMutating = false; - mNoSplat = false; + mIsMutating = false; mNoReflect = false; mIsSkipCall = false; mIsOperator = false; @@ -763,7 +761,7 @@ public: virtual ~BfMethodDef(); static BfImportKind GetImportKindFromPath(const StringImpl& filePath); - bool HasNoThisSplat() { return mIsMutating || mNoSplat; } + bool HasNoThisSplat() { return mIsMutating; } void Reset(); void FreeMembers(); BfMethodDeclaration* GetMethodDeclaration();