Make preparsing data reusable.
authorlrn@chromium.org <lrn@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Fri, 17 Sep 2010 12:55:27 +0000 (12:55 +0000)
committerlrn@chromium.org <lrn@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Fri, 17 Sep 2010 12:55:27 +0000 (12:55 +0000)
Fix bug in writing symbol ids over 128.

Review URL: http://codereview.chromium.org/3416010

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@5485 ce2b1a6d-e550-0410-aec6-3dcde31c8c00

src/parser.cc
src/parser.h

index 856c474..1edcb1d 100644 (file)
@@ -1001,7 +1001,7 @@ class CompleteParserRecorder: public PartialParserRecorder {
       Vector<Vector<const char> > symbol = symbol_entries_.AddBlock(1, literal);
       entry->key = &symbol[0];
     }
-    symbol_store_.Add(id - 1);
+    WriteNumber(id - 1);
   }
 
   virtual Vector<unsigned> ExtractData() {
@@ -1503,6 +1503,7 @@ FunctionLiteral* Parser::ParseProgram(Handle<String> source,
   source->TryFlatten();
   scanner_.Initialize(source, JAVASCRIPT);
   ASSERT(target_stack_ == NULL);
+  if (pre_data_ != NULL) pre_data_->Initialize();
 
   // Compute the parsing mode.
   mode_ = FLAG_lazy ? PARSE_LAZILY : PARSE_EAGERLY;
@@ -5492,7 +5493,9 @@ ScriptDataImpl* PartialPreParse(Handle<String> source,
 
 
 void ScriptDataImpl::Initialize() {
+  // Prepares state for use.
   if (store_.length() >= kHeaderSize) {
+    function_index_ = kHeaderSize;
     int symbol_data_offset = kHeaderSize + store_[kFunctionsSizeOffset];
     if (store_.length() > symbol_data_offset) {
       symbol_data_ = reinterpret_cast<byte*>(&store_[symbol_data_offset]);
index 8bab92d..8c00857 100644 (file)
@@ -101,10 +101,7 @@ class ScriptDataImpl : public ScriptData {
  public:
   explicit ScriptDataImpl(Vector<unsigned> store)
       : store_(store),
-        function_index_(kHeaderSize),
-        owns_store_(true) {
-    Initialize();
-  }
+        owns_store_(true) { }
 
   // Create an empty ScriptDataImpl that is guaranteed to not satisfy
   // a SanityCheck.
@@ -190,10 +187,8 @@ class ScriptDataImpl : public ScriptData {
   ScriptDataImpl(const char* backing_store, int length)
       : store_(reinterpret_cast<unsigned*>(const_cast<char*>(backing_store)),
                length / sizeof(unsigned)),
-        function_index_(kHeaderSize),
         owns_store_(false) {
     ASSERT_EQ(0, reinterpret_cast<intptr_t>(backing_store) % sizeof(unsigned));
-    Initialize();
   }
 
   // Read strings written by ParserRecorder::WriteString.