From 13bbd6a5325a41b4a4d860afa0f1eb0efc5f3853 Mon Sep 17 00:00:00 2001 From: Andrea Peruffo Date: Wed, 17 Apr 2024 19:48:50 +0100 Subject: [PATCH] finishing bulk operations --- runtime/pom.xml | 3 --- .../com/dylibso/chicory/runtime/Machine.java | 22 ++++++++++++++----- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/runtime/pom.xml b/runtime/pom.xml index fdd919850..51cf66eee 100644 --- a/runtime/pom.xml +++ b/runtime/pom.xml @@ -131,9 +131,6 @@ load.wast, ref_is_null.wast - - SpecV1BulkTest.test91, SpecV1BulkTest.test95, SpecV1BulkTest.test89, - SpecV1BulkTest.test93, SpecV1AddressTest.test199, SpecV1AddressTest.test200, SpecV1AddressTest.test201, SpecV1AddressTest.test202, SpecV1AddressTest.test203, SpecV1AddressTest.test204, diff --git a/runtime/src/main/java/com/dylibso/chicory/runtime/Machine.java b/runtime/src/main/java/com/dylibso/chicory/runtime/Machine.java index 8720a1a9e..e70dcbb2e 100644 --- a/runtime/src/main/java/com/dylibso/chicory/runtime/Machine.java +++ b/runtime/src/main/java/com/dylibso/chicory/runtime/Machine.java @@ -1599,13 +1599,23 @@ private static void TABLE_INIT(MStack stack, Instance instance, long[] operands) var table = instance.table(tableidx); - if (size < 0 - || elementidx > instance.elementCount() - || instance.element(elementidx) == null - || !(instance.element(elementidx) instanceof PassiveElement) - || elemidx + size > instance.element(elementidx).elementCount() - || end > table.size()) { + var elementCount = instance.elementCount(); + var currentElement = instance.element(elementidx); + var currentElementCount = + (currentElement instanceof PassiveElement) ? currentElement.elementCount() : 0; + boolean isOutOfBounds = + (size < 0 + || elementidx > elementCount + || (size > 0 + && (currentElement == null + || !(currentElement instanceof PassiveElement))) + || elemidx + size > currentElementCount + || end > table.size()); + + if (isOutOfBounds) { throw new WASMRuntimeException("out of bounds table access"); + } else if (size == 0) { + return; } for (int i = offset; i < end; i++) {