v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
bytecode-array-inl.h
Go to the documentation of this file.
1// Copyright 2023 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_BYTECODE_ARRAY_INL_H_
6#define V8_OBJECTS_BYTECODE_ARRAY_INL_H_
7
9// Include the non-inl header before the rest of the headers.
10
15
16// Has to be the last include (doesn't have include guards):
18
19namespace v8 {
20namespace internal {
21
22OBJECT_CONSTRUCTORS_IMPL(BytecodeArray, ExposedTrustedObject)
23
24SMI_ACCESSORS(BytecodeArray, length, kLengthOffset)
25RELEASE_ACQUIRE_SMI_ACCESSORS(BytecodeArray, length, kLengthOffset)
27 kHandlerTableOffset)
29 kConstantPoolOffset)
30ACCESSORS(BytecodeArray, wrapper, Tagged<BytecodeWrapper>, kWrapperOffset)
32 source_position_table,
34 kSourcePositionTableOffset)
35
36uint8_t BytecodeArray::get(int index) const {
37 DCHECK(index >= 0 && index < length());
38 return ReadField<uint8_t>(kHeaderSize + index * kCharSize);
39}
40
41void BytecodeArray::set(int index, uint8_t value) {
42 DCHECK(index >= 0 && index < length());
44}
45
46void BytecodeArray::set_frame_size(int32_t frame_size) {
47 DCHECK_GE(frame_size, 0);
49 WriteField<int32_t>(kFrameSizeOffset, frame_size);
50}
51
52int32_t BytecodeArray::frame_size() const {
53 return ReadField<int32_t>(kFrameSizeOffset);
54}
55
57 return static_cast<int>(frame_size()) / kSystemPointerSize;
58}
59
61 return ReadField<uint16_t>(kParameterSizeOffset);
62}
63
67
68void BytecodeArray::set_parameter_count(uint16_t number_of_parameters) {
69 WriteField<uint16_t>(kParameterSizeOffset, number_of_parameters);
70}
71
73 return ReadField<uint16_t>(kMaxArgumentsOffset);
74}
75
76void BytecodeArray::set_max_arguments(uint16_t max_arguments) {
77 WriteField<uint16_t>(kMaxArgumentsOffset, max_arguments);
78}
79
80int32_t BytecodeArray::max_frame_size() const {
81 return frame_size() + (max_arguments() << kSystemPointerSizeLog2);
82}
83
85 const {
86 int32_t register_operand =
87 ReadField<int32_t>(kIncomingNewTargetOrGeneratorRegisterOffset);
88 if (register_operand == 0) {
90 } else {
91 return interpreter::Register::FromOperand(register_operand);
92 }
93}
94
96 interpreter::Register incoming_new_target_or_generator_register) {
98 WriteField<int32_t>(kIncomingNewTargetOrGeneratorRegisterOffset, 0);
99 } else {
103 WriteField<int32_t>(kIncomingNewTargetOrGeneratorRegisterOffset,
105 }
106}
107
109 int data_size = kHeaderSize + length();
110 memset(reinterpret_cast<void*>(address() + data_size), 0,
111 SizeFor(length()) - data_size);
112}
113
117
119 return has_source_position_table(kAcquireLoad);
120}
121
123 // WARNING: This function may be called from a background thread, hence
124 // changes to how it accesses the heap can easily lead to bugs.
125 Tagged<Object> maybe_table = raw_source_position_table(kAcquireLoad);
126 if (IsTrustedByteArray(maybe_table))
127 return Cast<TrustedByteArray>(maybe_table);
128 DCHECK_EQ(maybe_table, Smi::zero());
129 return GetIsolateFromWritableObject(*this)
130 ->heap()
131 ->empty_trusted_byte_array();
132}
133
135 TaggedField<Object>::Release_Store(*this, kSourcePositionTableOffset,
136 Smi::zero());
137}
138
140 Tagged<Object> value = RawProtectedPointerField(kConstantPoolOffset).load();
141 // This field might be 0 during deserialization.
142 DCHECK(value == Smi::zero() || IsTrustedFixedArray(value));
143 return value;
144}
145
147 Tagged<Object> value = RawProtectedPointerField(kHandlerTableOffset).load();
148 // This field might be 0 during deserialization.
149 DCHECK(value == Smi::zero() || IsTrustedByteArray(value));
150 return value;
151}
152
153DEF_ACQUIRE_GETTER(BytecodeArray, raw_source_position_table, Tagged<Object>) {
154 Tagged<Object> value =
155 RawProtectedPointerField(kSourcePositionTableOffset).Acquire_Load();
156 // This field might be 0 during deserialization or if source positions have
157 // not been (successfully) collected.
158 DCHECK(value == Smi::zero() || IsTrustedByteArray(value));
159 return value;
160}
161
162int BytecodeArray::BytecodeArraySize() const { return SizeFor(this->length()); }
163
164DEF_GETTER(BytecodeArray, SizeIncludingMetadata, int) {
165 int size = BytecodeArraySize();
166 Tagged<Object> maybe_constant_pool = raw_constant_pool(cage_base);
167 if (IsTrustedFixedArray(maybe_constant_pool)) {
168 size += Cast<TrustedFixedArray>(maybe_constant_pool)->Size();
169 } else {
170 DCHECK_EQ(maybe_constant_pool, Smi::zero());
171 }
172 Tagged<Object> maybe_handler_table = raw_handler_table(cage_base);
173 if (IsTrustedByteArray(maybe_handler_table)) {
174 size += Cast<TrustedByteArray>(maybe_handler_table)->AllocatedSize();
175 } else {
176 DCHECK_EQ(maybe_handler_table, Smi::zero());
177 }
178 Tagged<Object> maybe_table = raw_source_position_table(kAcquireLoad);
179 if (IsByteArray(maybe_table)) {
180 size += Cast<ByteArray>(maybe_table)->AllocatedSize();
181 }
182 return size;
183}
184
185OBJECT_CONSTRUCTORS_IMPL(BytecodeWrapper, Struct)
186
187TRUSTED_POINTER_ACCESSORS(BytecodeWrapper, bytecode, BytecodeArray,
188 kBytecodeOffset, kBytecodeArrayIndirectPointerTag)
189
190} // namespace internal
191} // namespace v8
192
194
195#endif // V8_OBJECTS_BYTECODE_ARRAY_INL_H_
uint16_t parameter_count_without_receiver() const
interpreter::Register incoming_new_target_or_generator_register() const
void set(int index, uint8_t value)
void set_max_arguments(uint16_t max_arguments)
void set_incoming_new_target_or_generator_register(interpreter::Register incoming_new_target_or_generator_register)
void set_parameter_count(uint16_t number_of_parameters)
static constexpr int SizeFor(int length)
T ReadField(size_t offset) const
Address address() const
void WriteField(size_t offset, T value) const
static constexpr Tagged< Smi > zero()
Definition smi.h:99
static void Release_Store(Tagged< HeapObject > host, PtrType value)
static constexpr Register FromOperand(int32_t operand)
constexpr int32_t ToOperand() const
static constexpr Register invalid_value()
int int32_t
Definition unicode.cc:40
constexpr int kCharSize
Definition globals.h:396
V8_INLINE Isolate * GetIsolateFromWritableObject(Tagged< HeapObject > object)
constexpr int kSystemPointerSizeLog2
Definition globals.h:494
constexpr int kSystemPointerSize
Definition globals.h:410
const int kHeapObjectTag
Definition v8-internal.h:72
return value
Definition map-inl.h:893
Tagged< To > Cast(Tagged< From > value, const v8::SourceLocation &loc=INIT_SOURCE_LOCATION_IN_DEBUG)
Definition casting.h:150
static constexpr AcquireLoadTag kAcquireLoad
Definition globals.h:2908
#define PROTECTED_POINTER_ACCESSORS(holder, name, type, offset)
#define OBJECT_CONSTRUCTORS_IMPL(Type, Super)
#define DEF_ACQUIRE_GETTER(holder, name,...)
#define ACCESSORS(holder, name, type, offset)
#define TRUSTED_POINTER_ACCESSORS(holder, name, type, offset, tag)
#define SMI_ACCESSORS(holder, name, offset)
#define RELEASE_ACQUIRE_SMI_ACCESSORS(holder, name, offset)
#define RELEASE_ACQUIRE_PROTECTED_POINTER_ACCESSORS(holder, name, type, offset)
#define DEF_GETTER(Camel, Lower, Bit)
#define DCHECK_NE(v1, v2)
Definition logging.h:486
#define DCHECK_GE(v1, v2)
Definition logging.h:488
#define DCHECK(condition)
Definition logging.h:482
#define DCHECK_EQ(v1, v2)
Definition logging.h:485
constexpr bool IsAligned(T value, U alignment)
Definition macros.h:403