diff --git a/IDEHelper/Backend/BeIRCodeGen.cpp b/IDEHelper/Backend/BeIRCodeGen.cpp index 3a37b134..80b60491 100644 --- a/IDEHelper/Backend/BeIRCodeGen.cpp +++ b/IDEHelper/Backend/BeIRCodeGen.cpp @@ -1396,6 +1396,11 @@ void BeIRCodeGen::HandleNextCmd() { CMD_PARAM(BeType*, type); CMD_PARAM(BeValue*, arraySize); + + if (auto constant = BeValueDynCast(arraySize)) + { + //BF_ASSERT(constant->mInt64 >= 0); + } auto allocaInst = mBeModule->AllocInst(); allocaInst->mType = type; diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index 1e63dc36..0fba0bcf 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -11279,8 +11279,11 @@ void BfExprEvaluator::Visit(BfObjectCreateExpression* objCreateExpr) } mModule->mBfIRBuilder->PopulateType(resultType); - mModule->mBfIRBuilder->CreateMemSet(mModule->CreateIndexedValue(resultType, addr, clearFromIdx), - mModule->mBfIRBuilder->CreateConst(BfTypeCode_Int8, isUninit ? 0xCC : 0), clearBytes, resultType->mAlign); + if (!resultType->IsValuelessType()) + { + mModule->mBfIRBuilder->CreateMemSet(mModule->CreateIndexedValue(resultType, addr, clearFromIdx), + mModule->mBfIRBuilder->CreateConst(BfTypeCode_Int8, isUninit ? 0xCC : 0), clearBytes, resultType->mAlign); + } } }; diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index 0dc6838e..9772f7e3 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -7651,11 +7651,17 @@ BfIRValue BfModule::AllocFromType(BfType* type, const BfAllocTarget& allocTarget else { BfArrayType* arrayType = CreateArrayType(type, arrayDim); - auto firstElementField = &arrayType->mFieldInstances.back(); - int arrayClassSize = firstElementField->mDataOffset; - sizeValue = GetConstValue(arrayClassSize); - BfIRValue elementDataSize = mBfIRBuilder->CreateMul(GetConstValue(type->GetStride()), arraySize); - sizeValue = mBfIRBuilder->CreateAdd(sizeValue, elementDataSize); + auto firstElementField = &arrayType->mFieldInstances.back(); + + if (!type->IsValuelessType()) + { + int arrayClassSize = firstElementField->mDataOffset; + sizeValue = GetConstValue(arrayClassSize); + BfIRValue elementDataSize = mBfIRBuilder->CreateMul(GetConstValue(type->GetStride()), arraySize); + sizeValue = mBfIRBuilder->CreateAdd(sizeValue, elementDataSize); + } + else + sizeValue = GetConstValue(arrayType->mInstSize); auto prevBlock = mBfIRBuilder->GetInsertBlock(); isDynAlloc = (isDynAlloc) || (!sizeValue.IsConst()); diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index 2ef13cd8..10ceb74d 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -3324,11 +3324,6 @@ void BfModule::DoTypeInstanceMethodProcessing(BfTypeInstance* typeInstance) BF_ASSERT(typeInstance->mInterfaceMethodTable.size() == 1); } - if (typeInstance->mTypeDef == mCompiler->mPointerTypeDef) - { - NOP; - } - // Slot interfaces method blocks in vtable { int ifaceVirtIdx = 0;