Skip to content

Commit 058a4e2

Browse files
committed
Implement py.GetItem/BINARY_SUBSCR and optimise some vm stack operations
1 parent 6fd60a4 commit 058a4e2

File tree

2 files changed

+55
-51
lines changed

2 files changed

+55
-51
lines changed

py/internal.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,8 @@ func Call(fn Object, args Tuple, kwargs StringDict) Object {
8080
func GetItem(self Object, key Object) Object {
8181
if I, ok := self.(I__getitem__); ok {
8282
return I.M__getitem__(key)
83+
} else if res, ok := TypeCall1(self, "__getitem__", key); ok {
84+
return res
8385
}
8486
// FIXME should be TypeError
8587
panic(fmt.Sprintf("TypeError: '%s' object is not subscriptable", self.Type().Name))

vm/eval.go

Lines changed: 53 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -125,91 +125,93 @@ func do_STORE_LOCALS(vm *Vm, arg int32) {
125125
// Implements TOS = TOS1 ** TOS.
126126
func do_BINARY_POWER(vm *Vm, arg int32) {
127127
b := vm.POP()
128-
a := vm.POP()
129-
vm.PUSH(py.Pow(a, b, py.None))
128+
a := vm.TOP()
129+
vm.SET_TOP(py.Pow(a, b, py.None))
130130
}
131131

132132
// Implements TOS = TOS1 * TOS.
133133
func do_BINARY_MULTIPLY(vm *Vm, arg int32) {
134134
b := vm.POP()
135-
a := vm.POP()
136-
vm.PUSH(py.Mul(a, b))
135+
a := vm.TOP()
136+
vm.SET_TOP(py.Mul(a, b))
137137
}
138138

139139
// Implements TOS = TOS1 // TOS.
140140
func do_BINARY_FLOOR_DIVIDE(vm *Vm, arg int32) {
141141
b := vm.POP()
142-
a := vm.POP()
143-
vm.PUSH(py.FloorDiv(a, b))
142+
a := vm.TOP()
143+
vm.SET_TOP(py.FloorDiv(a, b))
144144
}
145145

146146
// Implements TOS = TOS1 / TOS when from __future__ import division is
147147
// in effect.
148148
func do_BINARY_TRUE_DIVIDE(vm *Vm, arg int32) {
149149
b := vm.POP()
150-
a := vm.POP()
151-
vm.PUSH(py.TrueDiv(a, b))
150+
a := vm.TOP()
151+
vm.SET_TOP(py.TrueDiv(a, b))
152152
}
153153

154154
// Implements TOS = TOS1 % TOS.
155155
func do_BINARY_MODULO(vm *Vm, arg int32) {
156156
b := vm.POP()
157-
a := vm.POP()
158-
vm.PUSH(py.Mod(a, b))
157+
a := vm.TOP()
158+
vm.SET_TOP(py.Mod(a, b))
159159
}
160160

161161
// Implements TOS = TOS1 + TOS.
162162
func do_BINARY_ADD(vm *Vm, arg int32) {
163163
b := vm.POP()
164-
a := vm.POP()
165-
vm.PUSH(py.Add(a, b))
164+
a := vm.TOP()
165+
vm.SET_TOP(py.Add(a, b))
166166
}
167167

168168
// Implements TOS = TOS1 - TOS.
169169
func do_BINARY_SUBTRACT(vm *Vm, arg int32) {
170170
b := vm.POP()
171-
a := vm.POP()
172-
vm.PUSH(py.Sub(a, b))
171+
a := vm.TOP()
172+
vm.SET_TOP(py.Sub(a, b))
173173
}
174174

175175
// Implements TOS = TOS1[TOS].
176176
func do_BINARY_SUBSCR(vm *Vm, arg int32) {
177-
vm.NotImplemented("BINARY_SUBSCR", arg)
177+
b := vm.POP()
178+
a := vm.TOP()
179+
vm.SET_TOP(py.GetItem(a, b))
178180
}
179181

180182
// Implements TOS = TOS1 << TOS.
181183
func do_BINARY_LSHIFT(vm *Vm, arg int32) {
182184
b := vm.POP()
183-
a := vm.POP()
184-
vm.PUSH(py.Lshift(a, b))
185+
a := vm.TOP()
186+
vm.SET_TOP(py.Lshift(a, b))
185187
}
186188

187189
// Implements TOS = TOS1 >> TOS.
188190
func do_BINARY_RSHIFT(vm *Vm, arg int32) {
189191
b := vm.POP()
190-
a := vm.POP()
191-
vm.PUSH(py.Rshift(a, b))
192+
a := vm.TOP()
193+
vm.SET_TOP(py.Rshift(a, b))
192194
}
193195

194196
// Implements TOS = TOS1 & TOS.
195197
func do_BINARY_AND(vm *Vm, arg int32) {
196198
b := vm.POP()
197-
a := vm.POP()
198-
vm.PUSH(py.And(a, b))
199+
a := vm.TOP()
200+
vm.SET_TOP(py.And(a, b))
199201
}
200202

201203
// Implements TOS = TOS1 ^ TOS.
202204
func do_BINARY_XOR(vm *Vm, arg int32) {
203205
b := vm.POP()
204-
a := vm.POP()
205-
vm.PUSH(py.Xor(a, b))
206+
a := vm.TOP()
207+
vm.SET_TOP(py.Xor(a, b))
206208
}
207209

208210
// Implements TOS = TOS1 | TOS.
209211
func do_BINARY_OR(vm *Vm, arg int32) {
210212
b := vm.POP()
211-
a := vm.POP()
212-
vm.PUSH(py.Or(a, b))
213+
a := vm.TOP()
214+
vm.SET_TOP(py.Or(a, b))
213215
}
214216

215217
// In-place operations are like binary operations, in that they remove
@@ -220,86 +222,86 @@ func do_BINARY_OR(vm *Vm, arg int32) {
220222
// Implements in-place TOS = TOS1 ** TOS.
221223
func do_INPLACE_POWER(vm *Vm, arg int32) {
222224
b := vm.POP()
223-
a := vm.POP()
224-
vm.PUSH(py.IPow(a, b, py.None))
225+
a := vm.TOP()
226+
vm.SET_TOP(py.IPow(a, b, py.None))
225227
}
226228

227229
// Implements in-place TOS = TOS1 * TOS.
228230
func do_INPLACE_MULTIPLY(vm *Vm, arg int32) {
229231
b := vm.POP()
230-
a := vm.POP()
231-
vm.PUSH(py.IMul(a, b))
232+
a := vm.TOP()
233+
vm.SET_TOP(py.IMul(a, b))
232234
}
233235

234236
// Implements in-place TOS = TOS1 // TOS.
235237
func do_INPLACE_FLOOR_DIVIDE(vm *Vm, arg int32) {
236238
b := vm.POP()
237-
a := vm.POP()
238-
vm.PUSH(py.IFloorDiv(a, b))
239+
a := vm.TOP()
240+
vm.SET_TOP(py.IFloorDiv(a, b))
239241
}
240242

241243
// Implements in-place TOS = TOS1 / TOS when from __future__ import
242244
// division is in effect.
243245
func do_INPLACE_TRUE_DIVIDE(vm *Vm, arg int32) {
244246
b := vm.POP()
245-
a := vm.POP()
246-
vm.PUSH(py.ITrueDiv(a, b))
247+
a := vm.TOP()
248+
vm.SET_TOP(py.ITrueDiv(a, b))
247249
}
248250

249251
// Implements in-place TOS = TOS1 % TOS.
250252
func do_INPLACE_MODULO(vm *Vm, arg int32) {
251253
b := vm.POP()
252-
a := vm.POP()
253-
vm.PUSH(py.Mod(a, b))
254+
a := vm.TOP()
255+
vm.SET_TOP(py.Mod(a, b))
254256
}
255257

256258
// Implements in-place TOS = TOS1 + TOS.
257259
func do_INPLACE_ADD(vm *Vm, arg int32) {
258260
b := vm.POP()
259-
a := vm.POP()
260-
vm.PUSH(py.IAdd(a, b))
261+
a := vm.TOP()
262+
vm.SET_TOP(py.IAdd(a, b))
261263
}
262264

263265
// Implements in-place TOS = TOS1 - TOS.
264266
func do_INPLACE_SUBTRACT(vm *Vm, arg int32) {
265267
b := vm.POP()
266-
a := vm.POP()
267-
vm.PUSH(py.ISub(a, b))
268+
a := vm.TOP()
269+
vm.SET_TOP(py.ISub(a, b))
268270
}
269271

270272
// Implements in-place TOS = TOS1 << TOS.
271273
func do_INPLACE_LSHIFT(vm *Vm, arg int32) {
272274
b := vm.POP()
273-
a := vm.POP()
274-
vm.PUSH(py.ILshift(a, b))
275+
a := vm.TOP()
276+
vm.SET_TOP(py.ILshift(a, b))
275277
}
276278

277279
// Implements in-place TOS = TOS1 >> TOS.
278280
func do_INPLACE_RSHIFT(vm *Vm, arg int32) {
279281
b := vm.POP()
280-
a := vm.POP()
281-
vm.PUSH(py.IRshift(a, b))
282+
a := vm.TOP()
283+
vm.SET_TOP(py.IRshift(a, b))
282284
}
283285

284286
// Implements in-place TOS = TOS1 & TOS.
285287
func do_INPLACE_AND(vm *Vm, arg int32) {
286288
b := vm.POP()
287-
a := vm.POP()
288-
vm.PUSH(py.IAnd(a, b))
289+
a := vm.TOP()
290+
vm.SET_TOP(py.IAnd(a, b))
289291
}
290292

291293
// Implements in-place TOS = TOS1 ^ TOS.
292294
func do_INPLACE_XOR(vm *Vm, arg int32) {
293295
b := vm.POP()
294-
a := vm.POP()
295-
vm.PUSH(py.IXor(a, b))
296+
a := vm.TOP()
297+
vm.SET_TOP(py.IXor(a, b))
296298
}
297299

298300
// Implements in-place TOS = TOS1 | TOS.
299301
func do_INPLACE_OR(vm *Vm, arg int32) {
300302
b := vm.POP()
301-
a := vm.POP()
302-
vm.PUSH(py.IOr(a, b))
303+
a := vm.TOP()
304+
vm.SET_TOP(py.IOr(a, b))
303305
}
304306

305307
// Implements TOS1[TOS] = TOS2.
@@ -562,7 +564,7 @@ func do_LOAD_ATTR(vm *Vm, namei int32) {
562564
// cmp_op[opname].
563565
func do_COMPARE_OP(vm *Vm, opname int32) {
564566
b := vm.POP()
565-
a := vm.POP()
567+
a := vm.TOP()
566568
var r py.Object
567569
switch opname {
568570
case PyCmp_LT:
@@ -580,7 +582,7 @@ func do_COMPARE_OP(vm *Vm, opname int32) {
580582
default:
581583
vm.NotImplemented("COMPARE_OP", opname)
582584
}
583-
vm.PUSH(r)
585+
vm.SET_TOP(r)
584586
}
585587

586588
// Imports the module co_names[namei]. TOS and TOS1 are popped and

0 commit comments

Comments
 (0)