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