1.1 --- a/jitcraft/Parser.cpp Sat Jul 07 17:11:31 2012 -0700
1.2 +++ b/jitcraft/Parser.cpp Sat Jul 07 20:28:29 2012 -0700
1.3 @@ -20,14 +20,15 @@
1.4 #include "Parser.h"
1.5 #include "FixedArray.h"
1.6 #include "Heap.h"
1.7 +#include "Strings.h"
1.8 #include "Heap-inl.h"
1.9
1.10 using namespace jc;
1.11
1.12 -Parser::Parser(CompileContext &cc, const char *stream, size_t length)
1.13 - : cc_(cc),
1.14 - pool_(ZONE()->pool()),
1.15 - strings_(pool_),
1.16 +Parser::Parser(Zone *zone, CompileContext &cc, const char *stream, size_t length)
1.17 + : zone_(zone),
1.18 + cc_(cc),
1.19 + pool_(zone_->pool()),
1.20 scanner_(cc, stream, length),
1.21 scope_(NULL),
1.22 unbound_(NULL)
1.23 @@ -64,7 +65,7 @@
1.24 }
1.25
1.26 NameProxy *
1.27 -Parser::bind(Name *name)
1.28 +Parser::bind(Handle<String> name)
1.29 {
1.30 BoundName *bound = scope_->lookup(name);
1.31 NameProxy *proxy = new (pool_) NameProxy(scanner_.begin(), name, bound);
1.32 @@ -74,22 +75,22 @@
1.33 }
1.34
1.35 bool
1.36 -Parser::matchName(Name **name, TokenKind kind)
1.37 +Parser::matchName(String **name, TokenKind kind)
1.38 {
1.39 assert(kind == TOK_NAME || kind == TOK_LABEL);
1.40 *name = NULL;
1.41 if (!match(kind))
1.42 return false;
1.43 - *name = strings_.add(scanner_.literal());
1.44 + *name = zone_->makeSymbol(scanner_.literal(), scanner_.literal_length());
1.45 return true;
1.46 }
1.47
1.48 -Name *
1.49 +String *
1.50 Parser::expectName()
1.51 {
1.52 if (!expect(TOK_NAME))
1.53 return NULL;
1.54 - return strings_.add(scanner_.literal());
1.55 + return zone_->makeSymbol(scanner_.literal(), scanner_.literal_length());
1.56 }
1.57
1.58 void
1.59 @@ -105,8 +106,9 @@
1.60 switch (kind) {
1.61 case TOK_NAME:
1.62 {
1.63 - scanner_.scan();
1.64 - Name *name = strings_.add(scanner_.literal());
1.65 + Local<String> name(zone_, expectName());
1.66 + if (!name)
1.67 + return NULL;
1.68 return bind(name);
1.69 }
1.70
1.71 @@ -127,10 +129,10 @@
1.72 case TOK_STRING_LITERAL:
1.73 {
1.74 scanner_.scan();
1.75 - Local<ByteArray> array(ZONE(), ByteArray::New(ZONE(), scanner_.literal_length()));
1.76 + Local<ByteArray> array(zone_, ByteArray::New(zone_, scanner_.literal_length() + 1));
1.77 if (!array)
1.78 return NULL;
1.79 - memcpy(array->raw(), scanner_.literal(), scanner_.literal_length());
1.80 + memcpy(array->raw(), scanner_.literal(), scanner_.literal_length() + 1);
1.81 return new (pool_) StringLiteral(scanner_.begin(), array);
1.82 }
1.83
1.84 @@ -562,11 +564,11 @@
1.85 if (!expect(TOK_NEW))
1.86 return NULL;
1.87
1.88 - Name *tag;
1.89 - if (matchName(&tag, TOK_LABEL) && !tag)
1.90 + Local<String> tag(zone_);
1.91 + if (matchName(tag.ref(), TOK_LABEL) && !tag)
1.92 return NULL;
1.93
1.94 - Name *name = expectName();
1.95 + Local<String> name(zone_, expectName());
1.96 if (!name)
1.97 return NULL;
1.98
1.99 @@ -785,9 +787,9 @@
1.100
1.101 SourcePosition pos = scanner_.begin();
1.102
1.103 - Name *name = NULL;
1.104 - if (match(TOK_NAME)) {
1.105 - if ((name = strings_.add(scanner_.literal())) == NULL)
1.106 + Local<String> name(zone_);
1.107 + if (matchName(name.ref())) {
1.108 + if (!name)
1.109 return NULL;
1.110
1.111 if (BoundName *other = scope_->localLookup(name)) {
1.112 @@ -808,7 +810,7 @@
1.113 if (scanner_.peek() == TOK_RBRACE)
1.114 break;
1.115
1.116 - Name *name = expectName();
1.117 + Local<String> name(zone_, expectName());
1.118 if (!name)
1.119 return NULL;
1.120
1.121 @@ -838,7 +840,7 @@
1.122 Statement *
1.123 Parser::function()
1.124 {
1.125 - Name *name = expectName();
1.126 + Local<String> name(zone_, expectName());
1.127 if (!name)
1.128 return NULL;
1.129
1.130 @@ -867,7 +869,7 @@
1.131 while (true) {
1.132 bool ref = match(TOK_AMPERSAND);
1.133
1.134 - Name *name = expectName();
1.135 + Local<String> name(zone_, expectName());
1.136 if (!name)
1.137 return NULL;
1.138
1.139 @@ -879,7 +881,8 @@
1.140 if (!arg)
1.141 return NULL;
1.142
1.143 - Parameter *parameter = new (pool_) Parameter(arg, NULL, ref);
1.144 + Local<String> tag(zone_);
1.145 + Parameter *parameter = new (pool_) Parameter(arg, tag, ref);
1.146 parameters->push_back(parameter);
1.147
1.148 if (!match(TOK_COMMA))
1.149 @@ -966,7 +969,7 @@
1.150
1.151 void visit(NameProxy *name) {
1.152 prefix();
1.153 - fprintf(fp_, "[ NameProxy (%s)%s\n", name->name(),
1.154 + fprintf(fp_, "[ NameProxy (%s)%s\n", name->name()->chars(),
1.155 (name->binding() ? "" : " unbound"));
1.156 }
1.157 void visit(CallExpression *node) {
1.158 @@ -980,7 +983,7 @@
1.159 }
1.160 void visit(FunctionStatement *node) {
1.161 prefix();
1.162 - fprintf(fp_, "[ FunctionStatement (%s)\n", node->fun()->name());
1.163 + fprintf(fp_, "[ FunctionStatement (%s)\n", node->fun()->name()->chars());
1.164 indent();
1.165 node->body()->accept(this);
1.166 unindent();
1.167 @@ -1038,7 +1041,7 @@
1.168 }
1.169 void visit(VariableDeclaration *node) {
1.170 prefix();
1.171 - fprintf(fp_, "[ VariableDeclaration (%s)\n", node->variable()->name());
1.172 + fprintf(fp_, "[ VariableDeclaration (%s)\n", node->variable()->name()->chars());
1.173 indent();
1.174 if (node->initialization())
1.175 node->initialization()->accept(this);
1.176 @@ -1071,11 +1074,11 @@
1.177 }
1.178 void visit(EnumStatement *node) {
1.179 prefix();
1.180 - fprintf(fp_, "[ EnumStatement (%s)\n", node->name() ? node->name() : "<anonymous>");
1.181 + fprintf(fp_, "[ EnumStatement (%s)\n", node->name() ? node->name()->chars() : "<anonymous>");
1.182 indent();
1.183 for (size_t i = 0; i < node->entries()->size(); i++) {
1.184 prefix();
1.185 - fprintf(fp_, "%s =\n", node->entries()->at(i).name->name());
1.186 + fprintf(fp_, "%s =\n", node->entries()->at(i).name->name()->chars());
1.187 if (node->entries()->at(i).expr) {
1.188 indent();
1.189 node->entries()->at(i).expr->accept(this);