1 // Copyright 2010 the V8 project authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "src/parsing/preparse-data.h" 6 #include "src/base/hashmap.h" 7 #include "src/base/logging.h" 8 #include "src/globals.h" 9 #include "src/parsing/parser.h" 10 #include "src/parsing/preparse-data-format.h" 11 12 namespace v8 { 13 namespace internal { 14 15 void ParserLogger::LogFunction(int start, int end, int num_parameters, 16 int function_length, 17 bool has_duplicate_parameters, int literals, 18 int properties, LanguageMode language_mode, 19 bool uses_super_property, bool calls_eval) { 20 function_store_.Add(start); 21 function_store_.Add(end); 22 function_store_.Add(num_parameters); 23 function_store_.Add(function_length); 24 function_store_.Add(literals); 25 function_store_.Add(properties); 26 function_store_.Add( 27 FunctionEntry::EncodeFlags(language_mode, uses_super_property, calls_eval, 28 has_duplicate_parameters)); 29 } 30 31 ParserLogger::ParserLogger() { 32 preamble_[PreparseDataConstants::kMagicOffset] = 33 PreparseDataConstants::kMagicNumber; 34 preamble_[PreparseDataConstants::kVersionOffset] = 35 PreparseDataConstants::kCurrentVersion; 36 preamble_[PreparseDataConstants::kFunctionsSizeOffset] = 0; 37 preamble_[PreparseDataConstants::kSizeOffset] = 0; 38 DCHECK_EQ(4, PreparseDataConstants::kHeaderSize); 39 #ifdef DEBUG 40 prev_start_ = -1; 41 #endif 42 } 43 44 ScriptData* ParserLogger::GetScriptData() { 45 int function_size = function_store_.size(); 46 int total_size = PreparseDataConstants::kHeaderSize + function_size; 47 unsigned* data = NewArray<unsigned>(total_size); 48 preamble_[PreparseDataConstants::kFunctionsSizeOffset] = function_size; 49 MemCopy(data, preamble_, sizeof(preamble_)); 50 if (function_size > 0) { 51 function_store_.WriteTo(Vector<unsigned>( 52 data + PreparseDataConstants::kHeaderSize, function_size)); 53 } 54 DCHECK(IsAligned(reinterpret_cast<intptr_t>(data), kPointerAlignment)); 55 ScriptData* result = new ScriptData(reinterpret_cast<byte*>(data), 56 total_size * sizeof(unsigned)); 57 result->AcquireDataOwnership(); 58 return result; 59 } 60 61 62 } // namespace internal 63 } // namespace v8. 64