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