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/string-inl.h"
12
13 // Has to be the last include (doesn't have include guards):
14 #include "src/objects/object-macros.h"
15
16 namespace v8 {
17 namespace internal {
18
19 CAST_ACCESSOR(Script)
20
ACCESSORS(Script,source,Object,kSourceOffset)21 ACCESSORS(Script, source, Object, kSourceOffset)
22 ACCESSORS(Script, name, Object, kNameOffset)
23 SMI_ACCESSORS(Script, id, kIdOffset)
24 SMI_ACCESSORS(Script, line_offset, kLineOffsetOffset)
25 SMI_ACCESSORS(Script, column_offset, kColumnOffsetOffset)
26 ACCESSORS(Script, context_data, Object, kContextOffset)
27 SMI_ACCESSORS(Script, type, kTypeOffset)
28 ACCESSORS(Script, line_ends, Object, kLineEndsOffset)
29 ACCESSORS_CHECKED(Script, eval_from_shared_or_wrapped_arguments, Object,
30 kEvalFromSharedOrWrappedArgumentsOffset,
31 this->type() != TYPE_WASM)
32 SMI_ACCESSORS_CHECKED(Script, eval_from_position, kEvalFromPositionOffset,
33 this->type() != TYPE_WASM)
34 ACCESSORS(Script, shared_function_infos, WeakFixedArray,
35 kSharedFunctionInfosOffset)
36 SMI_ACCESSORS(Script, flags, kFlagsOffset)
37 ACCESSORS(Script, source_url, Object, kSourceUrlOffset)
38 ACCESSORS(Script, source_mapping_url, Object, kSourceMappingUrlOffset)
39 ACCESSORS(Script, host_defined_options, FixedArray, kHostDefinedOptionsOffset)
40 ACCESSORS_CHECKED(Script, wasm_module_object, Object,
41 kEvalFromSharedOrWrappedArgumentsOffset,
42 this->type() == TYPE_WASM)
43
44 bool Script::is_wrapped() const {
45 return eval_from_shared_or_wrapped_arguments()->IsFixedArray();
46 }
47
has_eval_from_shared()48 bool Script::has_eval_from_shared() const {
49 return eval_from_shared_or_wrapped_arguments()->IsSharedFunctionInfo();
50 }
51
set_eval_from_shared(SharedFunctionInfo * shared,WriteBarrierMode mode)52 void Script::set_eval_from_shared(SharedFunctionInfo* shared,
53 WriteBarrierMode mode) {
54 DCHECK(!is_wrapped());
55 set_eval_from_shared_or_wrapped_arguments(shared, mode);
56 }
57
eval_from_shared()58 SharedFunctionInfo* Script::eval_from_shared() const {
59 DCHECK(has_eval_from_shared());
60 return SharedFunctionInfo::cast(eval_from_shared_or_wrapped_arguments());
61 }
62
set_wrapped_arguments(FixedArray * value,WriteBarrierMode mode)63 void Script::set_wrapped_arguments(FixedArray* value, WriteBarrierMode mode) {
64 DCHECK(!has_eval_from_shared());
65 set_eval_from_shared_or_wrapped_arguments(value, mode);
66 }
67
wrapped_arguments()68 FixedArray* Script::wrapped_arguments() const {
69 DCHECK(is_wrapped());
70 return FixedArray::cast(eval_from_shared_or_wrapped_arguments());
71 }
72
compilation_type()73 Script::CompilationType Script::compilation_type() {
74 return BooleanBit::get(flags(), kCompilationTypeBit) ? COMPILATION_TYPE_EVAL
75 : COMPILATION_TYPE_HOST;
76 }
set_compilation_type(CompilationType type)77 void Script::set_compilation_type(CompilationType type) {
78 set_flags(BooleanBit::set(flags(), kCompilationTypeBit,
79 type == COMPILATION_TYPE_EVAL));
80 }
compilation_state()81 Script::CompilationState Script::compilation_state() {
82 return BooleanBit::get(flags(), kCompilationStateBit)
83 ? COMPILATION_STATE_COMPILED
84 : COMPILATION_STATE_INITIAL;
85 }
set_compilation_state(CompilationState state)86 void Script::set_compilation_state(CompilationState state) {
87 set_flags(BooleanBit::set(flags(), kCompilationStateBit,
88 state == COMPILATION_STATE_COMPILED));
89 }
origin_options()90 ScriptOriginOptions Script::origin_options() {
91 return ScriptOriginOptions((flags() & kOriginOptionsMask) >>
92 kOriginOptionsShift);
93 }
set_origin_options(ScriptOriginOptions origin_options)94 void Script::set_origin_options(ScriptOriginOptions origin_options) {
95 DCHECK(!(origin_options.Flags() & ~((1 << kOriginOptionsSize) - 1)));
96 set_flags((flags() & ~kOriginOptionsMask) |
97 (origin_options.Flags() << kOriginOptionsShift));
98 }
99
HasValidSource()100 bool Script::HasValidSource() {
101 Object* src = this->source();
102 if (!src->IsString()) return true;
103 String* src_str = String::cast(src);
104 if (!StringShape(src_str).IsExternal()) return true;
105 if (src_str->IsOneByteRepresentation()) {
106 return ExternalOneByteString::cast(src)->resource() != nullptr;
107 } else if (src_str->IsTwoByteRepresentation()) {
108 return ExternalTwoByteString::cast(src)->resource() != nullptr;
109 }
110 return true;
111 }
112
113 } // namespace internal
114 } // namespace v8
115
116 #include "src/objects/object-macros-undef.h"
117
118 #endif // V8_OBJECTS_SCRIPT_INL_H_
119