From 200bb6453ce8dcae8b30bf4fb2fcc2cbbf02e00e Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Wed, 1 Mar 2023 05:41:20 -0500 Subject: [PATCH] Pointer subtraction using stride instead of size --- IDEHelper/Compiler/BfExprEvaluator.cpp | 2 +- IDEHelper/Tests/src/Loops.bf | 15 +++++++++++++++ IDEHelper/Tests/src/Structs.bf | 14 ++++++++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index 3a27484b..b122b8f2 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -24256,7 +24256,7 @@ void BfExprEvaluator::PerformBinaryOperation(BfAstNode* leftExpression, BfAstNod convLeftValue = mModule->CastToValue(leftExpression, leftValue, intPtrType, (BfCastFlags)(BfCastFlags_Explicit | BfCastFlags_FromCompiler)); convRightValue = mModule->CastToValue(rightExpression, rightValue, intPtrType, (BfCastFlags)(BfCastFlags_Explicit | BfCastFlags_FromCompiler)); BfIRValue diffValue = mModule->mBfIRBuilder->CreateSub(convLeftValue, convRightValue); - diffValue = mModule->mBfIRBuilder->CreateDiv(diffValue, mModule->GetConstValue(resultPointerType->mElementType->mSize, intPtrType), true); + diffValue = mModule->mBfIRBuilder->CreateDiv(diffValue, mModule->GetConstValue(resultPointerType->mElementType->GetStride(), intPtrType), true); mResult = BfTypedValue(diffValue, intPtrType); } return; diff --git a/IDEHelper/Tests/src/Loops.bf b/IDEHelper/Tests/src/Loops.bf index 9909ec56..3ed41260 100644 --- a/IDEHelper/Tests/src/Loops.bf +++ b/IDEHelper/Tests/src/Loops.bf @@ -134,9 +134,24 @@ namespace Tests Test.Assert(!(1..<3).Contains(1..<4)); List iList = scope .() { 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 }; + int itrCount = 0; total = 0; for (int i in iList[...]) + { + itrCount++; total += i; + } + Test.Assert(itrCount == 10); + Test.Assert(total == 10+20+30+40+50+60+70+80+90+100); + + total = 0; + itrCount = 0; + for (int i in iList[...].Reversed) + { + itrCount++; + total += i; + } + Test.Assert(itrCount == 10); Test.Assert(total == 10+20+30+40+50+60+70+80+90+100); total = 0; diff --git a/IDEHelper/Tests/src/Structs.bf b/IDEHelper/Tests/src/Structs.bf index a0518aa0..d5473c8b 100644 --- a/IDEHelper/Tests/src/Structs.bf +++ b/IDEHelper/Tests/src/Structs.bf @@ -189,6 +189,20 @@ namespace Tests StructN sn = GetStructN(); Test.Assert(sn.mA == 123); + + List list = scope .(); + for (int i < 10) + list.Add(default); + var ptr0 = &list[0]; + var ptr9 = &list[9]; + + int count = ptr9 - ptr0; + Test.Assert(count == 9); + + var ptr9B = ptr0 + 9; + count = ptr9B - ptr0; + Test.Assert(ptr9 == ptr9B); + Test.Assert(count == 9); } [Align(16)]