Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions src/engine/Instance.v3
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,12 @@ class Instance(module: Module, imports: Array<Exportable>) {
var d: T;
return d;
}
def getData(data_index: int) -> Array<byte> {
if (dropped_data[data_index]) return EMPTY_BYTE_ARRAY;
return this.module.data[data_index].data;
}
def getElems(elem_index: int) -> Array<Value> {
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];
Expand All @@ -164,3 +169,4 @@ class Instance(module: Module, imports: Array<Exportable>) {
return evals;
}
}
def EMPTY_BYTE_ARRAY: Array<byte> = [];
8 changes: 3 additions & 5 deletions src/engine/Runtime.v3
Original file line number Diff line number Diff line change
Expand Up @@ -111,19 +111,17 @@ 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;
}
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);
Expand Down Expand Up @@ -422,11 +420,11 @@ component Runtime {
}
}
def bytesToVals(storage: StorageType, data: Array<byte>, offset: u32, length: u32) -> (bool, Array<Value>) { // TODO: MaybeTrap
var vals = Array<Value>.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<Value>.new(int.!(length));
var d = DataReader.new(data).reset(data, start, int.!(limit));
match (storage.pack) {
UNPACKED => {
Expand Down
1 change: 0 additions & 1 deletion test/regress.failures
Original file line number Diff line number Diff line change
@@ -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
Loading