| 227 | } |
| 228 | |
| 229 | void 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 |
no test coverage detected