Skip to content

Commit e1cecbb

Browse files
committed
Implement LIST_APPEND for list comprehensions and speed up BUILD_TUPLE and BUILD_LIST
1 parent f7bc949 commit e1cecbb

File tree

1 file changed

+5
-10
lines changed

1 file changed

+5
-10
lines changed

vm/eval.go

+5-10
Original file line numberDiff line numberDiff line change
@@ -510,7 +510,9 @@ func do_SET_ADD(vm *Vm, i int32) {
510510
// iterations of the loop.
511511
func do_LIST_APPEND(vm *Vm, i int32) {
512512
defer vm.CheckException()
513-
vm.NotImplemented("LIST_APPEND", i)
513+
w := vm.POP()
514+
v := vm.PEEK(int(i))
515+
v.(*py.List).Append(w)
514516
}
515517

516518
// Calls dict.setitem(TOS1[-i], TOS, TOS1). Used to implement dict comprehensions.
@@ -759,10 +761,7 @@ func do_LOAD_NAME(vm *Vm, namei int32) {
759761
func do_BUILD_TUPLE(vm *Vm, count int32) {
760762
defer vm.CheckException()
761763
tuple := make(py.Tuple, count)
762-
p := len(vm.frame.Stack) - int(count)
763-
for i := range tuple {
764-
tuple[i] = vm.frame.Stack[p+i]
765-
}
764+
copy(tuple, vm.frame.Stack[len(vm.frame.Stack)-int(count):])
766765
vm.DROPN(int(count))
767766
vm.PUSH(tuple)
768767
}
@@ -776,11 +775,7 @@ func do_BUILD_SET(vm *Vm, count int32) {
776775
// Works as BUILD_TUPLE, but creates a list.
777776
func do_BUILD_LIST(vm *Vm, count int32) {
778777
defer vm.CheckException()
779-
list := make(py.List, count)
780-
p := len(vm.frame.Stack) - int(count)
781-
for i := range list {
782-
list[i] = vm.frame.Stack[p+i]
783-
}
778+
list := py.NewListFromItems(vm.frame.Stack[len(vm.frame.Stack)-int(count):])
784779
vm.DROPN(int(count))
785780
vm.PUSH(list)
786781
}

0 commit comments

Comments
 (0)