Changeset ef0a94 in git for ppcc/src/parser.cc


Ignore:
Timestamp:
Feb 13, 2019, 5:39:27 PM (5 years ago)
Author:
Reimer Behrends <behrends@…>
Branches:
(u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
Children:
e26df3f314b9946ffef7f945cbe5c66517600b92
Parents:
d669f7b103e531e130535f2141dd1d77cfa31a81
Message:
Final ppcc fixes (part 2).
File:
1 edited

Legend:

Unmodified
Added
Removed
  • ppcc/src/parser.cc

    rd669f7 ref0a94  
    5656class Parser : public GC {
    5757public:
    58   TokenList *input, *output;
     58  TokenList *input, *output, *prologue;
    5959  SourceFile *source;
    6060  Int pos, marker;
     
    6666      input->add(eof);
    6767    output = new TokenList();
     68    prologue = new TokenList();
    6869    pos = 0;
    6970    marker = 0;
     
    274275      parser->init_count++;
    275276      parser->emit(Token(SymGen, S(
    276         "void pSingular_register_init_var(void *, void *, long);"
    277277        "class %s__CONSTR__ {\n"
    278278        "  public: %s__CONSTR__() {\n"
    279         "    pSingular_register_init_var(&%s, &%s__INIT__, sizeof(%s));\n"
     279        "    pSingular_register_init_var((void *)&%s, (void *)&%s__INIT__, sizeof(%s));\n"
    280280        "  }\n"
    281281        "} %s__AUX__;\n"
     
    286286
    287287void EmitEpilogue(Parser *parser) {
    288   if (init_list->len() == 0 && class_vars->count() == 0)
     288  if (parser->init_count == 0 && init_list->len() == 0 && class_vars->count() == 0)
    289289    return;
    290290  Str *modulename = parser->source->modulename;
     
    300300    }
    301301  }
    302   if (init_list->len() == 0)
     302  if (parser->init_count == 0 && init_list->len() == 0)
    303303    return;
    304304  Str *init_part;
     
    350350  }
    351351  init_part->add("}\n");
     352  if (parser->init_count) {
     353    parser->prologue->add(Token(SymGen,
     354      S("static void pSingular_register_init_var(void *, void *, long);\n")));
     355  }
    352356  init_part = init_part->replace_all(S("%n"), S(parser->init_count+1));
    353357  parser->emit(Token(SymGen, init_part));
     
    512516  }
    513517  EmitEpilogue(parser);
    514   return parser->output;
     518  return parser->prologue->clone()->add(parser->output);
    515519}
    516520
     
    531535  SourceFile *source = ReadSource(filename, filedata);
    532536  TokenList *tokens = Transform(source);
    533   Str *result = new Str();  for (Int i = 0; i < tokens->len(); i++) {
     537  Str *result = new Str();
     538  for (Int i = 0; i < tokens->len(); i++) {
    534539    result->add(tokens->at(i).str);
    535540  }
Note: See TracChangeset for help on using the changeset viewer.