5#include <unordered_set>
22struct NameHandleHasher {
26struct UniqueNameHandleEqual {
34using UniqueNameHandleSet =
35 std::unordered_set<IndirectHandle<Name>, NameHandleHasher,
36 UniqueNameHandleEqual>;
43 if (!IsJSFunction(*constructor)) {
44 return *isolate->factory()->false_value();
52 args.atOrUndefined(isolate, 1)));
53 return *isolate->factory()->ToBoolean(
result);
58 DirectHandle<JSReceiver> property_names,
60 DirectHandleVector<Name>& field_names,
61 std::set<uint32_t>& element_names) {
64 UniqueNameHandleSet field_names_set;
65 for (
int i = 0;
i < num_properties;
i++) {
67 isolate, raw_property_name,
75 if (!property_name->AsIntegerIndex(&index) ||
77 property_name = isolate->factory()->InternalizeName(property_name);
80 if (IsSymbol(*property_name)) {
82 isolate, NewTypeError(MessageTemplate::kSymbolToString),
86 is_duplicate = !field_names_set.insert(property_name).second;
88 if (!is_duplicate) field_names.push_back(property_name);
90 is_duplicate = !element_names.insert(
static_cast<uint32_t
>(index)).second;
96 NewTypeError(MessageTemplate::kDuplicateTemplateProperty,
110 auto* factory = isolate->factory();
118 if (!IsJSReceiver(*
args.atOrUndefined(isolate, 1))) {
121 NewTypeError(MessageTemplate::kArgumentIsNonObject,
122 factory->NewStringFromAsciiChecked(
"property names")));
129 isolate, raw_length_number,
132 if (num_properties_double < 0 ||
135 isolate, NewRangeError(MessageTemplate::kStructFieldCountOutOfRange));
137 int num_properties =
static_cast<int>(num_properties_double);
140 std::set<uint32_t> element_names;
141 if (num_properties != 0) {
143 CollectFieldsAndElements(isolate, property_names_arg, num_properties,
144 field_names, element_names),
148 if (IsUndefined(*
args.atOrUndefined(isolate, 2), isolate)) {
154 if (!IsString(*
args.atOrUndefined(isolate, 2))) {
156 isolate, NewTypeError(MessageTemplate::kArgumentIsNonString,
157 factory->NewStringFromAsciiChecked(
158 "type registry key")));
161 isolate, instance_map,
162 isolate->shared_struct_type_registry()->Register(
171 isolate->factory()->NewSharedFunctionInfoForBuiltin(
172 isolate->factory()->empty_string(), Builtin::kSharedStructConstructor,
177 .
set_map(isolate->strict_function_with_readonly_prototype_map())
179 constructor->set_prototype_or_initial_map(*instance_map,
kReleaseStore);
182 isolate, constructor, factory->has_instance_symbol(),
184 isolate->native_context()->shared_space_js_object_has_instance(),
195 return *isolate->factory()->NewJSSharedStruct(
202 return isolate->heap()->ToBoolean(
203 IsJSSharedStruct(*
args.atOrUndefined(isolate, 1)));
208 return isolate->heap()->ToBoolean(
209 IsJSAtomicsMutex(*
args.atOrUndefined(isolate, 1)));
214 return isolate->heap()->ToBoolean(
215 IsJSAtomicsCondition(*
args.atOrUndefined(isolate, 1)));
static Maybe< bool > HasInstance(Isolate *isolate, DirectHandle< JSFunction > constructor, DirectHandle< Object > object)
JSFunctionBuilder & set_map(DirectHandle< Map > v)
V8_WARN_UNUSED_RESULT Handle< JSFunction > Build()
Handle< NativeContext > native_context()
static V8_EXPORT_PRIVATE void AddProperty(Isolate *isolate, DirectHandle< JSObject > object, DirectHandle< Name > name, DirectHandle< Object > value, PropertyAttributes attributes)
static constexpr uint32_t kMaxElementIndex
static V8_WARN_UNUSED_RESULT MaybeHandle< Object > GetElement(Isolate *isolate, DirectHandle< JSReceiver > receiver, uint32_t index)
static MaybeDirectHandle< NumberDictionary > GetElementsTemplate(Isolate *isolate, Tagged< Map > instance_map)
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)
static double NumberValue(Tagged< Number > obj)
static V8_WARN_UNUSED_RESULT MaybeDirectHandle< Object > GetLengthFromArrayLike(Isolate *isolate, DirectHandle< JSReceiver > object)
static V8_WARN_UNUSED_RESULT HandleType< Name >::MaybeType ToName(Isolate *isolate, HandleType< Object > input)
Handle< SharedFunctionInfo > info
#define THROW_NEW_ERROR_RETURN_VALUE(isolate, call, value)
#define ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, dst, call)
#define ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, dst, call, value)
#define THROW_NEW_ERROR_RETURN_FAILURE(isolate, call)
#define MAYBE_RETURN(call, value)
#define MAYBE_ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, dst, call)
base::Vector< const DirectHandle< Object > > args
ZoneVector< RpoNumber > & result
constexpr Vector< T > VectorOf(T *start, size_t size)
V8_INLINE DirectHandle< T > direct_handle(Tagged< T > object, Isolate *isolate)
static const int kMaxNumberOfDescriptors
constexpr AdaptArguments kAdapt
V8_EXPORT_PRIVATE FlagValues v8_flags
constexpr int kMaxJSStructFields
bool IsUniqueName(Tagged< Name > obj)
Tagged< To > Cast(Tagged< From > value, const v8::SourceLocation &loc=INIT_SOURCE_LOCATION_IN_DEBUG)
static constexpr ReleaseStoreTag kReleaseStore
Maybe< T > Just(const T &t)
#define DCHECK(condition)