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 64923 : int StackTraceFrame::GetLineNumber(Handle<StackTraceFrame> frame) {
13 129846 : if (frame->frame_info()->IsUndefined()) InitializeFrameInfo(frame);
14 129846 : int line = GetFrameInfo(frame)->line_number();
15 64923 : return line != StackFrameBase::kNone ? line : Message::kNoLineNumberInfo;
16 : }
17 :
18 64888 : int StackTraceFrame::GetColumnNumber(Handle<StackTraceFrame> frame) {
19 129776 : if (frame->frame_info()->IsUndefined()) InitializeFrameInfo(frame);
20 129776 : int column = GetFrameInfo(frame)->column_number();
21 64888 : return column != StackFrameBase::kNone ? column : Message::kNoColumnInfo;
22 : }
23 :
24 64504 : int StackTraceFrame::GetScriptId(Handle<StackTraceFrame> frame) {
25 129008 : if (frame->frame_info()->IsUndefined()) InitializeFrameInfo(frame);
26 129008 : int id = GetFrameInfo(frame)->script_id();
27 64504 : return id != StackFrameBase::kNone ? id : Message::kNoScriptIdInfo;
28 : }
29 :
30 64691 : Handle<Object> StackTraceFrame::GetFileName(Handle<StackTraceFrame> frame) {
31 129382 : if (frame->frame_info()->IsUndefined()) InitializeFrameInfo(frame);
32 129382 : auto name = GetFrameInfo(frame)->script_name();
33 64691 : return handle(name, frame->GetIsolate());
34 : }
35 :
36 128948 : Handle<Object> StackTraceFrame::GetScriptNameOrSourceUrl(
37 : Handle<StackTraceFrame> frame) {
38 257896 : if (frame->frame_info()->IsUndefined()) InitializeFrameInfo(frame);
39 257896 : auto name = GetFrameInfo(frame)->script_name_or_source_url();
40 128948 : return handle(name, frame->GetIsolate());
41 : }
42 :
43 64853 : Handle<Object> StackTraceFrame::GetFunctionName(Handle<StackTraceFrame> frame) {
44 129706 : if (frame->frame_info()->IsUndefined()) InitializeFrameInfo(frame);
45 129706 : auto name = GetFrameInfo(frame)->function_name();
46 64853 : return handle(name, frame->GetIsolate());
47 : }
48 :
49 100 : bool StackTraceFrame::IsEval(Handle<StackTraceFrame> frame) {
50 200 : 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 200 : if (frame->frame_info()->IsUndefined()) InitializeFrameInfo(frame);
56 200 : return GetFrameInfo(frame)->is_constructor();
57 : }
58 :
59 64429 : bool StackTraceFrame::IsWasm(Handle<StackTraceFrame> frame) {
60 128858 : if (frame->frame_info()->IsUndefined()) InitializeFrameInfo(frame);
61 128858 : return GetFrameInfo(frame)->is_wasm();
62 : }
63 :
64 517436 : Handle<StackFrameInfo> StackTraceFrame::GetFrameInfo(
65 : Handle<StackTraceFrame> frame) {
66 517436 : return handle(StackFrameInfo::cast(frame->frame_info()), frame->GetIsolate());
67 : }
68 :
69 10738 : 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 10738 : frame->frame_index());
74 21476 : frame->set_frame_info(*frame_info);
75 :
76 : // After initializing, we no longer need to keep a reference
77 : // to the frame_array.
78 21476 : frame->set_frame_array(ReadOnlyRoots(isolate).undefined_value());
79 : frame->set_frame_index(-1);
80 10738 : }
81 :
82 : } // namespace internal
83 178779 : } // namespace v8
|