// Copyright 2019 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // JSReceiver corresponds to objects in the JS sense. @abstract @highestInstanceTypeWithinParentClassRange extern class JSReceiver extends HeapObject { properties_or_hash: FixedArrayBase|PropertyArray|Smi; } type Constructor extends JSReceiver; @generateCppClass @apiExposedInstanceTypeValue(0x421) @highestInstanceTypeWithinParentClassRange extern class JSObject extends JSReceiver { // [elements]: The elements (properties with names that are integers). // // Elements can be in two general modes: fast and slow. Each mode // corresponds to a set of object representations of elements that // have something in common. // // In the fast mode elements is a FixedArray and so each element can be // quickly accessed. The elements array can have one of several maps in this // mode: fixed_array_map, fixed_double_array_map, // sloppy_arguments_elements_map or fixed_cow_array_map (for copy-on-write // arrays). In the latter case the elements array may be shared by a few // objects and so before writing to any element the array must be copied. Use // EnsureWritableFastElements in this case. // // In the slow mode the elements is either a NumberDictionary or a // FixedArray parameter map for a (sloppy) arguments object. elements: FixedArrayBase; } macro NewJSObject(implicit context: Context)(): JSObject { const objectFunction: JSFunction = GetObjectFunction(); const map: Map = Cast(objectFunction.prototype_or_initial_map) otherwise unreachable; return AllocateJSObjectFromMap(map); } @abstract @generateCppClass @lowestInstanceTypeWithinParentClassRange extern class JSCustomElementsObject extends JSObject { } @abstract @generateCppClass @lowestInstanceTypeWithinParentClassRange extern class JSSpecialObject extends JSCustomElementsObject { } macro GetDerivedMap(implicit context: Context)( target: JSFunction, newTarget: JSReceiver): Map { try { const constructor = Cast(newTarget) otherwise SlowPath; assert(IsConstructor(constructor)); const map = Cast(constructor.prototype_or_initial_map) otherwise SlowPath; if (LoadConstructorOrBackPointer(map) != target) { goto SlowPath; } return map; } label SlowPath { return runtime::GetDerivedMap(context, target, newTarget); } } macro AllocateFastOrSlowJSObjectFromMap(implicit context: Context)(map: Map): JSObject { let properties: EmptyFixedArray|NameDictionary = kEmptyFixedArray; if (IsDictionaryMap(map)) { properties = AllocateNameDictionary(kNameDictionaryInitialCapacity); } return AllocateJSObjectFromMap( map, properties, kEmptyFixedArray, AllocationFlag::kNone, SlackTrackingMode::kWithSlackTracking); } @generateCppClass extern class JSGlobalProxy extends JSSpecialObject { // [native_context]: the owner native context of this global proxy object. // It is null value if this object is not used by any context. native_context: Object; } extern class JSGlobalObject extends JSSpecialObject { native_context: NativeContext; global_proxy: JSGlobalProxy; } @generateCppClass extern class JSPrimitiveWrapper extends JSCustomElementsObject { value: JSAny; } extern class JSMessageObject extends JSObject { // Tagged fields. message_type: Smi; arguments: Object; script: Script; stack_frames: Object; shared_info: SharedFunctionInfo|Undefined; // Raw data fields. // TODO(ishell): store as int32 instead of Smi. bytecode_offset: Smi; start_position: Smi; end_position: Smi; error_level: Smi; } @generateCppClass extern class JSDate extends JSObject { // If one component is NaN, all of them are, indicating a NaN time value. // The time value. value: NumberOrUndefined; // Cached values: year: Undefined|Smi|NaN; month: Undefined|Smi|NaN; day: Undefined|Smi|NaN; weekday: Undefined|Smi|NaN; hour: Undefined|Smi|NaN; min: Undefined|Smi|NaN; sec: Undefined|Smi|NaN; // Sample of the date cache stamp at the moment when chached fields were // cached. cache_stamp: Undefined|Smi|NaN; } @generateCppClass extern class JSAsyncFromSyncIterator extends JSObject { sync_iterator: JSReceiver; // The "next" method is loaded during GetIterator, and is not reloaded for // subsequent "next" invocations. next: Object; } @generateCppClass extern class JSStringIterator extends JSObject { // The [[IteratedString]] slot. string: String; // The [[StringIteratorNextIndex]] slot. index: Smi; } extern macro AllocateJSObjectFromMap(Map): JSObject; extern macro AllocateJSObjectFromMap( Map, NameDictionary | EmptyFixedArray | PropertyArray): JSObject; extern macro AllocateJSObjectFromMap( Map, NameDictionary | EmptyFixedArray | PropertyArray, FixedArray, constexpr AllocationFlag, constexpr SlackTrackingMode): JSObject;