Skip to content

Commit 54f7fe1

Browse files
committed
compiler: implement tuple and list
1 parent 9b2aead commit 54f7fe1

File tree

3 files changed

+215
-3
lines changed

3 files changed

+215
-3
lines changed

compile/compile.go

+10-2
Original file line numberDiff line numberDiff line change
@@ -525,11 +525,19 @@ func (c *compiler) Expr(expr ast.Expr) {
525525
case *ast.List:
526526
// Elts []Expr
527527
// Ctx ExprContext
528-
panic("FIXME compile: List not implemented")
528+
// FIXME do something with Ctx
529+
for _, elt := range node.Elts {
530+
c.Expr(elt)
531+
}
532+
c.OpArg(vm.BUILD_LIST, uint32(len(node.Elts)))
529533
case *ast.Tuple:
530534
// Elts []Expr
531535
// Ctx ExprContext
532-
panic("FIXME compile: Tuple not implemented")
536+
// FIXME do something with Ctx
537+
for _, elt := range node.Elts {
538+
c.Expr(elt)
539+
}
540+
c.OpArg(vm.BUILD_TUPLE, uint32(len(node.Elts)))
533541
default:
534542
panic(py.ExceptionNewf(py.SyntaxError, "Unknown ExprBase: %v", expr))
535543
}

compile/compile_data_test.go

+187
Original file line numberDiff line numberDiff line change
@@ -760,4 +760,191 @@ var compileTestData = []struct {
760760
Firstlineno: 1,
761761
Lnotab: "",
762762
}, " 1 0 LOAD_NAME 0 (a)\n 3 LOAD_NAME 1 (b)\n 6 DUP_TOP\n 7 ROT_THREE\n 8 COMPARE_OP 0 (<)\n 11 JUMP_IF_FALSE_OR_POP 45\n 14 LOAD_NAME 2 (c)\n 17 DUP_TOP\n 18 ROT_THREE\n 19 COMPARE_OP 0 (<)\n 22 JUMP_IF_FALSE_OR_POP 45\n 25 LOAD_NAME 3 (d)\n 28 DUP_TOP\n 29 ROT_THREE\n 30 COMPARE_OP 0 (<)\n 33 JUMP_IF_FALSE_OR_POP 45\n 36 LOAD_NAME 4 (e)\n 39 COMPARE_OP 0 (<)\n 42 JUMP_FORWARD 2 (to 47)\n >> 45 ROT_TWO\n 46 POP_TOP\n >> 47 LOAD_CONST 0 (0)\n 50 BINARY_ADD\n 51 RETURN_VALUE\n"},
763+
{"()", "eval", py.Code{
764+
Argcount: 0,
765+
Kwonlyargcount: 0,
766+
Nlocals: 0,
767+
Stacksize: 1,
768+
Flags: 64,
769+
Code: "\x66\x00\x00\x53",
770+
Consts: []py.Object{},
771+
Names: []string{},
772+
Varnames: []string{},
773+
Freevars: []string{},
774+
Cellvars: []string{},
775+
Filename: "<string>",
776+
Name: "<module>",
777+
Firstlineno: 1,
778+
Lnotab: "",
779+
}, " 1 0 BUILD_TUPLE 0\n 3 RETURN_VALUE\n"},
780+
{"(a,)", "eval", py.Code{
781+
Argcount: 0,
782+
Kwonlyargcount: 0,
783+
Nlocals: 0,
784+
Stacksize: 1,
785+
Flags: 64,
786+
Code: "\x65\x00\x00\x66\x01\x00\x53",
787+
Consts: []py.Object{},
788+
Names: []string{"a"},
789+
Varnames: []string{},
790+
Freevars: []string{},
791+
Cellvars: []string{},
792+
Filename: "<string>",
793+
Name: "<module>",
794+
Firstlineno: 1,
795+
Lnotab: "",
796+
}, " 1 0 LOAD_NAME 0 (a)\n 3 BUILD_TUPLE 1\n 6 RETURN_VALUE\n"},
797+
{"(a,b)", "eval", py.Code{
798+
Argcount: 0,
799+
Kwonlyargcount: 0,
800+
Nlocals: 0,
801+
Stacksize: 2,
802+
Flags: 64,
803+
Code: "\x65\x00\x00\x65\x01\x00\x66\x02\x00\x53",
804+
Consts: []py.Object{},
805+
Names: []string{"a", "b"},
806+
Varnames: []string{},
807+
Freevars: []string{},
808+
Cellvars: []string{},
809+
Filename: "<string>",
810+
Name: "<module>",
811+
Firstlineno: 1,
812+
Lnotab: "",
813+
}, " 1 0 LOAD_NAME 0 (a)\n 3 LOAD_NAME 1 (b)\n 6 BUILD_TUPLE 2\n 9 RETURN_VALUE\n"},
814+
{"(a,b,c,d)", "eval", py.Code{
815+
Argcount: 0,
816+
Kwonlyargcount: 0,
817+
Nlocals: 0,
818+
Stacksize: 4,
819+
Flags: 64,
820+
Code: "\x65\x00\x00\x65\x01\x00\x65\x02\x00\x65\x03\x00\x66\x04\x00\x53",
821+
Consts: []py.Object{},
822+
Names: []string{"a", "b", "c", "d"},
823+
Varnames: []string{},
824+
Freevars: []string{},
825+
Cellvars: []string{},
826+
Filename: "<string>",
827+
Name: "<module>",
828+
Firstlineno: 1,
829+
Lnotab: "",
830+
}, " 1 0 LOAD_NAME 0 (a)\n 3 LOAD_NAME 1 (b)\n 6 LOAD_NAME 2 (c)\n 9 LOAD_NAME 3 (d)\n 12 BUILD_TUPLE 4\n 15 RETURN_VALUE\n"},
831+
{"[]", "eval", py.Code{
832+
Argcount: 0,
833+
Kwonlyargcount: 0,
834+
Nlocals: 0,
835+
Stacksize: 1,
836+
Flags: 64,
837+
Code: "\x67\x00\x00\x53",
838+
Consts: []py.Object{},
839+
Names: []string{},
840+
Varnames: []string{},
841+
Freevars: []string{},
842+
Cellvars: []string{},
843+
Filename: "<string>",
844+
Name: "<module>",
845+
Firstlineno: 1,
846+
Lnotab: "",
847+
}, " 1 0 BUILD_LIST 0\n 3 RETURN_VALUE\n"},
848+
{"[1]", "eval", py.Code{
849+
Argcount: 0,
850+
Kwonlyargcount: 0,
851+
Nlocals: 0,
852+
Stacksize: 1,
853+
Flags: 64,
854+
Code: "\x64\x00\x00\x67\x01\x00\x53",
855+
Consts: []py.Object{py.Int(1)},
856+
Names: []string{},
857+
Varnames: []string{},
858+
Freevars: []string{},
859+
Cellvars: []string{},
860+
Filename: "<string>",
861+
Name: "<module>",
862+
Firstlineno: 1,
863+
Lnotab: "",
864+
}, " 1 0 LOAD_CONST 0 (1)\n 3 BUILD_LIST 1\n 6 RETURN_VALUE\n"},
865+
{"[1,1]", "eval", py.Code{
866+
Argcount: 0,
867+
Kwonlyargcount: 0,
868+
Nlocals: 0,
869+
Stacksize: 2,
870+
Flags: 64,
871+
Code: "\x64\x00\x00\x64\x00\x00\x67\x02\x00\x53",
872+
Consts: []py.Object{py.Int(1)},
873+
Names: []string{},
874+
Varnames: []string{},
875+
Freevars: []string{},
876+
Cellvars: []string{},
877+
Filename: "<string>",
878+
Name: "<module>",
879+
Firstlineno: 1,
880+
Lnotab: "",
881+
}, " 1 0 LOAD_CONST 0 (1)\n 3 LOAD_CONST 0 (1)\n 6 BUILD_LIST 2\n 9 RETURN_VALUE\n"},
882+
{"[1,1,3,1]", "eval", py.Code{
883+
Argcount: 0,
884+
Kwonlyargcount: 0,
885+
Nlocals: 0,
886+
Stacksize: 4,
887+
Flags: 64,
888+
Code: "\x64\x00\x00\x64\x00\x00\x64\x01\x00\x64\x00\x00\x67\x04\x00\x53",
889+
Consts: []py.Object{py.Int(1), py.Int(3)},
890+
Names: []string{},
891+
Varnames: []string{},
892+
Freevars: []string{},
893+
Cellvars: []string{},
894+
Filename: "<string>",
895+
Name: "<module>",
896+
Firstlineno: 1,
897+
Lnotab: "",
898+
}, " 1 0 LOAD_CONST 0 (1)\n 3 LOAD_CONST 0 (1)\n 6 LOAD_CONST 1 (3)\n 9 LOAD_CONST 0 (1)\n 12 BUILD_LIST 4\n 15 RETURN_VALUE\n"},
899+
{"[a]", "eval", py.Code{
900+
Argcount: 0,
901+
Kwonlyargcount: 0,
902+
Nlocals: 0,
903+
Stacksize: 1,
904+
Flags: 64,
905+
Code: "\x65\x00\x00\x67\x01\x00\x53",
906+
Consts: []py.Object{},
907+
Names: []string{"a"},
908+
Varnames: []string{},
909+
Freevars: []string{},
910+
Cellvars: []string{},
911+
Filename: "<string>",
912+
Name: "<module>",
913+
Firstlineno: 1,
914+
Lnotab: "",
915+
}, " 1 0 LOAD_NAME 0 (a)\n 3 BUILD_LIST 1\n 6 RETURN_VALUE\n"},
916+
{"[a,b]", "eval", py.Code{
917+
Argcount: 0,
918+
Kwonlyargcount: 0,
919+
Nlocals: 0,
920+
Stacksize: 2,
921+
Flags: 64,
922+
Code: "\x65\x00\x00\x65\x01\x00\x67\x02\x00\x53",
923+
Consts: []py.Object{},
924+
Names: []string{"a", "b"},
925+
Varnames: []string{},
926+
Freevars: []string{},
927+
Cellvars: []string{},
928+
Filename: "<string>",
929+
Name: "<module>",
930+
Firstlineno: 1,
931+
Lnotab: "",
932+
}, " 1 0 LOAD_NAME 0 (a)\n 3 LOAD_NAME 1 (b)\n 6 BUILD_LIST 2\n 9 RETURN_VALUE\n"},
933+
{"[a,b,c,d]", "eval", py.Code{
934+
Argcount: 0,
935+
Kwonlyargcount: 0,
936+
Nlocals: 0,
937+
Stacksize: 4,
938+
Flags: 64,
939+
Code: "\x65\x00\x00\x65\x01\x00\x65\x02\x00\x65\x03\x00\x67\x04\x00\x53",
940+
Consts: []py.Object{},
941+
Names: []string{"a", "b", "c", "d"},
942+
Varnames: []string{},
943+
Freevars: []string{},
944+
Cellvars: []string{},
945+
Filename: "<string>",
946+
Name: "<module>",
947+
Firstlineno: 1,
948+
Lnotab: "",
949+
}, " 1 0 LOAD_NAME 0 (a)\n 3 LOAD_NAME 1 (b)\n 6 LOAD_NAME 2 (c)\n 9 LOAD_NAME 3 (d)\n 12 BUILD_LIST 4\n 15 RETURN_VALUE\n"},
763950
}

compile/make_compile_test.py

+18-1
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,22 @@
6060
('''(a < b < c)+0''', "eval"),
6161
('''(a < b < c < d)+0''', "eval"),
6262
('''(a < b < c < d < e)+0''', "eval"),
63-
63+
# tuple
64+
('''()''', "eval"),
65+
# ('''(1,)''', "eval"),
66+
# ('''(1,1)''', "eval"),
67+
# ('''(1,1,3,1)''', "eval"),
68+
('''(a,)''', "eval"),
69+
('''(a,b)''', "eval"),
70+
('''(a,b,c,d)''', "eval"),
71+
# list
72+
('''[]''', "eval"),
73+
('''[1]''', "eval"),
74+
('''[1,1]''', "eval"),
75+
('''[1,1,3,1]''', "eval"),
76+
('''[a]''', "eval"),
77+
('''[a,b]''', "eval"),
78+
('''[a,b,c,d]''', "eval"),
6479
]
6580

6681
def string(s):
@@ -88,6 +103,8 @@ def const(x):
88103
return 'py.Float(%g)' % x
89104
elif isinstance(x, bytes):
90105
return 'py.Bytes("%s")' % x.decode("latin1")
106+
elif isinstance(x, tuple):
107+
return 'py.Tuple{%s}' % ",".join(const(y) for y in x)
91108
elif x is None:
92109
return 'py.None'
93110
else:

0 commit comments

Comments
 (0)