blob: efc6a6836f6f402231099aa4029de883c613e9a8 [file] [log] [blame]
// 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: SwissNameDictionary|FixedArrayBase|PropertyArray|Smi;
}
type Constructor extends JSReceiver;
@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<Map>(objectFunction.prototype_or_initial_map)
otherwise unreachable;
return AllocateJSObjectFromMap(map);
}
extern class JSExternalObject extends JSObject {
value: ExternalPointer;
}
// A JSObject that may contain EmbedderDataSlots for purposes other than being
// an API wrapper object. E.g., Promise objects can be set up to have embedder
// fields.
extern class JSObjectWithEmbedderSlots extends JSObject {}
// A JSObject that may contain EmbedderDataSlots and are considered API wrapper
// objects.
@abstract
extern class JSAPIObjectWithEmbedderSlots extends JSObject {
cpp_heap_wrappable: CppHeapPointer;
}
@abstract
@lowestInstanceTypeWithinParentClassRange
extern class JSCustomElementsObject extends JSObject {}
// These may also contain EmbedderDataSlots but can't be a child class of
// JSAPIObjectWithEmbedderSlots due to type id constraints. These objects are
// also considered API wrapper objects.
@abstract
@lowestInstanceTypeWithinParentClassRange
extern class JSSpecialObject extends JSCustomElementsObject {
// Mirror the same class hierarchy as with JSAPIObjectWithEmbedderSlots.
cpp_heap_wrappable: CppHeapPointer;
}
macro GetDerivedMap(
implicit context: Context)(target: JSFunction,
newTarget: JSReceiver): Map {
try {
const constructor =
Cast<JSFunctionWithPrototypeSlot>(newTarget) otherwise SlowPath;
dcheck(IsConstructor(constructor));
const map =
Cast<Map>(constructor.prototype_or_initial_map) otherwise SlowPath;
if (LoadConstructorOrBackPointer(map) != target) {
goto SlowPath;
}
return map;
} label SlowPath {
return runtime::GetDerivedMap(context, target, newTarget, FalseConstant());
}
}
macro GetDerivedRabGsabTypedArrayMap(
implicit context: Context)(target: JSFunction,
newTarget: JSReceiver): Map {
return runtime::GetDerivedMap(context, target, newTarget, TrueConstant());
}
macro AllocateFastOrSlowJSObjectFromMap(
implicit context: Context)(map: Map): JSObject {
let properties: EmptyFixedArray|NameDictionary|SwissNameDictionary =
kEmptyFixedArray;
if (IsDictionaryMap(map)) {
@if(V8_ENABLE_SWISS_NAME_DICTIONARY) {
properties =
AllocateSwissNameDictionary(kSwissNameDictionaryInitialCapacity);
}
@ifnot(V8_ENABLE_SWISS_NAME_DICTIONARY) {
properties = AllocateNameDictionary(kNameDictionaryInitialCapacity);
}
}
return AllocateJSObjectFromMap(
map, properties, kEmptyFixedArray, AllocationFlag::kNone,
SlackTrackingMode::kWithSlackTracking);
}
extern class JSGlobalProxy extends JSSpecialObject {}
extern class JSGlobalObject extends JSSpecialObject {
// [global proxy]: the global proxy object of the context
global_proxy: JSGlobalProxy;
}
extern class JSPrimitiveWrapper extends JSCustomElementsObject {
value: JSAny;
}
extern class JSMessageObject extends JSObject {
// Tagged fields.
message_type: Smi;
// [argument]: the arguments for formatting the error message.
argument: Object;
// [script]: the script from which the error message originated.
script: Script;
// [stack_frames]: an array of stack frames for this error object.
stack_frames: Object;
shared_info: SharedFunctionInfo|Smi;
// Raw data fields.
// TODO(ishell): store as int32 instead of Smi.
bytecode_offset: Smi;
start_position: Smi;
end_position: Smi;
error_level: Smi;
}
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;
}
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;
}
extern class JSStringIterator extends JSObject {
// The [[IteratedString]] slot.
string: String;
// The [[StringIteratorNextIndex]] slot.
index: Smi;
}
// The wrapper returned by Iterator.from().
// https://tc39.es/proposal-iterator-helpers/#sec-wrapforvaliditeratorprototype-object
extern class JSValidIteratorWrapper extends JSObject {
// The [[Iterated]] slot.
underlying: iterator::IteratorRecord;
}
extern macro AllocateJSObjectFromMap(Map): JSObject;
extern macro AllocateJSObjectFromMap(
Map,
NameDictionary|SwissNameDictionary|EmptyFixedArray|PropertyArray): JSObject;
extern macro AllocateJSObjectFromMap(
Map, NameDictionary|SwissNameDictionary|EmptyFixedArray|PropertyArray,
FixedArray, constexpr AllocationFlag,
constexpr SlackTrackingMode): JSObject;