18a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Copyright 2010 the V8 project authors. All rights reserved. 2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file. 48a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/base/logging.h" 6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/globals.h" 7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/hashmap.h" 8014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/parsing/parser.h" 9014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/parsing/preparse-data.h" 10014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/parsing/preparse-data-format.h" 1144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 128a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangnamespace v8 { 138a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangnamespace internal { 148a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 158a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 16014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochCompleteParserRecorder::CompleteParserRecorder() { 178a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang preamble_[PreparseDataConstants::kMagicOffset] = 188a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang PreparseDataConstants::kMagicNumber; 198a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang preamble_[PreparseDataConstants::kVersionOffset] = 208a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang PreparseDataConstants::kCurrentVersion; 218a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang preamble_[PreparseDataConstants::kHasErrorOffset] = false; 228a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang preamble_[PreparseDataConstants::kFunctionsSizeOffset] = 0; 238a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang preamble_[PreparseDataConstants::kSizeOffset] = 0; 24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK_EQ(5, PreparseDataConstants::kHeaderSize); 258a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#ifdef DEBUG 268a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang prev_start_ = -1; 278a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#endif 288a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang} 298a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 308a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 31014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid CompleteParserRecorder::LogMessage(int start_pos, int end_pos, 32014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MessageTemplate::Template message, 33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const char* arg_opt, 34014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ParseErrorType error_type) { 35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (HasError()) return; 368a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang preamble_[PreparseDataConstants::kHasErrorOffset] = true; 378a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang function_store_.Reset(); 388a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang STATIC_ASSERT(PreparseDataConstants::kMessageStartPos == 0); 398a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang function_store_.Add(start_pos); 408a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang STATIC_ASSERT(PreparseDataConstants::kMessageEndPos == 1); 418a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang function_store_.Add(end_pos); 428a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang STATIC_ASSERT(PreparseDataConstants::kMessageArgCountPos == 2); 438a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang function_store_.Add((arg_opt == NULL) ? 0 : 1); 44014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch STATIC_ASSERT(PreparseDataConstants::kParseErrorTypePos == 3); 45014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch function_store_.Add(error_type); 46014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch STATIC_ASSERT(PreparseDataConstants::kMessageTemplatePos == 4); 47014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch function_store_.Add(static_cast<unsigned>(message)); 48014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch STATIC_ASSERT(PreparseDataConstants::kMessageArgPos == 5); 49257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch if (arg_opt != NULL) WriteString(CStrVector(arg_opt)); 508a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang} 518a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 528a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid CompleteParserRecorder::WriteString(Vector<const char> str) { 548a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang function_store_.Add(str.length()); 558a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang for (int i = 0; i < str.length(); i++) { 568a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang function_store_.Add(str[i]); 578a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang } 588a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang} 598a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 608a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochScriptData* CompleteParserRecorder::GetScriptData() { 628a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang int function_size = function_store_.size(); 638a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang int total_size = PreparseDataConstants::kHeaderSize + function_size; 64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch unsigned* data = NewArray<unsigned>(total_size); 658a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang preamble_[PreparseDataConstants::kFunctionsSizeOffset] = function_size; 66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MemCopy(data, preamble_, sizeof(preamble_)); 678a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang if (function_size > 0) { 68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch function_store_.WriteTo(Vector<unsigned>( 69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch data + PreparseDataConstants::kHeaderSize, function_size)); 708a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang } 71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsAligned(reinterpret_cast<intptr_t>(data), kPointerAlignment)); 72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ScriptData* result = new ScriptData(reinterpret_cast<byte*>(data), 73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch total_size * sizeof(unsigned)); 74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result->AcquireDataOwnership(); 75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 768a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang} 778a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 788a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 79014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace internal 80014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace v8. 81