Skip to content

Commit d84b599

Browse files
committed
compiler: Unary Ops
1 parent a9c21a1 commit d84b599

File tree

3 files changed

+88
-1
lines changed

3 files changed

+88
-1
lines changed

compile/compile.go

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,21 @@ func (c *compiler) compileExpr(expr ast.Expr) {
306306
case *ast.UnaryOp:
307307
// Op UnaryOpNumber
308308
// Operand Expr
309-
panic("FIXME not implemented")
309+
c.compileExpr(node.Operand)
310+
var op byte
311+
switch node.Op {
312+
case ast.Invert:
313+
op = vm.UNARY_INVERT
314+
case ast.Not:
315+
op = vm.UNARY_NOT
316+
case ast.UAdd:
317+
op = vm.UNARY_POSITIVE
318+
case ast.USub:
319+
op = vm.UNARY_NEGATIVE
320+
default:
321+
panic("Unknown UnaryOp")
322+
}
323+
c.Op(op)
310324
case *ast.Lambda:
311325
// Args *Arguments
312326
// Body Expr

compile/compile_data_test.go

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,4 +250,72 @@ var compileTestData = []struct {
250250
Firstlineno: 1,
251251
Lnotab: "",
252252
}, " 1 0 LOAD_CONST 0 ('a')\n 3 LOAD_CONST 1 (1)\n 6 BINARY_FLOOR_DIVIDE\n 7 RETURN_VALUE\n"},
253+
{"~ \"a\"", "eval", py.Code{
254+
Argcount: 0,
255+
Kwonlyargcount: 0,
256+
Nlocals: 0,
257+
Stacksize: 1,
258+
Flags: 64,
259+
Code: "\x64\x00\x00\x0f\x53",
260+
Consts: []py.Object{py.String("a")},
261+
Names: []string{},
262+
Varnames: []string{},
263+
Freevars: []string{},
264+
Cellvars: []string{},
265+
Filename: "<string>",
266+
Name: "<module>",
267+
Firstlineno: 1,
268+
Lnotab: "",
269+
}, " 1 0 LOAD_CONST 0 ('a')\n 3 UNARY_INVERT\n 4 RETURN_VALUE\n"},
270+
{"not \"a\"", "eval", py.Code{
271+
Argcount: 0,
272+
Kwonlyargcount: 0,
273+
Nlocals: 0,
274+
Stacksize: 1,
275+
Flags: 64,
276+
Code: "\x64\x00\x00\x0c\x53",
277+
Consts: []py.Object{py.String("a")},
278+
Names: []string{},
279+
Varnames: []string{},
280+
Freevars: []string{},
281+
Cellvars: []string{},
282+
Filename: "<string>",
283+
Name: "<module>",
284+
Firstlineno: 1,
285+
Lnotab: "",
286+
}, " 1 0 LOAD_CONST 0 ('a')\n 3 UNARY_NOT\n 4 RETURN_VALUE\n"},
287+
{"+\"a\"", "eval", py.Code{
288+
Argcount: 0,
289+
Kwonlyargcount: 0,
290+
Nlocals: 0,
291+
Stacksize: 1,
292+
Flags: 64,
293+
Code: "\x64\x00\x00\x0a\x53",
294+
Consts: []py.Object{py.String("a")},
295+
Names: []string{},
296+
Varnames: []string{},
297+
Freevars: []string{},
298+
Cellvars: []string{},
299+
Filename: "<string>",
300+
Name: "<module>",
301+
Firstlineno: 1,
302+
Lnotab: "",
303+
}, " 1 0 LOAD_CONST 0 ('a')\n 3 UNARY_POSITIVE\n 4 RETURN_VALUE\n"},
304+
{"-\"a\"", "eval", py.Code{
305+
Argcount: 0,
306+
Kwonlyargcount: 0,
307+
Nlocals: 0,
308+
Stacksize: 1,
309+
Flags: 64,
310+
Code: "\x64\x00\x00\x0b\x53",
311+
Consts: []py.Object{py.String("a")},
312+
Names: []string{},
313+
Varnames: []string{},
314+
Freevars: []string{},
315+
Cellvars: []string{},
316+
Filename: "<string>",
317+
Name: "<module>",
318+
Firstlineno: 1,
319+
Lnotab: "",
320+
}, " 1 0 LOAD_CONST 0 ('a')\n 3 UNARY_NEGATIVE\n 4 RETURN_VALUE\n"},
253321
}

compile/make_compile_test.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@
2424
('''"a"^1''', "eval"),
2525
('''"a"&1''', "eval"),
2626
('''"a"//1''', "eval"),
27+
# UnaryOps
28+
('''~ "a"''', "eval"),
29+
('''not "a"''', "eval"),
30+
('''+"a"''', "eval"),
31+
('''-"a"''', "eval"),
2732
]
2833

2934
def string(s):

0 commit comments

Comments
 (0)