Skip to content

Commit 1ed4a7e

Browse files
committed
move generated node ctors to header-only
1 parent 8953b6c commit 1ed4a7e

File tree

5 files changed

+55
-59
lines changed

5 files changed

+55
-59
lines changed

src/shady/api/generator_grammar.c

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,50 @@ static void generate_header_getters_for_class(Growy* g, json_object* src, json_o
132132
}
133133
}
134134

135+
void generate_node_ctor(Growy* g, json_object* nodes) {
136+
for (size_t i = 0; i < json_object_array_length(nodes); i++) {
137+
json_object* node = json_object_array_get_idx(nodes, i);
138+
139+
String name = json_object_get_string(json_object_object_get(node, "name"));
140+
assert(name);
141+
142+
if (has_custom_ctor(node))
143+
continue;
144+
145+
if (i > 0)
146+
shd_growy_append_formatted(g, "\n");
147+
148+
String snake_name = json_object_get_string(json_object_object_get(node, "snake_name"));
149+
const void* alloc = NULL;
150+
if (!snake_name) {
151+
alloc = snake_name = to_snake_case(name);
152+
}
153+
154+
json_object* ops = json_object_object_get(node, "ops");
155+
if (ops)
156+
shd_growy_append_formatted(g, "static inline const Node* %s(IrArena* arena, %s payload)", snake_name, name);
157+
else
158+
shd_growy_append_formatted(g, "static inline const Node* %s(IrArena* arena)", snake_name);
159+
160+
shd_growy_append_formatted(g, " {\n");
161+
shd_growy_append_formatted(g, "\tNode node;\n");
162+
shd_growy_append_formatted(g, "\tmemset((void*) &node, 0, sizeof(Node));\n");
163+
shd_growy_append_formatted(g, "\tnode = (Node) {\n");
164+
shd_growy_append_formatted(g, "\t\t.arena = arena,\n");
165+
shd_growy_append_formatted(g, "\t\t.tag = %s_TAG,\n", name);
166+
if (ops)
167+
shd_growy_append_formatted(g, "\t\t.payload.%s = payload,\n", snake_name);
168+
shd_growy_append_formatted(g, "\t\t.type = NULL,\n");
169+
shd_growy_append_formatted(g, "\t};\n");
170+
shd_growy_append_formatted(g, "\treturn _shd_create_node_helper(arena, node, NULL);\n");
171+
shd_growy_append_formatted(g, "}\n");
172+
173+
if (alloc)
174+
free((void*) alloc);
175+
}
176+
shd_growy_append_formatted(g, "\n");
177+
}
178+
135179
void generate(Growy* g, json_object* src) {
136180
generate_header(g, src);
137181

@@ -145,7 +189,10 @@ void generate(Growy* g, json_object* src) {
145189
shd_growy_append_formatted(g, "NodeClass get_node_class_from_tag(NodeTag tag);\n\n");
146190
generate_node_payloads(g, src, nodes);
147191
generate_node_type(g, nodes);
148-
generate_node_ctor(g, nodes, false);
192+
193+
shd_growy_append_formatted(g, "#include <string.h>\n");
194+
shd_growy_append_formatted(g, "Node* _shd_create_node_helper(IrArena* arena, Node node, bool* pfresh);\n");
195+
generate_node_ctor(g, nodes);
149196

150197
for (size_t i = 0; i < json_object_array_length(node_classes); i++) {
151198
json_object* node_class = json_object_array_get_idx(node_classes, i);

src/shady/constructors.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ const Node* fold_node_operand(NodeTag tag, NodeClass, String, const Node* op);
1919

2020
const Type* check_type_generated(IrArena* a, const Node* node);
2121

22-
static Node* create_node_helper(IrArena* arena, Node node, bool* pfresh) {
22+
Node* _shd_create_node_helper(IrArena* arena, Node node, bool* pfresh) {
2323
pre_construction_validation(arena, &node);
2424
if (arena->config.check_types)
2525
node.type = check_type_generated(arena, &node);
@@ -74,7 +74,7 @@ Node* param(IrArena* arena, const Type* type, const char* name) {
7474
.tag = Param_TAG,
7575
.payload.param = param
7676
};
77-
return create_node_helper(arena, node, NULL);
77+
return _shd_create_node_helper(arena, node, NULL);
7878
}
7979

8080
const Node* composite_helper(IrArena* a, const Type* t, Nodes contents) {
@@ -123,7 +123,7 @@ Node* function(Module* mod, Nodes params, const char* name, Nodes annotations, N
123123
.tag = Function_TAG,
124124
.payload.fun = payload
125125
};
126-
Node* fn = create_node_helper(arena, node, NULL);
126+
Node* fn = _shd_create_node_helper(arena, node, NULL);
127127
register_decl_module(mod, fn);
128128

129129
for (size_t i = 0; i < params.count; i++) {
@@ -152,7 +152,7 @@ Node* basic_block(IrArena* arena, Nodes params, const char* name) {
152152
.payload.basic_block = payload
153153
};
154154

155-
Node* bb = create_node_helper(arena, node, NULL);
155+
Node* bb = _shd_create_node_helper(arena, node, NULL);
156156

157157
for (size_t i = 0; i < params.count; i++) {
158158
Node* param = (Node*) params.nodes[i];
@@ -180,7 +180,7 @@ Node* constant(Module* mod, Nodes annotations, const Type* hint, String name) {
180180
.tag = Constant_TAG,
181181
.payload.constant = cnst
182182
};
183-
Node* decl = create_node_helper(arena, node, NULL);
183+
Node* decl = _shd_create_node_helper(arena, node, NULL);
184184
register_decl_module(mod, decl);
185185
return decl;
186186
}
@@ -211,7 +211,7 @@ Node* global_var(Module* mod, Nodes annotations, const Type* type, const char* n
211211
.tag = GlobalVariable_TAG,
212212
.payload.global_variable = gvar
213213
};
214-
Node* decl = create_node_helper(arena, node, NULL);
214+
Node* decl = _shd_create_node_helper(arena, node, NULL);
215215
register_decl_module(mod, decl);
216216
return decl;
217217
}
@@ -233,7 +233,7 @@ Type* nominal_type(Module* mod, Nodes annotations, String name) {
233233
.tag = NominalType_TAG,
234234
.payload.nom_type = payload
235235
};
236-
Node* decl = create_node_helper(arena, node, NULL);
236+
Node* decl = _shd_create_node_helper(arena, node, NULL);
237237
register_decl_module(mod, decl);
238238
return decl;
239239
}

src/shady/generator/generator.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ String capitalize(String str);
2222
bool starts_with_vowel(String str);
2323

2424
bool has_custom_ctor(json_object* node);
25-
void generate_node_ctor(Growy* g, json_object* nodes, bool definition);
2625

2726
json_object* lookup_node_class(json_object* src, String name);
2827
String class_to_type(json_object* src, String class, bool list);

src/shady/generator/generator_common.c

Lines changed: 0 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -5,55 +5,6 @@ bool has_custom_ctor(json_object* node) {
55
return (constructor && strcmp(constructor, "custom") == 0);
66
}
77

8-
void generate_node_ctor(Growy* g, json_object* nodes, bool definition) {
9-
for (size_t i = 0; i < json_object_array_length(nodes); i++) {
10-
json_object* node = json_object_array_get_idx(nodes, i);
11-
12-
String name = json_object_get_string(json_object_object_get(node, "name"));
13-
assert(name);
14-
15-
if (has_custom_ctor(node))
16-
continue;
17-
18-
if (definition && i > 0)
19-
shd_growy_append_formatted(g, "\n");
20-
21-
String snake_name = json_object_get_string(json_object_object_get(node, "snake_name"));
22-
const void* alloc = NULL;
23-
if (!snake_name) {
24-
alloc = snake_name = to_snake_case(name);
25-
}
26-
27-
String ap = definition ? " arena" : "";
28-
json_object* ops = json_object_object_get(node, "ops");
29-
if (ops)
30-
shd_growy_append_formatted(g, "const Node* %s(IrArena*%s, %s%s)", snake_name, ap, name, definition ? " payload" : "");
31-
else
32-
shd_growy_append_formatted(g, "const Node* %s(IrArena*%s)", snake_name, ap);
33-
34-
if (definition) {
35-
shd_growy_append_formatted(g, " {\n");
36-
shd_growy_append_formatted(g, "\tNode node;\n");
37-
shd_growy_append_formatted(g, "\tmemset((void*) &node, 0, sizeof(Node));\n");
38-
shd_growy_append_formatted(g, "\tnode = (Node) {\n");
39-
shd_growy_append_formatted(g, "\t\t.arena = arena,\n");
40-
shd_growy_append_formatted(g, "\t\t.tag = %s_TAG,\n", name);
41-
if (ops)
42-
shd_growy_append_formatted(g, "\t\t.payload.%s = payload,\n", snake_name);
43-
shd_growy_append_formatted(g, "\t\t.type = NULL,\n");
44-
shd_growy_append_formatted(g, "\t};\n");
45-
shd_growy_append_formatted(g, "\treturn create_node_helper(arena, node, NULL);\n");
46-
shd_growy_append_formatted(g, "}\n");
47-
} else {
48-
shd_growy_append_formatted(g, ";\n");
49-
}
50-
51-
if (alloc)
52-
free((void*) alloc);
53-
}
54-
shd_growy_append_formatted(g, "\n");
55-
}
56-
578
json_object* lookup_node_class(json_object* src, String name) {
589
json_object* node_classes = json_object_object_get(src, "node-classes");
5910
for (size_t i = 0; i < json_object_array_length(node_classes); i++) {

src/shady/generator_constructors.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,5 @@ void generate(Growy* g, json_object* src) {
8080
generate_header(g, src);
8181

8282
json_object* nodes = json_object_object_get(src, "nodes");
83-
generate_node_ctor(g, nodes, true);
8483
generate_pre_construction_validation(g, src);
8584
}

0 commit comments

Comments
 (0)