1 // Copyright 2017 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 #ifndef V8_OBJECTS_SCRIPT_INL_H_
6 #define V8_OBJECTS_SCRIPT_INL_H_
7
8 #include "src/objects/script.h"
9
10 #include "src/objects/shared-function-info.h"
11 #include "src/objects/smi-inl.h"
12 #include "src/objects/string-inl.h"
13
14 // Has to be the last include (doesn't have include guards):
15 #include "src/objects/object-macros.h"
16
17 namespace v8 {
18 namespace internal {
19
OBJECT_CONSTRUCTORS_IMPL(Script,Struct)20 OBJECT_CONSTRUCTORS_IMPL(Script, Struct)
21
22 NEVER_READ_ONLY_SPACE_IMPL(Script)
23
24 CAST_ACCESSOR(Script)
25
26 ACCESSORS(Script, source, Object, kSourceOffset)
27 ACCESSORS(Script, name, Object, kNameOffset)
28 SMI_ACCESSORS(Script, id, kIdOffset)
29 SMI_ACCESSORS(Script, line_offset, kLineOffsetOffset)
30 SMI_ACCESSORS(Script, column_offset, kColumnOffsetOffset)
31 ACCESSORS(Script, context_data, Object, kContextOffset)
32 SMI_ACCESSORS(Script, type, kScriptTypeOffset)
33 ACCESSORS(Script, line_ends, Object, kLineEndsOffset)
34 ACCESSORS_CHECKED(Script, eval_from_shared_or_wrapped_arguments, Object,
35 kEvalFromSharedOrWrappedArgumentsOffset,
36 this->type() != TYPE_WASM)
37 SMI_ACCESSORS_CHECKED(Script, eval_from_position, kEvalFromPositionOffset,
38 this->type() != TYPE_WASM)
39 SMI_ACCESSORS(Script, flags, kFlagsOffset)
40 ACCESSORS(Script, source_url, Object, kSourceUrlOffset)
41 ACCESSORS(Script, source_mapping_url, Object, kSourceMappingUrlOffset)
42 ACCESSORS(Script, host_defined_options, FixedArray, kHostDefinedOptionsOffset)
43 ACCESSORS_CHECKED(Script, wasm_breakpoint_infos, FixedArray,
44 kEvalFromSharedOrWrappedArgumentsOffset,
45 this->type() == TYPE_WASM)
46 ACCESSORS_CHECKED(Script, wasm_managed_native_module, Object,
47 kEvalFromPositionOffset, this->type() == TYPE_WASM)
48 ACCESSORS_CHECKED(Script, wasm_weak_instance_list, WeakArrayList,
49 kSharedFunctionInfosOffset, this->type() == TYPE_WASM)
50
51 bool Script::is_wrapped() const {
52 return eval_from_shared_or_wrapped_arguments().IsFixedArray();
53 }
54
has_eval_from_shared()55 bool Script::has_eval_from_shared() const {
56 return eval_from_shared_or_wrapped_arguments().IsSharedFunctionInfo();
57 }
58
set_eval_from_shared(SharedFunctionInfo shared,WriteBarrierMode mode)59 void Script::set_eval_from_shared(SharedFunctionInfo shared,
60 WriteBarrierMode mode) {
61 DCHECK(!is_wrapped());
62 set_eval_from_shared_or_wrapped_arguments(shared, mode);
63 }
64
eval_from_shared()65 SharedFunctionInfo Script::eval_from_shared() const {
66 DCHECK(has_eval_from_shared());
67 return SharedFunctionInfo::cast(eval_from_shared_or_wrapped_arguments());
68 }
69
set_wrapped_arguments(FixedArray value,WriteBarrierMode mode)70 void Script::set_wrapped_arguments(FixedArray value, WriteBarrierMode mode) {
71 DCHECK(!has_eval_from_shared());
72 set_eval_from_shared_or_wrapped_arguments(value, mode);
73 }
74
wrapped_arguments()75 FixedArray Script::wrapped_arguments() const {
76 DCHECK(is_wrapped());
77 return FixedArray::cast(eval_from_shared_or_wrapped_arguments());
78 }
79
DEF_GETTER(Script,shared_function_infos,WeakFixedArray)80 DEF_GETTER(Script, shared_function_infos, WeakFixedArray) {
81 return type() == TYPE_WASM
82 ? ReadOnlyRoots(GetHeap()).empty_weak_fixed_array()
83 : TaggedField<WeakFixedArray, kSharedFunctionInfosOffset>::load(
84 *this);
85 }
86
set_shared_function_infos(WeakFixedArray value,WriteBarrierMode mode)87 void Script::set_shared_function_infos(WeakFixedArray value,
88 WriteBarrierMode mode) {
89 DCHECK_NE(TYPE_WASM, type());
90 TaggedField<WeakFixedArray, kSharedFunctionInfosOffset>::store(*this, value);
91 CONDITIONAL_WRITE_BARRIER(*this, kSharedFunctionInfosOffset, value, mode);
92 }
93
has_wasm_breakpoint_infos()94 bool Script::has_wasm_breakpoint_infos() const {
95 return type() == TYPE_WASM && wasm_breakpoint_infos().length() > 0;
96 }
97
wasm_native_module()98 wasm::NativeModule* Script::wasm_native_module() const {
99 return Managed<wasm::NativeModule>::cast(wasm_managed_native_module()).raw();
100 }
101
compilation_type()102 Script::CompilationType Script::compilation_type() {
103 return BooleanBit::get(flags(), kCompilationTypeBit) ? COMPILATION_TYPE_EVAL
104 : COMPILATION_TYPE_HOST;
105 }
set_compilation_type(CompilationType type)106 void Script::set_compilation_type(CompilationType type) {
107 set_flags(BooleanBit::set(flags(), kCompilationTypeBit,
108 type == COMPILATION_TYPE_EVAL));
109 }
compilation_state()110 Script::CompilationState Script::compilation_state() {
111 return BooleanBit::get(flags(), kCompilationStateBit)
112 ? COMPILATION_STATE_COMPILED
113 : COMPILATION_STATE_INITIAL;
114 }
set_compilation_state(CompilationState state)115 void Script::set_compilation_state(CompilationState state) {
116 set_flags(BooleanBit::set(flags(), kCompilationStateBit,
117 state == COMPILATION_STATE_COMPILED));
118 }
119
is_repl_mode()120 bool Script::is_repl_mode() const {
121 return BooleanBit::get(flags(), kREPLModeBit);
122 }
123
set_is_repl_mode(bool value)124 void Script::set_is_repl_mode(bool value) {
125 set_flags(BooleanBit::set(flags(), kREPLModeBit, value));
126 }
127
origin_options()128 ScriptOriginOptions Script::origin_options() {
129 return ScriptOriginOptions((flags() & kOriginOptionsMask) >>
130 kOriginOptionsShift);
131 }
set_origin_options(ScriptOriginOptions origin_options)132 void Script::set_origin_options(ScriptOriginOptions origin_options) {
133 DCHECK(!(origin_options.Flags() & ~((1 << kOriginOptionsSize) - 1)));
134 set_flags((flags() & ~kOriginOptionsMask) |
135 (origin_options.Flags() << kOriginOptionsShift));
136 }
137
HasValidSource()138 bool Script::HasValidSource() {
139 Object src = this->source();
140 if (!src.IsString()) return true;
141 String src_str = String::cast(src);
142 if (!StringShape(src_str).IsExternal()) return true;
143 if (src_str.IsOneByteRepresentation()) {
144 return ExternalOneByteString::cast(src).resource() != nullptr;
145 } else if (src_str.IsTwoByteRepresentation()) {
146 return ExternalTwoByteString::cast(src).resource() != nullptr;
147 }
148 return true;
149 }
150
151 } // namespace internal
152 } // namespace v8
153
154 #include "src/objects/object-macros-undef.h"
155
156 #endif // V8_OBJECTS_SCRIPT_INL_H_
157