Line data Source code
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/objects-inl.h"
10 : #include "src/parsing/parser.h"
11 : #include "src/parsing/preparse-data-format.h"
12 :
13 : namespace v8 {
14 : namespace internal {
15 :
16 204 : void ParserLogger::LogFunction(int start, int end, int num_parameters,
17 : LanguageMode language_mode,
18 : bool uses_super_property,
19 : int num_inner_functions) {
20 204 : function_store_.Add(start);
21 204 : function_store_.Add(end);
22 204 : function_store_.Add(num_parameters);
23 : function_store_.Add(
24 204 : FunctionEntry::EncodeFlags(language_mode, uses_super_property));
25 204 : function_store_.Add(num_inner_functions);
26 204 : }
27 :
28 2263509 : ParserLogger::ParserLogger() {
29 : preamble_[PreparseDataConstants::kMagicOffset] =
30 2263516 : PreparseDataConstants::kMagicNumber;
31 : preamble_[PreparseDataConstants::kVersionOffset] =
32 2263516 : PreparseDataConstants::kCurrentVersion;
33 2263516 : preamble_[PreparseDataConstants::kFunctionsSizeOffset] = 0;
34 2263516 : preamble_[PreparseDataConstants::kSizeOffset] = 0;
35 : DCHECK_EQ(4, PreparseDataConstants::kHeaderSize);
36 : #ifdef DEBUG
37 : prev_start_ = -1;
38 : #endif
39 2263516 : }
40 :
41 144 : ScriptData* ParserLogger::GetScriptData() {
42 144 : int function_size = function_store_.size();
43 144 : int total_size = PreparseDataConstants::kHeaderSize + function_size;
44 144 : unsigned* data = NewArray<unsigned>(total_size);
45 144 : preamble_[PreparseDataConstants::kFunctionsSizeOffset] = function_size;
46 144 : MemCopy(data, preamble_, sizeof(preamble_));
47 144 : if (function_size > 0) {
48 : function_store_.WriteTo(Vector<unsigned>(
49 240 : data + PreparseDataConstants::kHeaderSize, function_size));
50 : }
51 : DCHECK(IsAligned(reinterpret_cast<intptr_t>(data), kPointerAlignment));
52 : ScriptData* result = new ScriptData(reinterpret_cast<byte*>(data),
53 144 : total_size * sizeof(unsigned));
54 : result->AcquireDataOwnership();
55 144 : return result;
56 : }
57 :
58 14 : PreParseData::FunctionData PreParseData::GetFunctionData(int start) const {
59 : auto it = functions_.find(start);
60 14 : if (it != functions_.end()) {
61 14 : return it->second;
62 : }
63 : return FunctionData();
64 : }
65 :
66 210 : void PreParseData::AddFunctionData(int start, FunctionData&& data) {
67 : DCHECK(data.is_valid());
68 210 : functions_[start] = std::move(data);
69 210 : }
70 :
71 25457 : void PreParseData::AddFunctionData(int start, const FunctionData& data) {
72 : DCHECK(data.is_valid());
73 25457 : functions_[start] = data;
74 25457 : }
75 :
76 176 : size_t PreParseData::size() const { return functions_.size(); }
77 :
78 23 : PreParseData::const_iterator PreParseData::begin() const {
79 23 : return functions_.begin();
80 : }
81 :
82 23 : PreParseData::const_iterator PreParseData::end() const {
83 23 : return functions_.end();
84 : }
85 :
86 : } // namespace internal
87 : } // namespace v8.
|