MCPcopy Create free account
hub / github.com/Singular/Singular / EmitDecl

Function EmitDecl

ppcc/src/parser.cc:229–285  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

227}
228
229void EmitDecl(Parser *parser, Str *storage_class,
230 Int type_start, Int type_end,
231 Int var_start, Int var_end,
232 Int init_start, Int init_end, Int var_pos,
233 bool is_class, bool is_toplevel, DeclType decl_type) {
234 bool is_static = (decl_type == StaticDecl);
235 bool is_extern = (decl_type == ExternDecl);
236 parser->emit(Token(SymGen, storage_class));
237 parser->emit(space);
238 parser->emit_range(type_start, type_end);
239 parser->emit(space);
240 if (is_class)
241 parser->emit(asterisk);
242 Str *var_name = parser->token(var_pos).str;
243 parser->emit_range(var_start, var_pos);
244 parser->emit(Token(SymGen, var_name));
245 parser->emit_range(var_pos+1, var_end);
246 if (is_static && !is_class && IsLiteral(parser, init_start+1, init_end)) {
247 parser->emit(space);
248 parser->emit_range(init_start, init_end);
249 parser->emit(semicolon);
250 return;
251 }
252 parser->emit(semicolon);
253 if (is_class) {
254 class_vars->add(var_name, S("(*")->add(var_name)->add(")"));
255 class_types->add(var_name, parser->token(type_start).str);
256 }
257 if ((is_class && !is_extern) || init_start >= 0) {
258 if (is_toplevel) {
259 init_list->add(var_name);
260 }
261 Token var_init = Token(SymGen, var_name->clone()->add("__INIT__"));
262 parser->emit(static_token);
263 parser->emit(space);
264 parser->emit_range(type_start, type_end);
265 parser->emit(space);
266 parser->emit_range(var_start, var_pos);
267 parser->emit(var_init);
268 parser->emit_range(var_pos+1, var_end);
269 if (init_start >= 0) {
270 parser->emit(space);
271 parser->emit_range(init_start, init_end);
272 }
273 parser->emit(semicolon);
274 if (!is_toplevel && !parser->c_source()) {
275 parser->init_count++;
276 parser->emit(Token(SymGen, S(
277 "class %s__CONSTR__ {\n"
278 " public: %s__CONSTR__() {\n"
279 " pSingular_register_init_var((void *)&%s, (void *)&%s__INIT__, sizeof(%s));\n"
280 " }\n"
281 "} %s__AUX__;\n"
282 )->replace_all(S("%s"), var_name)));
283 }
284 }
285}
286

Callers 1

TransformVarDeclFunction · 0.85

Calls 9

TokenClass · 0.85
IsLiteralFunction · 0.85
emitMethod · 0.80
emit_rangeMethod · 0.80
c_sourceMethod · 0.80
replace_allMethod · 0.80
SFunction · 0.50
addMethod · 0.45
cloneMethod · 0.45

Tested by

no test coverage detected