jitcraft/Parser.cpp
changeset 54 8e22792a3921
parent 48 2b6904506469
child 55 e073a9fe8e57
     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);