diff options
Diffstat (limited to 'chromium/v8/src/preparse-data.cc')
-rw-r--r-- | chromium/v8/src/preparse-data.cc | 152 |
1 files changed, 23 insertions, 129 deletions
diff --git a/chromium/v8/src/preparse-data.cc b/chromium/v8/src/preparse-data.cc index 8e088482850..5860e4144ec 100644 --- a/chromium/v8/src/preparse-data.cc +++ b/chromium/v8/src/preparse-data.cc @@ -1,68 +1,41 @@ // Copyright 2010 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. -#include "../include/v8stdint.h" +#include "include/v8stdint.h" -#include "preparse-data-format.h" -#include "preparse-data.h" +#include "src/preparse-data-format.h" +#include "src/preparse-data.h" -#include "checks.h" -#include "globals.h" -#include "hashmap.h" +#include "src/checks.h" +#include "src/globals.h" +#include "src/hashmap.h" namespace v8 { namespace internal { -// ---------------------------------------------------------------------------- -// FunctionLoggingParserRecorder -FunctionLoggingParserRecorder::FunctionLoggingParserRecorder() - : function_store_(0), - is_recording_(true), - pause_count_(0) { +CompleteParserRecorder::CompleteParserRecorder() + : function_store_(0) { preamble_[PreparseDataConstants::kMagicOffset] = PreparseDataConstants::kMagicNumber; preamble_[PreparseDataConstants::kVersionOffset] = PreparseDataConstants::kCurrentVersion; preamble_[PreparseDataConstants::kHasErrorOffset] = false; preamble_[PreparseDataConstants::kFunctionsSizeOffset] = 0; - preamble_[PreparseDataConstants::kSymbolCountOffset] = 0; preamble_[PreparseDataConstants::kSizeOffset] = 0; - ASSERT_EQ(6, PreparseDataConstants::kHeaderSize); + ASSERT_EQ(5, PreparseDataConstants::kHeaderSize); #ifdef DEBUG prev_start_ = -1; #endif } -void FunctionLoggingParserRecorder::LogMessage(int start_pos, - int end_pos, - const char* message, - const char* arg_opt) { +void CompleteParserRecorder::LogMessage(int start_pos, + int end_pos, + const char* message, + const char* arg_opt, + bool is_reference_error) { if (has_error()) return; preamble_[PreparseDataConstants::kHasErrorOffset] = true; function_store_.Reset(); @@ -72,14 +45,15 @@ void FunctionLoggingParserRecorder::LogMessage(int start_pos, function_store_.Add(end_pos); STATIC_ASSERT(PreparseDataConstants::kMessageArgCountPos == 2); function_store_.Add((arg_opt == NULL) ? 0 : 1); - STATIC_ASSERT(PreparseDataConstants::kMessageTextPos == 3); + STATIC_ASSERT(PreparseDataConstants::kIsReferenceErrorPos == 3); + function_store_.Add(is_reference_error ? 1 : 0); + STATIC_ASSERT(PreparseDataConstants::kMessageTextPos == 4); WriteString(CStrVector(message)); if (arg_opt != NULL) WriteString(CStrVector(arg_opt)); - is_recording_ = false; } -void FunctionLoggingParserRecorder::WriteString(Vector<const char> str) { +void CompleteParserRecorder::WriteString(Vector<const char> str) { function_store_.Add(str.length()); for (int i = 0; i < str.length(); i++) { function_store_.Add(str[i]); @@ -87,98 +61,18 @@ void FunctionLoggingParserRecorder::WriteString(Vector<const char> str) { } -// ---------------------------------------------------------------------------- -// PartialParserRecorder - Record both function entries and symbols. - -Vector<unsigned> PartialParserRecorder::ExtractData() { - int function_size = function_store_.size(); - int total_size = PreparseDataConstants::kHeaderSize + function_size; - Vector<unsigned> data = Vector<unsigned>::New(total_size); - preamble_[PreparseDataConstants::kFunctionsSizeOffset] = function_size; - preamble_[PreparseDataConstants::kSymbolCountOffset] = 0; - OS::MemCopy(data.start(), preamble_, sizeof(preamble_)); - int symbol_start = PreparseDataConstants::kHeaderSize + function_size; - if (function_size > 0) { - function_store_.WriteTo(data.SubVector(PreparseDataConstants::kHeaderSize, - symbol_start)); - } - return data; -} - - -// ---------------------------------------------------------------------------- -// CompleteParserRecorder - Record both function entries and symbols. - -CompleteParserRecorder::CompleteParserRecorder() - : FunctionLoggingParserRecorder(), - literal_chars_(0), - symbol_store_(0), - symbol_keys_(0), - string_table_(vector_compare), - symbol_id_(0) { -} - - -void CompleteParserRecorder::LogSymbol(int start, - int hash, - bool is_ascii, - Vector<const byte> literal_bytes) { - Key key = { is_ascii, literal_bytes }; - HashMap::Entry* entry = string_table_.Lookup(&key, hash, true); - int id = static_cast<int>(reinterpret_cast<intptr_t>(entry->value)); - if (id == 0) { - // Copy literal contents for later comparison. - key.literal_bytes = - Vector<const byte>::cast(literal_chars_.AddBlock(literal_bytes)); - // Put (symbol_id_ + 1) into entry and increment it. - id = ++symbol_id_; - entry->value = reinterpret_cast<void*>(id); - Vector<Key> symbol = symbol_keys_.AddBlock(1, key); - entry->key = &symbol[0]; - } - WriteNumber(id - 1); -} - - Vector<unsigned> CompleteParserRecorder::ExtractData() { int function_size = function_store_.size(); - // Add terminator to symbols, then pad to unsigned size. - int symbol_size = symbol_store_.size(); - int padding = sizeof(unsigned) - (symbol_size % sizeof(unsigned)); - symbol_store_.AddBlock(padding, PreparseDataConstants::kNumberTerminator); - symbol_size += padding; - int total_size = PreparseDataConstants::kHeaderSize + function_size - + (symbol_size / sizeof(unsigned)); + int total_size = PreparseDataConstants::kHeaderSize + function_size; Vector<unsigned> data = Vector<unsigned>::New(total_size); preamble_[PreparseDataConstants::kFunctionsSizeOffset] = function_size; - preamble_[PreparseDataConstants::kSymbolCountOffset] = symbol_id_; - OS::MemCopy(data.start(), preamble_, sizeof(preamble_)); - int symbol_start = PreparseDataConstants::kHeaderSize + function_size; + MemCopy(data.start(), preamble_, sizeof(preamble_)); if (function_size > 0) { function_store_.WriteTo(data.SubVector(PreparseDataConstants::kHeaderSize, - symbol_start)); - } - if (!has_error()) { - symbol_store_.WriteTo( - Vector<byte>::cast(data.SubVector(symbol_start, total_size))); + total_size)); } return data; } -void CompleteParserRecorder::WriteNumber(int number) { - ASSERT(number >= 0); - - int mask = (1 << 28) - 1; - for (int i = 28; i > 0; i -= 7) { - if (number > mask) { - symbol_store_.Add(static_cast<byte>(number >> i) | 0x80u); - number &= mask; - } - mask >>= 7; - } - symbol_store_.Add(static_cast<byte>(number)); -} - - } } // namespace v8::internal. |