Line data Source code
1 : // Copyright 2019 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/objects/stack-frame-info.h"
6 :
7 : #include "src/objects/stack-frame-info-inl.h"
8 :
9 : namespace v8 {
10 : namespace internal {
11 :
12 60685 : int StackTraceFrame::GetLineNumber(Handle<StackTraceFrame> frame) {
13 60685 : if (frame->frame_info()->IsUndefined()) InitializeFrameInfo(frame);
14 121370 : int line = GetFrameInfo(frame)->line_number();
15 60685 : return line != StackFrameBase::kNone ? line : Message::kNoLineNumberInfo;
16 : }
17 :
18 60650 : int StackTraceFrame::GetColumnNumber(Handle<StackTraceFrame> frame) {
19 60650 : if (frame->frame_info()->IsUndefined()) InitializeFrameInfo(frame);
20 121300 : int column = GetFrameInfo(frame)->column_number();
21 60650 : return column != StackFrameBase::kNone ? column : Message::kNoColumnInfo;
22 : }
23 :
24 60266 : int StackTraceFrame::GetScriptId(Handle<StackTraceFrame> frame) {
25 60266 : if (frame->frame_info()->IsUndefined()) InitializeFrameInfo(frame);
26 120532 : int id = GetFrameInfo(frame)->script_id();
27 60266 : return id != StackFrameBase::kNone ? id : Message::kNoScriptIdInfo;
28 : }
29 :
30 60453 : Handle<Object> StackTraceFrame::GetFileName(Handle<StackTraceFrame> frame) {
31 60453 : if (frame->frame_info()->IsUndefined()) InitializeFrameInfo(frame);
32 120906 : auto name = GetFrameInfo(frame)->script_name();
33 60453 : return handle(name, frame->GetIsolate());
34 : }
35 :
36 120472 : Handle<Object> StackTraceFrame::GetScriptNameOrSourceUrl(
37 : Handle<StackTraceFrame> frame) {
38 120472 : if (frame->frame_info()->IsUndefined()) InitializeFrameInfo(frame);
39 240944 : auto name = GetFrameInfo(frame)->script_name_or_source_url();
40 120472 : return handle(name, frame->GetIsolate());
41 : }
42 :
43 60615 : Handle<Object> StackTraceFrame::GetFunctionName(Handle<StackTraceFrame> frame) {
44 60615 : if (frame->frame_info()->IsUndefined()) InitializeFrameInfo(frame);
45 121230 : auto name = GetFrameInfo(frame)->function_name();
46 60615 : return handle(name, frame->GetIsolate());
47 : }
48 :
49 100 : bool StackTraceFrame::IsEval(Handle<StackTraceFrame> frame) {
50 100 : if (frame->frame_info()->IsUndefined()) InitializeFrameInfo(frame);
51 200 : return GetFrameInfo(frame)->is_eval();
52 : }
53 :
54 100 : bool StackTraceFrame::IsConstructor(Handle<StackTraceFrame> frame) {
55 100 : if (frame->frame_info()->IsUndefined()) InitializeFrameInfo(frame);
56 200 : return GetFrameInfo(frame)->is_constructor();
57 : }
58 :
59 60191 : bool StackTraceFrame::IsWasm(Handle<StackTraceFrame> frame) {
60 60191 : if (frame->frame_info()->IsUndefined()) InitializeFrameInfo(frame);
61 120382 : return GetFrameInfo(frame)->is_wasm();
62 : }
63 :
64 483532 : Handle<StackFrameInfo> StackTraceFrame::GetFrameInfo(
65 : Handle<StackTraceFrame> frame) {
66 483532 : return handle(StackFrameInfo::cast(frame->frame_info()), frame->GetIsolate());
67 : }
68 :
69 10770 : void StackTraceFrame::InitializeFrameInfo(Handle<StackTraceFrame> frame) {
70 : Isolate* isolate = frame->GetIsolate();
71 : Handle<StackFrameInfo> frame_info = isolate->factory()->NewStackFrameInfo(
72 : handle(FrameArray::cast(frame->frame_array()), isolate),
73 10770 : frame->frame_index());
74 21540 : frame->set_frame_info(*frame_info);
75 :
76 : // After initializing, we no longer need to keep a reference
77 : // to the frame_array.
78 21540 : frame->set_frame_array(ReadOnlyRoots(isolate).undefined_value());
79 : frame->set_frame_index(-1);
80 10770 : }
81 :
82 : } // namespace internal
83 122036 : } // namespace v8
|