Skip to content

Commit a41637b

Browse files
committed
don't generate unecessary code for classes
1 parent 3a7f550 commit a41637b

File tree

4 files changed

+204
-576
lines changed

4 files changed

+204
-576
lines changed

moonscript/transform.lua

Lines changed: 88 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -888,6 +888,9 @@ Statement = Transformer({
888888
end,
889889
class = function(self, node, ret, parent_assign)
890890
local _, name, parent_val, body = unpack(node)
891+
if parent_val == "" then
892+
parent_val = nil
893+
end
891894
local statements = { }
892895
local properties = { }
893896
for _index_0 = 1, #body do
@@ -939,30 +942,29 @@ Statement = Transformer({
939942
local self_name = NameProxy("self")
940943
local cls_name = NameProxy("class")
941944
if not (constructor) then
942-
constructor = build.fndef({
943-
args = {
944-
{
945-
"..."
946-
}
947-
},
948-
arrow = "fat",
949-
body = {
950-
build["if"]({
951-
cond = parent_cls_name,
952-
["then"] = {
953-
build.chain({
954-
base = "super",
945+
if parent_val then
946+
constructor = build.fndef({
947+
args = {
948+
{
949+
"..."
950+
}
951+
},
952+
arrow = "fat",
953+
body = {
954+
build.chain({
955+
base = "super",
956+
{
957+
"call",
955958
{
956-
"call",
957-
{
958-
"..."
959-
}
959+
"..."
960960
}
961-
})
962-
}
963-
})
964-
}
965-
})
961+
}
962+
})
963+
}
964+
})
965+
else
966+
constructor = build.fndef()
967+
end
966968
end
967969
local real_name = name or parent_assign and parent_assign[2][1]
968970
local _exp_0 = ntype(real_name)
@@ -1002,56 +1004,60 @@ Statement = Transformer({
10021004
"__name",
10031005
real_name
10041006
},
1005-
{
1007+
parent_val and {
10061008
"__parent",
10071009
parent_cls_name
1008-
}
1009-
})
1010-
local class_lookup = build["if"]({
1011-
cond = {
1012-
"exp",
1013-
"val",
1014-
"==",
1015-
"nil",
1016-
"and",
1017-
parent_cls_name
1018-
},
1019-
["then"] = {
1020-
parent_cls_name:index("name")
1021-
}
1010+
} or nil
10221011
})
1023-
insert(class_lookup, {
1024-
"else",
1025-
{
1026-
"val"
1027-
}
1028-
})
1029-
local cls_mt = build.table({
1030-
{
1031-
"__index",
1032-
build.fndef({
1033-
args = {
1034-
{
1035-
"cls"
1036-
},
1037-
{
1038-
"name"
1039-
}
1012+
local class_index
1013+
if parent_val then
1014+
local class_lookup = build["if"]({
1015+
cond = {
1016+
"exp",
1017+
"val",
1018+
"==",
1019+
"nil"
1020+
},
1021+
["then"] = {
1022+
parent_cls_name:index("name")
1023+
}
1024+
})
1025+
insert(class_lookup, {
1026+
"else",
1027+
{
1028+
"val"
1029+
}
1030+
})
1031+
class_index = build.fndef({
1032+
args = {
1033+
{
1034+
"cls"
10401035
},
1041-
body = {
1042-
build.assign_one(LocalName("val"), build.chain({
1043-
base = "rawget",
1036+
{
1037+
"name"
1038+
}
1039+
},
1040+
body = {
1041+
build.assign_one(LocalName("val"), build.chain({
1042+
base = "rawget",
1043+
{
1044+
"call",
10441045
{
1045-
"call",
1046-
{
1047-
base_name,
1048-
"name"
1049-
}
1046+
base_name,
1047+
"name"
10501048
}
1051-
})),
1052-
class_lookup
1053-
}
1054-
})
1049+
}
1050+
})),
1051+
class_lookup
1052+
}
1053+
})
1054+
else
1055+
class_index = base_name
1056+
end
1057+
local cls_mt = build.table({
1058+
{
1059+
"__index",
1060+
class_index
10551061
},
10561062
{
10571063
"__call",
@@ -1174,33 +1180,28 @@ Statement = Transformer({
11741180
"declare_glob",
11751181
"*"
11761182
},
1177-
build.assign_one(parent_cls_name, parent_val == "" and "nil" or parent_val),
1183+
parent_val and build.assign_one(parent_cls_name, parent_val) or NOOP,
11781184
build.assign_one(base_name, {
11791185
"table",
11801186
properties
11811187
}),
11821188
build.assign_one(base_name:chain("__index"), base_name),
1183-
build["if"]({
1184-
cond = parent_cls_name,
1185-
["then"] = {
1186-
build.chain({
1187-
base = "setmetatable",
1188-
{
1189-
"call",
1189+
parent_val and build.chain({
1190+
base = "setmetatable",
1191+
{
1192+
"call",
1193+
{
1194+
base_name,
1195+
build.chain({
1196+
base = parent_cls_name,
11901197
{
1191-
base_name,
1192-
build.chain({
1193-
base = parent_cls_name,
1194-
{
1195-
"dot",
1196-
"__base"
1197-
}
1198-
})
1198+
"dot",
1199+
"__base"
11991200
}
1200-
}
1201-
})
1201+
})
1202+
}
12021203
}
1203-
}),
1204+
}) or NOOP,
12041205
build.assign_one(cls_name, cls),
12051206
build.assign_one(base_name:chain("__class"), cls_name),
12061207
build.group((function()
@@ -1211,11 +1212,9 @@ Statement = Transformer({
12111212
}
12121213
end
12131214
end)()),
1214-
build["if"]({
1215+
parent_val and build["if"]({
12151216
cond = {
12161217
"exp",
1217-
parent_cls_name,
1218-
"and",
12191218
parent_cls_name:chain("__inherited")
12201219
},
12211220
["then"] = {
@@ -1227,7 +1226,7 @@ Statement = Transformer({
12271226
}
12281227
})
12291228
}
1230-
}),
1229+
}) or NOOP,
12311230
build.group((function()
12321231
if name then
12331232
return {

moonscript/transform.moon

Lines changed: 37 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -502,6 +502,7 @@ Statement = Transformer {
502502

503503
class: (node, ret, parent_assign) =>
504504
_, name, parent_val, body = unpack node
505+
parent_val = nil if parent_val == ""
505506

506507
-- split apart properties and statements
507508
statements = {}
@@ -533,18 +534,16 @@ Statement = Transformer {
533534
cls_name = NameProxy "class"
534535

535536
unless constructor
536-
constructor = build.fndef {
537-
args: {{"..."}}
538-
arrow: "fat"
539-
body: {
540-
build["if"] {
541-
cond: parent_cls_name
542-
then: {
543-
build.chain { base: "super", {"call", {"..."}} }
544-
}
537+
constructor = if parent_val
538+
build.fndef {
539+
args: {{"..."}}
540+
arrow: "fat"
541+
body: {
542+
build.chain { base: "super", {"call", {"..."}} }
545543
}
546544
}
547-
}
545+
else
546+
build.fndef!
548547

549548
real_name = name or parent_assign and parent_assign[2][1]
550549
real_name = switch ntype real_name
@@ -566,28 +565,33 @@ Statement = Transformer {
566565
{"__init", constructor}
567566
{"__base", base_name}
568567
{"__name", real_name} -- "quote the string"
569-
{"__parent", parent_cls_name}
568+
parent_val and {"__parent", parent_cls_name} or nil
570569
}
571570

572-
-- look up a name in the class object
573-
class_lookup = build["if"] {
574-
cond: {"exp", "val", "==", "nil", "and", parent_cls_name}
575-
then: {
576-
parent_cls_name\index"name"
571+
-- looking up a name in the class object
572+
class_index = if parent_val
573+
class_lookup = build["if"] {
574+
cond: { "exp", "val", "==", "nil" }
575+
then: {
576+
parent_cls_name\index"name"
577+
}
577578
}
578-
}
579-
insert class_lookup, {"else", {"val"}}
579+
insert class_lookup, {"else", {"val"}}
580580

581-
cls_mt = build.table {
582-
{"__index", build.fndef {
581+
build.fndef {
583582
args: {{"cls"}, {"name"}}
584583
body: {
585584
build.assign_one LocalName"val", build.chain {
586585
base: "rawget", {"call", {base_name, "name"}}
587586
}
588587
class_lookup
589588
}
590-
}}
589+
}
590+
else
591+
base_name
592+
593+
cls_mt = build.table {
594+
{"__index", class_index}
591595
{"__call", build.fndef {
592596
args: {{"cls"}, {"..."}}
593597
body: {
@@ -651,22 +655,18 @@ Statement = Transformer {
651655

652656
{"declare_glob", "*"}
653657

654-
.assign_one parent_cls_name, parent_val == "" and "nil" or parent_val
658+
parent_val and .assign_one(parent_cls_name, parent_val) or NOOP
659+
655660
.assign_one base_name, {"table", properties}
656661
.assign_one base_name\chain"__index", base_name
657662

658-
.if {
659-
cond: parent_cls_name
660-
then: {
661-
.chain {
662-
base: "setmetatable"
663-
{"call", {
664-
base_name,
665-
.chain { base: parent_cls_name, {"dot", "__base"}}
666-
}}
667-
}
668-
}
669-
}
663+
parent_val and .chain({
664+
base: "setmetatable"
665+
{"call", {
666+
base_name,
667+
.chain { base: parent_cls_name, {"dot", "__base"}}
668+
}}
669+
}) or NOOP
670670

671671
.assign_one cls_name, cls
672672
.assign_one base_name\chain"__class", cls_name
@@ -677,16 +677,14 @@ Statement = Transformer {
677677
}
678678

679679
-- run the inherited callback
680-
.if {
681-
cond: {"exp",
682-
parent_cls_name, "and", parent_cls_name\chain "__inherited"
683-
}
680+
parent_val and .if({
681+
cond: {"exp", parent_cls_name\chain "__inherited" }
684682
then: {
685683
parent_cls_name\chain "__inherited", {"call", {
686684
parent_cls_name, cls_name
687685
}}
688686
}
689-
}
687+
}) or NOOP
690688

691689
.group if name then {
692690
.assign_one name, cls_name

0 commit comments

Comments
 (0)