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
LogFunction(int start,int end,int num_parameters,int function_length,bool has_duplicate_parameters,int literals,int properties,LanguageMode language_mode,bool uses_super_property,bool calls_eval)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
ParserLogger()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
GetScriptData()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