diff -r 13bd3a8df334 -r 8e22792a3921 jitcraft/Parser.cpp --- a/jitcraft/Parser.cpp Sat Jul 07 17:11:31 2012 -0700 +++ b/jitcraft/Parser.cpp Sat Jul 07 20:28:29 2012 -0700 @@ -20,14 +20,15 @@ #include "Parser.h" #include "FixedArray.h" #include "Heap.h" +#include "Strings.h" #include "Heap-inl.h" using namespace jc; -Parser::Parser(CompileContext &cc, const char *stream, size_t length) - : cc_(cc), - pool_(ZONE()->pool()), - strings_(pool_), +Parser::Parser(Zone *zone, CompileContext &cc, const char *stream, size_t length) + : zone_(zone), + cc_(cc), + pool_(zone_->pool()), scanner_(cc, stream, length), scope_(NULL), unbound_(NULL) @@ -64,7 +65,7 @@ } NameProxy * -Parser::bind(Name *name) +Parser::bind(Handle name) { BoundName *bound = scope_->lookup(name); NameProxy *proxy = new (pool_) NameProxy(scanner_.begin(), name, bound); @@ -74,22 +75,22 @@ } bool -Parser::matchName(Name **name, TokenKind kind) +Parser::matchName(String **name, TokenKind kind) { assert(kind == TOK_NAME || kind == TOK_LABEL); *name = NULL; if (!match(kind)) return false; - *name = strings_.add(scanner_.literal()); + *name = zone_->makeSymbol(scanner_.literal(), scanner_.literal_length()); return true; } -Name * +String * Parser::expectName() { if (!expect(TOK_NAME)) return NULL; - return strings_.add(scanner_.literal()); + return zone_->makeSymbol(scanner_.literal(), scanner_.literal_length()); } void @@ -105,8 +106,9 @@ switch (kind) { case TOK_NAME: { - scanner_.scan(); - Name *name = strings_.add(scanner_.literal()); + Local name(zone_, expectName()); + if (!name) + return NULL; return bind(name); } @@ -127,10 +129,10 @@ case TOK_STRING_LITERAL: { scanner_.scan(); - Local array(ZONE(), ByteArray::New(ZONE(), scanner_.literal_length())); + Local array(zone_, ByteArray::New(zone_, scanner_.literal_length() + 1)); if (!array) return NULL; - memcpy(array->raw(), scanner_.literal(), scanner_.literal_length()); + memcpy(array->raw(), scanner_.literal(), scanner_.literal_length() + 1); return new (pool_) StringLiteral(scanner_.begin(), array); } @@ -562,11 +564,11 @@ if (!expect(TOK_NEW)) return NULL; - Name *tag; - if (matchName(&tag, TOK_LABEL) && !tag) + Local tag(zone_); + if (matchName(tag.ref(), TOK_LABEL) && !tag) return NULL; - Name *name = expectName(); + Local name(zone_, expectName()); if (!name) return NULL; @@ -785,9 +787,9 @@ SourcePosition pos = scanner_.begin(); - Name *name = NULL; - if (match(TOK_NAME)) { - if ((name = strings_.add(scanner_.literal())) == NULL) + Local name(zone_); + if (matchName(name.ref())) { + if (!name) return NULL; if (BoundName *other = scope_->localLookup(name)) { @@ -808,7 +810,7 @@ if (scanner_.peek() == TOK_RBRACE) break; - Name *name = expectName(); + Local name(zone_, expectName()); if (!name) return NULL; @@ -838,7 +840,7 @@ Statement * Parser::function() { - Name *name = expectName(); + Local name(zone_, expectName()); if (!name) return NULL; @@ -867,7 +869,7 @@ while (true) { bool ref = match(TOK_AMPERSAND); - Name *name = expectName(); + Local name(zone_, expectName()); if (!name) return NULL; @@ -879,7 +881,8 @@ if (!arg) return NULL; - Parameter *parameter = new (pool_) Parameter(arg, NULL, ref); + Local tag(zone_); + Parameter *parameter = new (pool_) Parameter(arg, tag, ref); parameters->push_back(parameter); if (!match(TOK_COMMA)) @@ -966,7 +969,7 @@ void visit(NameProxy *name) { prefix(); - fprintf(fp_, "[ NameProxy (%s)%s\n", name->name(), + fprintf(fp_, "[ NameProxy (%s)%s\n", name->name()->chars(), (name->binding() ? "" : " unbound")); } void visit(CallExpression *node) { @@ -980,7 +983,7 @@ } void visit(FunctionStatement *node) { prefix(); - fprintf(fp_, "[ FunctionStatement (%s)\n", node->fun()->name()); + fprintf(fp_, "[ FunctionStatement (%s)\n", node->fun()->name()->chars()); indent(); node->body()->accept(this); unindent(); @@ -1038,7 +1041,7 @@ } void visit(VariableDeclaration *node) { prefix(); - fprintf(fp_, "[ VariableDeclaration (%s)\n", node->variable()->name()); + fprintf(fp_, "[ VariableDeclaration (%s)\n", node->variable()->name()->chars()); indent(); if (node->initialization()) node->initialization()->accept(this); @@ -1071,11 +1074,11 @@ } void visit(EnumStatement *node) { prefix(); - fprintf(fp_, "[ EnumStatement (%s)\n", node->name() ? node->name() : ""); + fprintf(fp_, "[ EnumStatement (%s)\n", node->name() ? node->name()->chars() : ""); indent(); for (size_t i = 0; i < node->entries()->size(); i++) { prefix(); - fprintf(fp_, "%s =\n", node->entries()->at(i).name->name()); + fprintf(fp_, "%s =\n", node->entries()->at(i).name->name()->chars()); if (node->entries()->at(i).expr) { indent(); node->entries()->at(i).expr->accept(this);