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 60663 : int StackTraceFrame::GetLineNumber(Handle<StackTraceFrame> frame) {
13 60663 : if (frame->frame_info()->IsUndefined()) InitializeFrameInfo(frame);
14 121326 : int line = GetFrameInfo(frame)->line_number();
15 60663 : return line != StackFrameBase::kNone ? line : Message::kNoLineNumberInfo;
16 : }
17 :
18 60628 : int StackTraceFrame::GetColumnNumber(Handle<StackTraceFrame> frame) {
19 60628 : if (frame->frame_info()->IsUndefined()) InitializeFrameInfo(frame);
20 121256 : int column = GetFrameInfo(frame)->column_number();
21 60628 : return column != StackFrameBase::kNone ? column : Message::kNoColumnInfo;
22 : }
23 :
24 60244 : int StackTraceFrame::GetScriptId(Handle<StackTraceFrame> frame) {
25 60244 : if (frame->frame_info()->IsUndefined()) InitializeFrameInfo(frame);
26 120488 : int id = GetFrameInfo(frame)->script_id();
27 60244 : return id != StackFrameBase::kNone ? id : Message::kNoScriptIdInfo;
28 : }
29 :
30 60431 : Handle<Object> StackTraceFrame::GetFileName(Handle<StackTraceFrame> frame) {
31 60431 : if (frame->frame_info()->IsUndefined()) InitializeFrameInfo(frame);
32 120862 : auto name = GetFrameInfo(frame)->script_name();
33 60431 : return handle(name, frame->GetIsolate());
34 : }
35 :
36 120428 : Handle<Object> StackTraceFrame::GetScriptNameOrSourceUrl(
37 : Handle<StackTraceFrame> frame) {
38 120428 : if (frame->frame_info()->IsUndefined()) InitializeFrameInfo(frame);
39 240856 : auto name = GetFrameInfo(frame)->script_name_or_source_url();
40 120428 : return handle(name, frame->GetIsolate());
41 : }
42 :
43 60593 : Handle<Object> StackTraceFrame::GetFunctionName(Handle<StackTraceFrame> frame) {
44 60593 : if (frame->frame_info()->IsUndefined()) InitializeFrameInfo(frame);
45 121186 : auto name = GetFrameInfo(frame)->function_name();
46 60593 : 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 60169 : bool StackTraceFrame::IsWasm(Handle<StackTraceFrame> frame) {
60 60169 : if (frame->frame_info()->IsUndefined()) InitializeFrameInfo(frame);
61 120338 : return GetFrameInfo(frame)->is_wasm();
62 : }
63 :
64 483356 : Handle<StackFrameInfo> StackTraceFrame::GetFrameInfo(
65 : Handle<StackTraceFrame> frame) {
66 483356 : 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 121996 : } // namespace v8
|