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