v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
js-struct.h
Go to the documentation of this file.
1// Copyright 2022 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_JS_STRUCT_H_
6#define V8_OBJECTS_JS_STRUCT_H_
7
9#include "src/objects/smi.h"
10
11// Has to be the last include (doesn't have include guards):
13
14namespace v8 {
15namespace internal {
16
17#include "torque-generated/src/objects/js-struct-tq.inc"
18
20 : public TorqueGeneratedAlwaysSharedSpaceJSObject<AlwaysSharedSpaceJSObject,
21 JSObject> {
22 public:
23 // Prepare a Map to be used as the instance map for shared JS objects.
26 Isolate* isolate, Tagged<Map> map, Tagged<DescriptorArray> descriptors);
28 Isolate* isolate, DirectHandle<Map> map,
29 DirectHandle<DescriptorArray> descriptors, int enum_length);
30
34 Maybe<ShouldThrow> should_throw);
35
36 // This is a generic `HasInstance` that checks the constructor's initial map
37 // against the object's map. It is on `AlwaysSharedSpaceJSObject` because this
38 // kind of instanceof resolution resolution is used only for shared objects.
39 static Maybe<bool> HasInstance(Isolate* isolate,
40 DirectHandle<JSFunction> constructor,
42
43 static_assert(kHeaderSize == JSObject::kHeaderSize);
45};
46
48 : public TorqueGeneratedJSSharedStruct<JSSharedStruct,
49 AlwaysSharedSpaceJSObject> {
50 public:
52 Isolate* isolate,
53 const base::Vector<const DirectHandle<Name>> field_names,
54 const std::set<uint32_t>& element_names,
55 MaybeDirectHandle<String> maybe_registry_key);
56
58 Tagged<Map> instance_map);
59
60 static bool IsRegistryKeyDescriptor(Isolate* isolate,
61 Tagged<Map> instance_map,
63
65 Isolate* isolate, Tagged<Map> instance_map);
66
67 static bool IsElementsTemplateDescriptor(Isolate* isolate,
68 Tagged<Map> instance_map,
70
73
74 class BodyDescriptor;
75
77};
78
80 public:
81 static constexpr Tagged<Smi> deleted_element() { return Smi::FromInt(1); }
82
85
87 Isolate* isolate, Handle<String> key,
88 const base::Vector<const DirectHandle<Name>> field_names,
89 const std::set<uint32_t>& element_names);
90
91 void IterateElements(Isolate* isolate, RootVisitor* visitor);
93
94 private:
95 class Data;
96
98 Isolate* isolate, Handle<String> key,
99 const base::Vector<const DirectHandle<Name>> field_names,
100 const std::set<uint32_t>& element_names);
101
104 const base::Vector<const DirectHandle<Name>> field_names,
105 const std::set<uint32_t>& element_names);
106
107 void EnsureCapacity(PtrComprCageBase cage_base, int additional_elements);
108
109 std::unique_ptr<Data> data_;
110
111 // Protects all access to the registry.
113};
114
115} // namespace internal
116} // namespace v8
117
119
120#endif // V8_OBJECTS_JS_STRUCT_H_
static void PrepareMapNoEnumerableProperties(Tagged< Map > map)
Definition js-struct.cc:34
static void PrepareMapWithEnumerableProperties(Isolate *isolate, DirectHandle< Map > map, DirectHandle< DescriptorArray > descriptors, int enum_length)
Definition js-struct.cc:50
static V8_WARN_UNUSED_RESULT Maybe< bool > DefineOwnProperty(Isolate *isolate, DirectHandle< AlwaysSharedSpaceJSObject > shared_obj, DirectHandle< Object > key, PropertyDescriptor *desc, Maybe< ShouldThrow > should_throw)
Definition js-struct.cc:63
static Maybe< bool > HasInstance(Isolate *isolate, DirectHandle< JSFunction > constructor, DirectHandle< Object > object)
Definition js-struct.cc:96
static bool IsRegistryKeyDescriptor(Isolate *isolate, Tagged< Map > instance_map, InternalIndex i)
Definition js-struct.cc:284
static MaybeHandle< String > GetRegistryKey(Isolate *isolate, Tagged< Map > instance_map)
Definition js-struct.cc:276
static MaybeDirectHandle< NumberDictionary > GetElementsTemplate(Isolate *isolate, Tagged< Map > instance_map)
Definition js-struct.cc:293
static DirectHandle< Map > CreateInstanceMap(Isolate *isolate, const base::Vector< const DirectHandle< Name > > field_names, const std::set< uint32_t > &element_names, MaybeDirectHandle< String > maybe_registry_key)
Definition js-struct.cc:165
static bool IsElementsTemplateDescriptor(Isolate *isolate, Tagged< Map > instance_map, InternalIndex i)
Definition js-struct.cc:301
MaybeDirectHandle< Map > RegisterNoThrow(Isolate *isolate, Handle< String > key, const base::Vector< const DirectHandle< Name > > field_names, const std::set< uint32_t > &element_names)
Definition js-struct.cc:442
std::unique_ptr< Data > data_
Definition js-struct.h:109
void IterateElements(Isolate *isolate, RootVisitor *visitor)
Definition js-struct.cc:497
MaybeDirectHandle< Map > Register(Isolate *isolate, Handle< String > key, const base::Vector< const DirectHandle< Name > > field_names, const std::set< uint32_t > &element_names)
Definition js-struct.cc:483
void EnsureCapacity(PtrComprCageBase cage_base, int additional_elements)
Definition js-struct.cc:515
MaybeDirectHandle< Map > CheckIfEntryMatches(Isolate *isolate, InternalIndex entry, DirectHandle< String > key, const base::Vector< const DirectHandle< Name > > field_names, const std::set< uint32_t > &element_names)
Definition js-struct.cc:377
static constexpr Tagged< Smi > deleted_element()
Definition js-struct.h:81
static constexpr Tagged< Smi > FromInt(int value)
Definition smi.h:38
#define DECL_PRINTER(Name)
#define TQ_OBJECT_CONSTRUCTORS(Type)
#define EXPORT_DECL_VERIFIER(Name)
#define V8_WARN_UNUSED_RESULT
Definition v8config.h:671