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