diff --git a/IDEHelper/Backend/BeMCContext.cpp b/IDEHelper/Backend/BeMCContext.cpp index 4f1700f3..bd50207c 100644 --- a/IDEHelper/Backend/BeMCContext.cpp +++ b/IDEHelper/Backend/BeMCContext.cpp @@ -2893,11 +2893,6 @@ BeMCOperand BeMCContext::CreateCall(const BeMCOperand& func, const SizedArrayImp int argCount = (int)args.size() + argOfs; int dynStackSize = 0; -// if (mUseBP) -// { -// dynStackSize = BF_MAX(4, argCount) * 8; -// dynStackSize = BF_ALIGN(dynStackSize, 16); -// } if (dynStackSize > 0) AllocInst(BeMCInstKind_Sub, BeMCOperand::FromReg(X64Reg_RSP), BeMCOperand::FromImmediate(dynStackSize)); @@ -15894,8 +15889,8 @@ void BeMCContext::Generate(BeFunction* function) retCount++; } break; - case BeCallInst::TypeId: - { + case BeCallInst::TypeId: + { auto castedInst = (BeCallInst*)inst; BeMCOperand mcFunc; BeType* returnType = NULL; @@ -16268,18 +16263,15 @@ void BeMCContext::Generate(BeFunction* function) } else { - if (auto func = BeValueDynCast(castedInst->mFunc)) + auto funcPtrType = castedInst->mFunc->GetType(); + if (funcPtrType->IsPointer()) { - auto funcPtrType = func->mType; - if (funcPtrType->IsPointer()) + auto elementType = ((BePointerType*)funcPtrType)->mElementType; + if (elementType->mTypeCode == BeTypeCode_Function) { - auto elementType = ((BePointerType*)funcPtrType)->mElementType; - if (elementType->mTypeCode == BeTypeCode_Function) - { - isVarArg = ((BeFunctionType*)elementType)->mIsVarArg; - } - } - } + isVarArg = ((BeFunctionType*)elementType)->mIsVarArg; + } + } returnType = castedInst->GetType(); mcFunc = GetOperand(castedInst->mFunc); diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index 9df71f8c..d8ee125c 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -13825,6 +13825,11 @@ void BfExprEvaluator::CheckPropFail(BfMethodDef* propMethodDef, BfMethodInstance } } +bool BfExprEvaluator::HasResult() +{ + return (mResult) || (mPropDef != NULL); +} + BfTypedValue BfExprEvaluator::GetResult(bool clearResult, bool resolveGenericType) { if ((!mResult) && (mPropDef != NULL)) @@ -14550,7 +14555,7 @@ void BfExprEvaluator::AssignDeferrredTupleAssignData(BfAssignmentExpression* ass } else { - if (child.mExprEvaluator->mResult) + if (child.mExprEvaluator->HasResult()) { child.mExprEvaluator->mBfEvalExprFlags = (BfEvalExprFlags)(child.mExprEvaluator->mBfEvalExprFlags | BfEvalExprFlags_NoAutoComplete); child.mExprEvaluator->PerformAssignment(assignExpr, true, elementValue); @@ -14588,7 +14593,7 @@ void BfExprEvaluator::DoTupleAssignment(BfAssignmentExpression* assignExpr) rightValue = mModule->LoadValue(rightValue); AssignDeferrredTupleAssignData(assignExpr, deferredTupleAssignData, rightValue); - + mResult = rightValue; } diff --git a/IDEHelper/Compiler/BfExprEvaluator.h b/IDEHelper/Compiler/BfExprEvaluator.h index ceba7bcd..56e52f2a 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.h +++ b/IDEHelper/Compiler/BfExprEvaluator.h @@ -329,7 +329,8 @@ public: BfMethodDef* GetPropertyMethodDef(BfPropertyDef* propDef, BfMethodType methodType, BfCheckedKind checkedKind); BfModuleMethodInstance GetPropertyMethodInstance(BfMethodDef* methodDef); void CheckPropFail(BfMethodDef* propMethodDef, BfMethodInstance* methodInstance); - BfTypedValue GetResult(bool clearResult = false, bool resolveGenericType = false); + bool HasResult(); + BfTypedValue GetResult(bool clearResult = false, bool resolveGenericType = false); void CheckResultForReading(BfTypedValue& typedValue); void MarkResultUsed(); void MarkResultAssigned(); diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index 5f28ed57..78dc1880 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -8794,11 +8794,6 @@ BfIRValue BfModule::CreateFunctionFrom(BfMethodInstance* methodInstance, bool tr if (mCompiler->IsSkippingExtraResolveChecks()) return BfIRValue(); - if (methodInstance->mMethodDef->mName == "Check") - { - NOP; - } - if (methodInstance->mMethodInstanceGroup->mOwner->IsInterface()) { //BF_ASSERT(!methodInstance->mIRFunction); diff --git a/IDEHelper/Tests/src/VarArgs.bf b/IDEHelper/Tests/src/VarArgs.bf new file mode 100644 index 00000000..1bcbfefa --- /dev/null +++ b/IDEHelper/Tests/src/VarArgs.bf @@ -0,0 +1,24 @@ +using System; + +namespace Tests +{ + class VarArgs + { +#if BF_PLATFORM_WINDOWS + [CLink, Import("msvcrt.dll")] +#else + [CLink] +#endif + public static extern int32 sprintf(char8* dest, char8* fmt, ...); + + [Test] + public static void TestBasics() + { + char8[256] cStr; + sprintf(&cStr, "Test %d %0.1f %0.1f", 123, 1.2f, 2.3f); + + String str = scope .(&cStr); + Test.Assert(str == "Test 123 1.2 2.3"); + } + } +}