mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-08-12 15:03:41 +00:00
interp: don't copy unknown values in runtime.sliceCopy
This was bug https://github.com/tinygo-org/tinygo/issues/3890. See the diff for details. Essentially, it means that `copy` in the interpreter was copying data that wasn't known yet, or copying data into a slice that could be read externally after the interp pass.
This commit is contained in:
committed by
Ron Evans
parent
e9d8a9bc0b
commit
f11731ff35
@@ -338,6 +338,20 @@ func (r *runner) run(fn *function, params []value, parentMem *memoryView, indent
|
||||
if err != nil {
|
||||
return nil, mem, r.errorAt(inst, err)
|
||||
}
|
||||
if mem.hasExternalStore(src) || mem.hasExternalLoadOrStore(dst) {
|
||||
// These are the same checks as there are on llvm.Load
|
||||
// and llvm.Store in the interpreter. Copying is
|
||||
// essentially loading from the source array and storing
|
||||
// to the destination array, hence why we need to do the
|
||||
// same checks here.
|
||||
// This fixes the following bug:
|
||||
// https://github.com/tinygo-org/tinygo/issues/3890
|
||||
err := r.runAtRuntime(fn, inst, locals, &mem, indent)
|
||||
if err != nil {
|
||||
return nil, mem, err
|
||||
}
|
||||
continue
|
||||
}
|
||||
nBytes := uint32(n * elemSize)
|
||||
dstObj := mem.getWritable(dst.index())
|
||||
dstBuf := dstObj.buffer.asRawValue(r)
|
||||
|
||||
Reference in New Issue
Block a user