18b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch// Copyright 2011 the V8 project authors. All rights reserved.
2b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// Redistribution and use in source and binary forms, with or without
3b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// modification, are permitted provided that the following conditions are
4b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// met:
5b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//
6b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//     * Redistributions of source code must retain the above copyright
7b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//       notice, this list of conditions and the following disclaimer.
8b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//     * Redistributions in binary form must reproduce the above
9b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//       copyright notice, this list of conditions and the following
10b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//       disclaimer in the documentation and/or other materials provided
11b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//       with the distribution.
12b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//     * Neither the name of Google Inc. nor the names of its
13b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//       contributors may be used to endorse or promote products derived
14b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//       from this software without specific prior written permission.
15b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//
16b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
28b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#include "../include/v8-preparser.h"
2944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
30b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#include "globals.h"
31b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#include "checks.h"
32b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#include "allocation.h"
33b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#include "utils.h"
34b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#include "list.h"
35b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#include "scanner-base.h"
36b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#include "preparse-data.h"
37b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#include "preparser.h"
38b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
39b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochnamespace v8 {
40b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochnamespace internal {
41b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
42b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// UTF16Buffer based on a v8::UnicodeInputStream.
43b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass InputStreamUTF16Buffer : public UC16CharacterStream {
44b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
45b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  /* The InputStreamUTF16Buffer maintains an internal buffer
46b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch   * that is filled in chunks from the UC16CharacterStream.
47b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch   * It also maintains unlimited pushback capability, but optimized
48b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch   * for small pushbacks.
49b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch   * The pushback_buffer_ pointer points to the limit of pushbacks
50b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch   * in the current buffer. There is room for a few pushback'ed chars before
51b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch   * the buffer containing the most recently read chunk. If this is overflowed,
52b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch   * an external buffer is allocated/reused to hold further pushbacks, and
53b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch   * pushback_buffer_ and buffer_cursor_/buffer_end_ now points to the
54b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch   * new buffer. When this buffer is read to the end again, the cursor is
55b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch   * switched back to the internal buffer
56b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch   */
57b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  explicit InputStreamUTF16Buffer(v8::UnicodeInputStream* stream)
58b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      : UC16CharacterStream(),
59b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        stream_(stream),
60b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        pushback_buffer_(buffer_),
61b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        pushback_buffer_end_cache_(NULL),
62b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        pushback_buffer_backing_(NULL),
63b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        pushback_buffer_backing_size_(0) {
64b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    buffer_cursor_ = buffer_end_ = buffer_ + kPushBackSize;
65b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
66b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
67b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual ~InputStreamUTF16Buffer() {
68b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (pushback_buffer_backing_ != NULL) {
69b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      DeleteArray(pushback_buffer_backing_);
70b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
71b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
72b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
73b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  virtual void PushBack(uc32 ch) {
74b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(pos_ > 0);
75b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    if (ch == kEndOfInput) {
76b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      pos_--;
77b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      return;
78b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    }
79b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (buffer_cursor_ <= pushback_buffer_) {
80b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      // No more room in the current buffer to do pushbacks.
81b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      if (pushback_buffer_end_cache_ == NULL) {
82b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        // We have overflowed the pushback space at the beginning of buffer_.
83b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        // Switch to using a separate allocated pushback buffer.
84b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        if (pushback_buffer_backing_ == NULL) {
85b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch          // Allocate a buffer the first time we need it.
86b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch          pushback_buffer_backing_ = NewArray<uc16>(kPushBackSize);
87b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch          pushback_buffer_backing_size_ = kPushBackSize;
88b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        }
89b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        pushback_buffer_ = pushback_buffer_backing_;
90b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        pushback_buffer_end_cache_ = buffer_end_;
91b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        buffer_end_ = pushback_buffer_backing_ + pushback_buffer_backing_size_;
92b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        buffer_cursor_ = buffer_end_ - 1;
93b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      } else {
94b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        // Hit the bottom of the allocated pushback buffer.
95b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        // Double the buffer and continue.
96b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        uc16* new_buffer = NewArray<uc16>(pushback_buffer_backing_size_ * 2);
97b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        memcpy(new_buffer + pushback_buffer_backing_size_,
98b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               pushback_buffer_backing_,
99b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               pushback_buffer_backing_size_);
100b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        DeleteArray(pushback_buffer_backing_);
101b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        buffer_cursor_ = new_buffer + pushback_buffer_backing_size_;
102b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        pushback_buffer_backing_ = pushback_buffer_ = new_buffer;
103b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        buffer_end_ = pushback_buffer_backing_ + pushback_buffer_backing_size_;
104b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      }
105b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
106b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    pushback_buffer_[buffer_cursor_ - pushback_buffer_- 1] =
107b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch        static_cast<uc16>(ch);
108b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    pos_--;
109b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
110b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
111b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
112b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual bool ReadBlock() {
113b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (pushback_buffer_end_cache_ != NULL) {
114b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      buffer_cursor_ = buffer_;
115b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      buffer_end_ = pushback_buffer_end_cache_;
116b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      pushback_buffer_end_cache_ = NULL;
117b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      return buffer_end_ > buffer_cursor_;
118b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
119b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // Copy the top of the buffer into the pushback area.
120b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    int32_t value;
121b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    uc16* buffer_start = buffer_ + kPushBackSize;
122b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    buffer_cursor_ = buffer_end_ = buffer_start;
123b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    while ((value = stream_->Next()) >= 0) {
124b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      if (value > static_cast<int32_t>(unibrow::Utf8::kMaxThreeByteChar)) {
125b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        value = unibrow::Utf8::kBadChar;
126b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      }
127b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      // buffer_end_ is a const pointer, but buffer_ is writable.
128b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      buffer_start[buffer_end_++ - buffer_start] = static_cast<uc16>(value);
129b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      if (buffer_end_ == buffer_ + kPushBackSize + kBufferSize) break;
130b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
131b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return buffer_end_ > buffer_start;
132b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
133b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
134b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual unsigned SlowSeekForward(unsigned pos) {
135b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // Seeking in the input is not used by preparsing.
136b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // It's only used by the real parser based on preparser data.
137b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    UNIMPLEMENTED();
138b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return 0;
139b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
140b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
141b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
142b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static const unsigned kBufferSize = 512;
143b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static const unsigned kPushBackSize = 16;
144b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  v8::UnicodeInputStream* const stream_;
145b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Buffer holding first kPushBackSize characters of pushback buffer,
146b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // then kBufferSize chars of read-ahead.
147b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // The pushback buffer is only used if pushing back characters past
148b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // the start of a block.
149b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  uc16 buffer_[kPushBackSize + kBufferSize];
150b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Limit of pushbacks before new allocation is necessary.
151b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  uc16* pushback_buffer_;
152b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Only if that pushback buffer at the start of buffer_ isn't sufficient
153b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // is the following used.
154b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  const uc16* pushback_buffer_end_cache_;
155b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  uc16* pushback_buffer_backing_;
156b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  unsigned pushback_buffer_backing_size_;
157b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
158b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
159b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
160b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass StandAloneJavaScriptScanner : public JavaScriptScanner {
161b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
1628b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  explicit StandAloneJavaScriptScanner(UnicodeCache* unicode_cache)
1638b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch      : JavaScriptScanner(unicode_cache) { }
16444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
165b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void Initialize(UC16CharacterStream* source) {
166b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    source_ = source;
167b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    Init();
168b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // Skip initial whitespace allowing HTML comment ends just like
169b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // after a newline and scan first token.
170b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    has_line_terminator_before_next_ = true;
171b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SkipWhiteSpace();
172b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    Scan();
173b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
174b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
175b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
176b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
17744f0eee88ff00398ff7f715fab053374d808c90dSteve Block// Functions declared by allocation.h and implemented in both api.cc (for v8)
17844f0eee88ff00398ff7f715fab053374d808c90dSteve Block// or here (for a stand-alone preparser).
179b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
180b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid FatalProcessOutOfMemory(const char* reason) {
181b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V8_Fatal(__FILE__, __LINE__, reason);
182b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
183b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
184b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochbool EnableSlowAsserts() { return true; }
185b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
186b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}  // namespace internal.
187b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
188b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
189b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochUnicodeInputStream::~UnicodeInputStream() { }
190b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
191b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
192b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochPreParserData Preparse(UnicodeInputStream* input, size_t max_stack) {
193b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  internal::InputStreamUTF16Buffer buffer(input);
194b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  uintptr_t stack_limit = reinterpret_cast<uintptr_t>(&buffer) - max_stack;
1958b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  internal::UnicodeCache unicode_cache;
1968b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  internal::StandAloneJavaScriptScanner scanner(&unicode_cache);
197b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  scanner.Initialize(&buffer);
198b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  internal::CompleteParserRecorder recorder;
199b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  preparser::PreParser::PreParseResult result =
200b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      preparser::PreParser::PreParseProgram(&scanner,
201b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                                            &recorder,
202b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                                            true,
203b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                                            stack_limit);
204b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (result == preparser::PreParser::kPreParseStackOverflow) {
205b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return PreParserData::StackOverflow();
206b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
207b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  internal::Vector<unsigned> pre_data = recorder.ExtractData();
208b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  size_t size = pre_data.length() * sizeof(pre_data[0]);
209b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  unsigned char* data = reinterpret_cast<unsigned char*>(pre_data.start());
210b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return PreParserData(size, data);
211b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
212b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
213b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}  // namespace v8.
214b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
215b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
216b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// Used by ASSERT macros and other immediate exits.
217b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochextern "C" void V8_Fatal(const char* file, int line, const char* format, ...) {
218b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  exit(EXIT_FAILURE);
219b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
220