From 76d58616d04d882ac0ef3ab784ca3d362e1a96df Mon Sep 17 00:00:00 2001 From: "Ben L. Titzer" Date: Wed, 22 Jul 2026 17:10:29 -0400 Subject: [PATCH] Fix check for dropped elements and data in array.new_data --- src/engine/Instance.v3 | 6 ++++++ src/engine/Runtime.v3 | 8 +++----- test/regress.failures | 1 - 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/engine/Instance.v3 b/src/engine/Instance.v3 index 3040c3a90..dea08298f 100644 --- a/src/engine/Instance.v3 +++ b/src/engine/Instance.v3 @@ -147,7 +147,12 @@ class Instance(module: Module, imports: Array) { var d: T; return d; } + def getData(data_index: int) -> Array { + if (dropped_data[data_index]) return EMPTY_BYTE_ARRAY; + return this.module.data[data_index].data; + } def getElems(elem_index: int) -> Array { + if (dropped_elems[elem_index]) return Values.NONE; var evals = this.elems[elem_index]; if (evals != null) return evals; var edecl = module.elems[elem_index]; @@ -164,3 +169,4 @@ class Instance(module: Module, imports: Array) { return evals; } } +def EMPTY_BYTE_ARRAY: Array = []; diff --git a/src/engine/Runtime.v3 b/src/engine/Runtime.v3 index c37e92193..1050bcda3 100644 --- a/src/engine/Runtime.v3 +++ b/src/engine/Runtime.v3 @@ -111,11 +111,10 @@ component Runtime { def ARRAY_NEW_DATA(stack: ExecStack, instance: Instance, array_index: u31, data_index: u31) -> Throwable { var length = stack.popu(); var offset = stack.popu(); - if (instance.dropped_data[data_index]) return stack.trap(TrapReason.MEMORY_OOB); if (length > Execute.limits.max_array_length) return stack.trap(TrapReason.OOM); var rtt = ArrayDecl.!(instance.heaptypes[array_index]); - var ddecl = instance.module.data[data_index]; - var t = bytesToVals(rtt.elem_types[0], ddecl.data, offset, length); + var ddata = instance.getData(data_index); + var t = bytesToVals(rtt.elem_types[0], ddata, offset, length); if (!t.0) return stack.trap(TrapReason.MEMORY_OOB); stack.push(Value.Ref(HeapArray.new(rtt, t.1))); return null; @@ -123,7 +122,6 @@ component Runtime { def ARRAY_NEW_ELEM(stack: ExecStack, instance: Instance, array_index: u31, elem_index: u31) -> Throwable { var length = stack.popu(); var offset = stack.popu(); - if (instance.dropped_elems[elem_index]) return stack.trap(TrapReason.MEMORY_OOB); if (length > Execute.limits.max_array_length) return stack.trap(TrapReason.OOM); var rtt = ArrayDecl.!(instance.heaptypes[array_index]); var evals = instance.getElems(elem_index); @@ -422,11 +420,11 @@ component Runtime { } } def bytesToVals(storage: StorageType, data: Array, offset: u32, length: u32) -> (bool, Array) { // TODO: MaybeTrap - var vals = Array.new(int.!(length)); var start = ArrayUtil.boundsCheck(data, offset, length); if (start < 0) return (false, null); var limit = sizeOfStorage(storage) * length + offset; if (limit > data.length) return (false, null); + var vals = Array.new(int.!(length)); var d = DataReader.new(data).reset(data, start, int.!(limit)); match (storage.pack) { UNPACKED => { diff --git a/test/regress.failures b/test/regress.failures index 468c88a0d..0356b1366 100644 --- a/test/regress.failures +++ b/test/regress.failures @@ -1,4 +1,3 @@ test/regress/ext:threads/atomic_wait32_0.bin.wast test/regress/ext:threads/atomic_wait64_0.bin.wast -test/regress/ext:gc/zdrop_657.bin.wast test/regress/ext:gc/zcopy_656.bin.wast