Bläddra i källkod

Fixed panic in newArrayFromIter when the iterator is already closed. Fixes #375

Dmitry Panov 3 år sedan
förälder
incheckning
a18ffb9c58
2 ändrade filer med 15 tillägg och 3 borttagningar
  1. 5 3
      vm.go
  2. 10 0
      vm_test.go

+ 5 - 3
vm.go

@@ -1842,9 +1842,11 @@ func (_newArrayFromIter) exec(vm *vm) {
 	iter := vm.iterStack[l].iter
 	vm.iterStack[l] = iterStackItem{}
 	vm.iterStack = vm.iterStack[:l]
-	iter.iterate(func(val Value) {
-		values = append(values, val)
-	})
+	if iter.iterator != nil {
+		iter.iterate(func(val Value) {
+			values = append(values, val)
+		})
+	}
 	vm.push(vm.r.newArrayValues(values))
 	vm.pc++
 }

+ 10 - 0
vm_test.go

@@ -80,6 +80,16 @@ func TestResolveMixedStack1(t *testing.T) {
 	testScript(SCRIPT, valueInt(42), t)
 }
 
+func TestNewArrayFromIterClosed(t *testing.T) {
+	const SCRIPT = `
+	const [a, ...other] = [];
+	assert.sameValue(a, undefined);
+	assert(Array.isArray(other));
+	assert.sameValue(other.length, 0);
+	`
+	testScriptWithTestLib(SCRIPT, _undefined, t)
+}
+
 func BenchmarkVmNOP2(b *testing.B) {
 	prg := []func(*vm){
 		//loadVal(0).exec,