Commit 33fb2319 authored by Sathya Gunasekaran's avatar Sathya Gunasekaran Committed by Commit Bot

[runtime] Add new instance types for common prototype objects

In the future, these instance types will be used for fast range checks
rather than the current slow individual map checks.

Bug: v8:11256
Change-Id: I4ad7d5259fbd46c3272a80996a5ac45a400d1f5e
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2590040
Commit-Queue: Sathya Gunasekaran  <gsathya@chromium.org>
Reviewed-by: 's avatarTobias Tebbi <tebbi@chromium.org>
Reviewed-by: 's avatarCamillo Bruni <cbruni@chromium.org>
Cr-Commit-Position: refs/heads/master@{#71791}
parent b2a611d8
...@@ -136,6 +136,37 @@ struct float64_or_hole { ...@@ -136,6 +136,37 @@ struct float64_or_hole {
} }
const kDoubleHole: float64_or_hole = float64_or_hole{is_hole: true, value: 0}; const kDoubleHole: float64_or_hole = float64_or_hole{is_hole: true, value: 0};
@doNotGenerateCast
@abstract
extern class JSPrototype extends JSObject generates 'TNode<JSObject>';
@doNotGenerateCast
extern class JSObjectPrototype extends JSPrototype
generates 'TNode<JSObject>';
@doNotGenerateCast
extern class JSRegExpPrototype extends JSPrototype
generates 'TNode<JSObject>';
@doNotGenerateCast
extern class JSPromisePrototype extends JSPrototype
generates 'TNode<JSObject>';
@doNotGenerateCast
extern class JSSetPrototype extends JSPrototype
generates 'TNode<JSObject>';
@doNotGenerateCast
extern class JSIteratorPrototype extends JSPrototype
generates 'TNode<JSObject>';
@doNotGenerateCast
extern class JSArrayIteratorPrototype extends JSPrototype
generates 'TNode<JSObject>';
@doNotGenerateCast
extern class JSMapIteratorPrototype extends JSPrototype
generates 'TNode<JSObject>';
@doNotGenerateCast
extern class JSSetIteratorPrototype extends JSPrototype
generates 'TNode<JSObject>';
@doNotGenerateCast
extern class JSStringIteratorPrototype extends JSPrototype
generates 'TNode<JSObject>';
// The HashTable inheritance hierarchy doesn't actually look like this in C++ // The HashTable inheritance hierarchy doesn't actually look like this in C++
// because it uses some class templates that we can't yet (and may never) // because it uses some class templates that we can't yet (and may never)
// express in Torque, but this is the expected organization of instance types. // express in Torque, but this is the expected organization of instance types.
......
...@@ -182,7 +182,16 @@ Type::bitset BitsetType::Lub(const MapRefLike& map) { ...@@ -182,7 +182,16 @@ Type::bitset BitsetType::Lub(const MapRefLike& map) {
UNREACHABLE(); UNREACHABLE();
case HEAP_NUMBER_TYPE: case HEAP_NUMBER_TYPE:
return kNumber; return kNumber;
case JS_ARRAY_ITERATOR_PROTOTYPE_TYPE:
case JS_ITERATOR_PROTOTYPE_TYPE:
case JS_MAP_ITERATOR_PROTOTYPE_TYPE:
case JS_OBJECT_PROTOTYPE_TYPE:
case JS_OBJECT_TYPE: case JS_OBJECT_TYPE:
case JS_PROMISE_PROTOTYPE_TYPE:
case JS_REG_EXP_PROTOTYPE_TYPE:
case JS_SET_ITERATOR_PROTOTYPE_TYPE:
case JS_SET_PROTOTYPE_TYPE:
case JS_STRING_ITERATOR_PROTOTYPE_TYPE:
case JS_ARGUMENTS_OBJECT_TYPE: case JS_ARGUMENTS_OBJECT_TYPE:
case JS_ERROR_TYPE: case JS_ERROR_TYPE:
case JS_GLOBAL_OBJECT_TYPE: case JS_GLOBAL_OBJECT_TYPE:
......
...@@ -214,11 +214,20 @@ void HeapObject::HeapObjectVerify(Isolate* isolate) { ...@@ -214,11 +214,20 @@ void HeapObject::HeapObjectVerify(Isolate* isolate) {
case CODE_TYPE: case CODE_TYPE:
Code::cast(*this).CodeVerify(isolate); Code::cast(*this).CodeVerify(isolate);
break; break;
case JS_OBJECT_TYPE:
case JS_ERROR_TYPE:
case JS_API_OBJECT_TYPE: case JS_API_OBJECT_TYPE:
case JS_SPECIAL_API_OBJECT_TYPE: case JS_ARRAY_ITERATOR_PROTOTYPE_TYPE:
case JS_CONTEXT_EXTENSION_OBJECT_TYPE: case JS_CONTEXT_EXTENSION_OBJECT_TYPE:
case JS_ERROR_TYPE:
case JS_ITERATOR_PROTOTYPE_TYPE:
case JS_MAP_ITERATOR_PROTOTYPE_TYPE:
case JS_OBJECT_PROTOTYPE_TYPE:
case JS_OBJECT_TYPE:
case JS_PROMISE_PROTOTYPE_TYPE:
case JS_REG_EXP_PROTOTYPE_TYPE:
case JS_SET_ITERATOR_PROTOTYPE_TYPE:
case JS_SET_PROTOTYPE_TYPE:
case JS_SPECIAL_API_OBJECT_TYPE:
case JS_STRING_ITERATOR_PROTOTYPE_TYPE:
JSObject::cast(*this).JSObjectVerify(isolate); JSObject::cast(*this).JSObjectVerify(isolate);
break; break;
case WASM_INSTANCE_OBJECT_TYPE: case WASM_INSTANCE_OBJECT_TYPE:
......
...@@ -159,11 +159,20 @@ void HeapObject::HeapObjectPrint(std::ostream& os) { // NOLINT ...@@ -159,11 +159,20 @@ void HeapObject::HeapObjectPrint(std::ostream& os) { // NOLINT
case FILLER_TYPE: case FILLER_TYPE:
os << "filler"; os << "filler";
break; break;
case JS_OBJECT_TYPE: // fall through
case JS_API_OBJECT_TYPE: case JS_API_OBJECT_TYPE:
case JS_SPECIAL_API_OBJECT_TYPE: case JS_ARRAY_ITERATOR_PROTOTYPE_TYPE:
case JS_CONTEXT_EXTENSION_OBJECT_TYPE: case JS_CONTEXT_EXTENSION_OBJECT_TYPE:
case JS_ERROR_TYPE: case JS_ERROR_TYPE:
case JS_ITERATOR_PROTOTYPE_TYPE:
case JS_MAP_ITERATOR_PROTOTYPE_TYPE:
case JS_OBJECT_PROTOTYPE_TYPE:
case JS_OBJECT_TYPE:
case JS_PROMISE_PROTOTYPE_TYPE:
case JS_REG_EXP_PROTOTYPE_TYPE:
case JS_SET_ITERATOR_PROTOTYPE_TYPE:
case JS_SET_PROTOTYPE_TYPE:
case JS_SPECIAL_API_OBJECT_TYPE:
case JS_STRING_ITERATOR_PROTOTYPE_TYPE:
JSObject::cast(*this).JSObjectPrint(os); JSObject::cast(*this).JSObjectPrint(os);
break; break;
case WASM_INSTANCE_OBJECT_TYPE: case WASM_INSTANCE_OBJECT_TYPE:
......
...@@ -856,7 +856,7 @@ void Genesis::CreateObjectFunction(Handle<JSFunction> empty_function) { ...@@ -856,7 +856,7 @@ void Genesis::CreateObjectFunction(Handle<JSFunction> empty_function) {
native_context()->set_initial_object_prototype(*object_function_prototype); native_context()->set_initial_object_prototype(*object_function_prototype);
JSFunction::SetPrototype(object_fun, object_function_prototype); JSFunction::SetPrototype(object_fun, object_function_prototype);
object_function_prototype->map().set_instance_type(JS_OBJECT_PROTOTYPE_TYPE);
{ {
// Set up slow map for Object.create(null) instances without in-object // Set up slow map for Object.create(null) instances without in-object
// properties. // properties.
...@@ -907,6 +907,9 @@ void Genesis::CreateIteratorMaps(Handle<JSFunction> empty) { ...@@ -907,6 +907,9 @@ void Genesis::CreateIteratorMaps(Handle<JSFunction> empty) {
factory()->iterator_symbol(), "[Symbol.iterator]", factory()->iterator_symbol(), "[Symbol.iterator]",
Builtins::kReturnReceiver, 0, true); Builtins::kReturnReceiver, 0, true);
native_context()->set_initial_iterator_prototype(*iterator_prototype); native_context()->set_initial_iterator_prototype(*iterator_prototype);
CHECK_NE(iterator_prototype->map().ptr(),
isolate_->initial_object_prototype()->map().ptr());
iterator_prototype->map().set_instance_type(JS_ITERATOR_PROTOTYPE_TYPE);
Handle<JSObject> generator_object_prototype = factory()->NewJSObject( Handle<JSObject> generator_object_prototype = factory()->NewJSObject(
isolate()->object_function(), AllocationType::kOld); isolate()->object_function(), AllocationType::kOld);
...@@ -1855,6 +1858,10 @@ void Genesis::InitializeGlobal(Handle<JSGlobalObject> global_object, ...@@ -1855,6 +1858,10 @@ void Genesis::InitializeGlobal(Handle<JSGlobalObject> global_object,
Handle<JSObject> array_iterator_prototype = Handle<JSObject> array_iterator_prototype =
factory->NewJSObject(isolate_->object_function(), AllocationType::kOld); factory->NewJSObject(isolate_->object_function(), AllocationType::kOld);
JSObject::ForceSetPrototype(array_iterator_prototype, iterator_prototype); JSObject::ForceSetPrototype(array_iterator_prototype, iterator_prototype);
CHECK_NE(array_iterator_prototype->map().ptr(),
isolate_->initial_object_prototype()->map().ptr());
array_iterator_prototype->map().set_instance_type(
JS_ARRAY_ITERATOR_PROTOTYPE_TYPE);
InstallToStringTag(isolate_, array_iterator_prototype, InstallToStringTag(isolate_, array_iterator_prototype,
factory->ArrayIterator_string()); factory->ArrayIterator_string());
...@@ -2165,7 +2172,10 @@ void Genesis::InitializeGlobal(Handle<JSGlobalObject> global_object, ...@@ -2165,7 +2172,10 @@ void Genesis::InitializeGlobal(Handle<JSGlobalObject> global_object,
Handle<JSObject> string_iterator_prototype = Handle<JSObject> string_iterator_prototype =
factory->NewJSObject(isolate_->object_function(), AllocationType::kOld); factory->NewJSObject(isolate_->object_function(), AllocationType::kOld);
JSObject::ForceSetPrototype(string_iterator_prototype, iterator_prototype); JSObject::ForceSetPrototype(string_iterator_prototype, iterator_prototype);
CHECK_NE(string_iterator_prototype->map().ptr(),
isolate_->initial_object_prototype()->map().ptr());
string_iterator_prototype->map().set_instance_type(
JS_STRING_ITERATOR_PROTOTYPE_TYPE);
InstallToStringTag(isolate_, string_iterator_prototype, "String Iterator"); InstallToStringTag(isolate_, string_iterator_prototype, "String Iterator");
InstallFunctionWithBuiltinId(isolate_, string_iterator_prototype, "next", InstallFunctionWithBuiltinId(isolate_, string_iterator_prototype, "next",
...@@ -2434,6 +2444,9 @@ void Genesis::InitializeGlobal(Handle<JSGlobalObject> global_object, ...@@ -2434,6 +2444,9 @@ void Genesis::InitializeGlobal(Handle<JSGlobalObject> global_object,
Handle<Map> prototype_map(prototype->map(), isolate()); Handle<Map> prototype_map(prototype->map(), isolate());
Map::SetShouldBeFastPrototypeMap(prototype_map, true, isolate_); Map::SetShouldBeFastPrototypeMap(prototype_map, true, isolate_);
CHECK_NE(prototype->map().ptr(),
isolate_->initial_object_prototype()->map().ptr());
prototype->map().set_instance_type(JS_PROMISE_PROTOTYPE_TYPE);
DCHECK(promise_fun->HasFastProperties()); DCHECK(promise_fun->HasFastProperties());
} }
...@@ -2538,6 +2551,9 @@ void Genesis::InitializeGlobal(Handle<JSGlobalObject> global_object, ...@@ -2538,6 +2551,9 @@ void Genesis::InitializeGlobal(Handle<JSGlobalObject> global_object,
Handle<Map> prototype_map(prototype->map(), isolate()); Handle<Map> prototype_map(prototype->map(), isolate());
Map::SetShouldBeFastPrototypeMap(prototype_map, true, isolate_); Map::SetShouldBeFastPrototypeMap(prototype_map, true, isolate_);
CHECK_NE((*prototype_map).ptr(),
isolate_->initial_object_prototype()->map().ptr());
prototype_map->set_instance_type(JS_REG_EXP_PROTOTYPE_TYPE);
// Store the initial RegExp.prototype map. This is used in fast-path // Store the initial RegExp.prototype map. This is used in fast-path
// checks. Do not alter the prototype after this point. // checks. Do not alter the prototype after this point.
...@@ -3650,6 +3666,9 @@ void Genesis::InitializeGlobal(Handle<JSGlobalObject> global_object, ...@@ -3650,6 +3666,9 @@ void Genesis::InitializeGlobal(Handle<JSGlobalObject> global_object,
DCHECK(js_set_fun->HasFastProperties()); DCHECK(js_set_fun->HasFastProperties());
native_context()->set_js_set_map(js_set_fun->initial_map()); native_context()->set_js_set_map(js_set_fun->initial_map());
CHECK_NE(prototype->map().ptr(),
isolate_->initial_object_prototype()->map().ptr());
prototype->map().set_instance_type(JS_SET_PROTOTYPE_TYPE);
} }
{ // -- J S M o d u l e N a m e s p a c e { // -- J S M o d u l e N a m e s p a c e
...@@ -4164,6 +4183,9 @@ void Genesis::InitializeIteratorFunctions() { ...@@ -4164,6 +4183,9 @@ void Genesis::InitializeIteratorFunctions() {
InstallFunctionWithBuiltinId(isolate, prototype, "next", InstallFunctionWithBuiltinId(isolate, prototype, "next",
Builtins::kSetIteratorPrototypeNext, 0, true); Builtins::kSetIteratorPrototypeNext, 0, true);
native_context->set_initial_set_iterator_prototype(*prototype); native_context->set_initial_set_iterator_prototype(*prototype);
CHECK_NE(prototype->map().ptr(),
isolate_->initial_object_prototype()->map().ptr());
prototype->map().set_instance_type(JS_SET_ITERATOR_PROTOTYPE_TYPE);
// Setup SetIterator constructor. // Setup SetIterator constructor.
Handle<JSFunction> set_iterator_function = CreateFunction( Handle<JSFunction> set_iterator_function = CreateFunction(
...@@ -4194,6 +4216,9 @@ void Genesis::InitializeIteratorFunctions() { ...@@ -4194,6 +4216,9 @@ void Genesis::InitializeIteratorFunctions() {
InstallFunctionWithBuiltinId(isolate, prototype, "next", InstallFunctionWithBuiltinId(isolate, prototype, "next",
Builtins::kMapIteratorPrototypeNext, 0, true); Builtins::kMapIteratorPrototypeNext, 0, true);
native_context->set_initial_map_iterator_prototype(*prototype); native_context->set_initial_map_iterator_prototype(*prototype);
CHECK_NE(prototype->map().ptr(),
isolate_->initial_object_prototype()->map().ptr());
prototype->map().set_instance_type(JS_MAP_ITERATOR_PROTOTYPE_TYPE);
// Setup MapIterator constructor. // Setup MapIterator constructor.
Handle<JSFunction> map_iterator_function = CreateFunction( Handle<JSFunction> map_iterator_function = CreateFunction(
......
...@@ -504,6 +504,7 @@ bool CanSubclassHaveInobjectProperties(InstanceType instance_type) { ...@@ -504,6 +504,7 @@ bool CanSubclassHaveInobjectProperties(InstanceType instance_type) {
switch (instance_type) { switch (instance_type) {
case JS_API_OBJECT_TYPE: case JS_API_OBJECT_TYPE:
case JS_ARRAY_BUFFER_TYPE: case JS_ARRAY_BUFFER_TYPE:
case JS_ARRAY_ITERATOR_PROTOTYPE_TYPE:
case JS_ARRAY_TYPE: case JS_ARRAY_TYPE:
case JS_ASYNC_FROM_SYNC_ITERATOR_TYPE: case JS_ASYNC_FROM_SYNC_ITERATOR_TYPE:
case JS_CONTEXT_EXTENSION_OBJECT_TYPE: case JS_CONTEXT_EXTENSION_OBJECT_TYPE:
...@@ -511,6 +512,14 @@ bool CanSubclassHaveInobjectProperties(InstanceType instance_type) { ...@@ -511,6 +512,14 @@ bool CanSubclassHaveInobjectProperties(InstanceType instance_type) {
case JS_DATE_TYPE: case JS_DATE_TYPE:
case JS_FUNCTION_TYPE: case JS_FUNCTION_TYPE:
case JS_GENERATOR_OBJECT_TYPE: case JS_GENERATOR_OBJECT_TYPE:
case JS_ITERATOR_PROTOTYPE_TYPE:
case JS_MAP_ITERATOR_PROTOTYPE_TYPE:
case JS_OBJECT_PROTOTYPE_TYPE:
case JS_PROMISE_PROTOTYPE_TYPE:
case JS_REG_EXP_PROTOTYPE_TYPE:
case JS_SET_ITERATOR_PROTOTYPE_TYPE:
case JS_SET_PROTOTYPE_TYPE:
case JS_STRING_ITERATOR_PROTOTYPE_TYPE:
#ifdef V8_INTL_SUPPORT #ifdef V8_INTL_SUPPORT
case JS_COLLATOR_TYPE: case JS_COLLATOR_TYPE:
case JS_DATE_TIME_FORMAT_TYPE: case JS_DATE_TIME_FORMAT_TYPE:
......
...@@ -2173,9 +2173,18 @@ void JSObject::EnsureWritableFastElements(Handle<JSObject> object) { ...@@ -2173,9 +2173,18 @@ void JSObject::EnsureWritableFastElements(Handle<JSObject> object) {
int JSObject::GetHeaderSize(InstanceType type, int JSObject::GetHeaderSize(InstanceType type,
bool function_has_prototype_slot) { bool function_has_prototype_slot) {
switch (type) { switch (type) {
case JS_OBJECT_TYPE:
case JS_API_OBJECT_TYPE: case JS_API_OBJECT_TYPE:
case JS_ITERATOR_PROTOTYPE_TYPE:
case JS_MAP_ITERATOR_PROTOTYPE_TYPE:
case JS_OBJECT_PROTOTYPE_TYPE:
case JS_OBJECT_TYPE:
case JS_PROMISE_PROTOTYPE_TYPE:
case JS_REG_EXP_PROTOTYPE_TYPE:
case JS_SET_ITERATOR_PROTOTYPE_TYPE:
case JS_SET_PROTOTYPE_TYPE:
case JS_SPECIAL_API_OBJECT_TYPE: case JS_SPECIAL_API_OBJECT_TYPE:
case JS_STRING_ITERATOR_PROTOTYPE_TYPE:
case JS_ARRAY_ITERATOR_PROTOTYPE_TYPE:
return JSObject::kHeaderSize; return JSObject::kHeaderSize;
case JS_GENERATOR_OBJECT_TYPE: case JS_GENERATOR_OBJECT_TYPE:
return JSGeneratorObject::kHeaderSize; return JSGeneratorObject::kHeaderSize;
......
...@@ -248,32 +248,41 @@ VisitorId Map::GetVisitorId(Map map) { ...@@ -248,32 +248,41 @@ VisitorId Map::GetVisitorId(Map map) {
case COVERAGE_INFO_TYPE: case COVERAGE_INFO_TYPE:
return kVisitCoverageInfo; return kVisitCoverageInfo;
case JS_OBJECT_TYPE:
case JS_ERROR_TYPE:
case JS_ARGUMENTS_OBJECT_TYPE: case JS_ARGUMENTS_OBJECT_TYPE:
case JS_ARRAY_ITERATOR_PROTOTYPE_TYPE:
case JS_ARRAY_ITERATOR_TYPE:
case JS_ARRAY_TYPE:
case JS_ASYNC_FROM_SYNC_ITERATOR_TYPE: case JS_ASYNC_FROM_SYNC_ITERATOR_TYPE:
case JS_CONTEXT_EXTENSION_OBJECT_TYPE:
case JS_GENERATOR_OBJECT_TYPE:
case JS_ASYNC_FUNCTION_OBJECT_TYPE: case JS_ASYNC_FUNCTION_OBJECT_TYPE:
case JS_ASYNC_GENERATOR_OBJECT_TYPE: case JS_ASYNC_GENERATOR_OBJECT_TYPE:
case JS_MODULE_NAMESPACE_TYPE: case JS_CONTEXT_EXTENSION_OBJECT_TYPE:
case JS_PRIMITIVE_WRAPPER_TYPE:
case JS_DATE_TYPE: case JS_DATE_TYPE:
case JS_ARRAY_ITERATOR_TYPE: case JS_ERROR_TYPE:
case JS_ARRAY_TYPE: case JS_FINALIZATION_REGISTRY_TYPE:
case JS_MESSAGE_OBJECT_TYPE: case JS_GENERATOR_OBJECT_TYPE:
case JS_SET_TYPE: case JS_ITERATOR_PROTOTYPE_TYPE:
case JS_MAP_TYPE: case JS_MAP_ITERATOR_PROTOTYPE_TYPE:
case JS_SET_KEY_VALUE_ITERATOR_TYPE:
case JS_SET_VALUE_ITERATOR_TYPE:
case JS_MAP_KEY_ITERATOR_TYPE: case JS_MAP_KEY_ITERATOR_TYPE:
case JS_MAP_KEY_VALUE_ITERATOR_TYPE: case JS_MAP_KEY_VALUE_ITERATOR_TYPE:
case JS_MAP_TYPE:
case JS_MAP_VALUE_ITERATOR_TYPE: case JS_MAP_VALUE_ITERATOR_TYPE:
case JS_STRING_ITERATOR_TYPE: case JS_MESSAGE_OBJECT_TYPE:
case JS_MODULE_NAMESPACE_TYPE:
case JS_OBJECT_PROTOTYPE_TYPE:
case JS_OBJECT_TYPE:
case JS_PRIMITIVE_WRAPPER_TYPE:
case JS_PROMISE_PROTOTYPE_TYPE:
case JS_PROMISE_TYPE: case JS_PROMISE_TYPE:
case JS_REG_EXP_TYPE: case JS_REG_EXP_PROTOTYPE_TYPE:
case JS_REG_EXP_STRING_ITERATOR_TYPE: case JS_REG_EXP_STRING_ITERATOR_TYPE:
case JS_FINALIZATION_REGISTRY_TYPE: case JS_REG_EXP_TYPE:
case JS_SET_ITERATOR_PROTOTYPE_TYPE:
case JS_SET_KEY_VALUE_ITERATOR_TYPE:
case JS_SET_PROTOTYPE_TYPE:
case JS_SET_TYPE:
case JS_SET_VALUE_ITERATOR_TYPE:
case JS_STRING_ITERATOR_PROTOTYPE_TYPE:
case JS_STRING_ITERATOR_TYPE:
#ifdef V8_INTL_SUPPORT #ifdef V8_INTL_SUPPORT
case JS_V8_BREAK_ITERATOR_TYPE: case JS_V8_BREAK_ITERATOR_TYPE:
case JS_COLLATOR_TYPE: case JS_COLLATOR_TYPE:
......
...@@ -274,7 +274,17 @@ class ZoneForwardList; ...@@ -274,7 +274,17 @@ class ZoneForwardList;
V(ModuleContext) \ V(ModuleContext) \
V(NonNullForeign) \ V(NonNullForeign) \
V(ScriptContext) \ V(ScriptContext) \
V(WithContext) V(WithContext) \
V(JSPrototype) \
V(JSObjectPrototype) \
V(JSRegExpPrototype) \
V(JSPromisePrototype) \
V(JSSetPrototype) \
V(JSIteratorPrototype) \
V(JSArrayIteratorPrototype) \
V(JSMapIteratorPrototype) \
V(JSSetIteratorPrototype) \
V(JSStringIteratorPrototype)
#define HEAP_OBJECT_TYPE_LIST(V) \ #define HEAP_OBJECT_TYPE_LIST(V) \
HEAP_OBJECT_ORDINARY_TYPE_LIST(V) \ HEAP_OBJECT_ORDINARY_TYPE_LIST(V) \
......
...@@ -935,37 +935,46 @@ ReturnType BodyDescriptorApply(InstanceType type, T1 p1, T2 p2, T3 p3, T4 p4) { ...@@ -935,37 +935,46 @@ ReturnType BodyDescriptorApply(InstanceType type, T1 p1, T2 p2, T3 p3, T4 p4) {
return Op::template apply<WasmStruct::BodyDescriptor>(p1, p2, p3, p4); return Op::template apply<WasmStruct::BodyDescriptor>(p1, p2, p3, p4);
case WASM_TYPE_INFO_TYPE: case WASM_TYPE_INFO_TYPE:
return Op::template apply<WasmTypeInfo::BodyDescriptor>(p1, p2, p3, p4); return Op::template apply<WasmTypeInfo::BodyDescriptor>(p1, p2, p3, p4);
case JS_OBJECT_TYPE: case JS_API_OBJECT_TYPE:
case JS_ERROR_TYPE:
case JS_ARGUMENTS_OBJECT_TYPE: case JS_ARGUMENTS_OBJECT_TYPE:
case JS_ARRAY_ITERATOR_PROTOTYPE_TYPE:
case JS_ARRAY_ITERATOR_TYPE:
case JS_ARRAY_TYPE:
case JS_ASYNC_FROM_SYNC_ITERATOR_TYPE: case JS_ASYNC_FROM_SYNC_ITERATOR_TYPE:
case JS_PROMISE_TYPE:
case JS_CONTEXT_EXTENSION_OBJECT_TYPE:
case JS_GENERATOR_OBJECT_TYPE:
case JS_ASYNC_FUNCTION_OBJECT_TYPE: case JS_ASYNC_FUNCTION_OBJECT_TYPE:
case JS_ASYNC_GENERATOR_OBJECT_TYPE: case JS_ASYNC_GENERATOR_OBJECT_TYPE:
case JS_PRIMITIVE_WRAPPER_TYPE: case JS_BOUND_FUNCTION_TYPE:
case JS_CONTEXT_EXTENSION_OBJECT_TYPE:
case JS_DATE_TYPE: case JS_DATE_TYPE:
case JS_ARRAY_TYPE: case JS_ERROR_TYPE:
case JS_ARRAY_ITERATOR_TYPE: case JS_FINALIZATION_REGISTRY_TYPE:
case JS_MODULE_NAMESPACE_TYPE: case JS_GENERATOR_OBJECT_TYPE:
case JS_SET_TYPE: case JS_GLOBAL_OBJECT_TYPE:
case JS_MAP_TYPE: case JS_GLOBAL_PROXY_TYPE:
case JS_SET_KEY_VALUE_ITERATOR_TYPE: case JS_ITERATOR_PROTOTYPE_TYPE:
case JS_SET_VALUE_ITERATOR_TYPE: case JS_MAP_ITERATOR_PROTOTYPE_TYPE:
case JS_MAP_KEY_ITERATOR_TYPE: case JS_MAP_KEY_ITERATOR_TYPE:
case JS_MAP_KEY_VALUE_ITERATOR_TYPE: case JS_MAP_KEY_VALUE_ITERATOR_TYPE:
case JS_MAP_TYPE:
case JS_MAP_VALUE_ITERATOR_TYPE: case JS_MAP_VALUE_ITERATOR_TYPE:
case JS_STRING_ITERATOR_TYPE: case JS_MESSAGE_OBJECT_TYPE:
case JS_MODULE_NAMESPACE_TYPE:
case JS_OBJECT_PROTOTYPE_TYPE:
case JS_OBJECT_TYPE:
case JS_PRIMITIVE_WRAPPER_TYPE:
case JS_PROMISE_PROTOTYPE_TYPE:
case JS_PROMISE_TYPE:
case JS_REG_EXP_PROTOTYPE_TYPE:
case JS_REG_EXP_STRING_ITERATOR_TYPE: case JS_REG_EXP_STRING_ITERATOR_TYPE:
case JS_REG_EXP_TYPE: case JS_REG_EXP_TYPE:
case JS_GLOBAL_PROXY_TYPE: case JS_SET_ITERATOR_PROTOTYPE_TYPE:
case JS_GLOBAL_OBJECT_TYPE: case JS_SET_KEY_VALUE_ITERATOR_TYPE:
case JS_API_OBJECT_TYPE: case JS_SET_PROTOTYPE_TYPE:
case JS_SET_TYPE:
case JS_SET_VALUE_ITERATOR_TYPE:
case JS_SPECIAL_API_OBJECT_TYPE: case JS_SPECIAL_API_OBJECT_TYPE:
case JS_MESSAGE_OBJECT_TYPE: case JS_STRING_ITERATOR_PROTOTYPE_TYPE:
case JS_BOUND_FUNCTION_TYPE: case JS_STRING_ITERATOR_TYPE:
case JS_FINALIZATION_REGISTRY_TYPE:
#ifdef V8_INTL_SUPPORT #ifdef V8_INTL_SUPPORT
case JS_V8_BREAK_ITERATOR_TYPE: case JS_V8_BREAK_ITERATOR_TYPE:
case JS_COLLATOR_TYPE: case JS_COLLATOR_TYPE:
......
...@@ -530,7 +530,16 @@ Maybe<bool> ValueSerializer::WriteJSReceiver(Handle<JSReceiver> receiver) { ...@@ -530,7 +530,16 @@ Maybe<bool> ValueSerializer::WriteJSReceiver(Handle<JSReceiver> receiver) {
switch (instance_type) { switch (instance_type) {
case JS_ARRAY_TYPE: case JS_ARRAY_TYPE:
return WriteJSArray(Handle<JSArray>::cast(receiver)); return WriteJSArray(Handle<JSArray>::cast(receiver));
case JS_ARRAY_ITERATOR_PROTOTYPE_TYPE:
case JS_ITERATOR_PROTOTYPE_TYPE:
case JS_MAP_ITERATOR_PROTOTYPE_TYPE:
case JS_OBJECT_PROTOTYPE_TYPE:
case JS_OBJECT_TYPE: case JS_OBJECT_TYPE:
case JS_PROMISE_PROTOTYPE_TYPE:
case JS_REG_EXP_PROTOTYPE_TYPE:
case JS_SET_ITERATOR_PROTOTYPE_TYPE:
case JS_SET_PROTOTYPE_TYPE:
case JS_STRING_ITERATOR_PROTOTYPE_TYPE:
case JS_API_OBJECT_TYPE: { case JS_API_OBJECT_TYPE: {
Handle<JSObject> js_object = Handle<JSObject>::cast(receiver); Handle<JSObject> js_object = Handle<JSObject>::cast(receiver);
if (JSObject::GetEmbedderFieldCount(js_object->map())) { if (JSObject::GetEmbedderFieldCount(js_object->map())) {
......
...@@ -153,56 +153,65 @@ INSTANCE_TYPES = { ...@@ -153,56 +153,65 @@ INSTANCE_TYPES = {
188: "JS_MODULE_NAMESPACE_TYPE", 188: "JS_MODULE_NAMESPACE_TYPE",
1040: "JS_SPECIAL_API_OBJECT_TYPE", 1040: "JS_SPECIAL_API_OBJECT_TYPE",
1041: "JS_PRIMITIVE_WRAPPER_TYPE", 1041: "JS_PRIMITIVE_WRAPPER_TYPE",
1042: "JS_MAP_KEY_ITERATOR_TYPE", 1042: "JS_ARRAY_ITERATOR_PROTOTYPE_TYPE",
1043: "JS_MAP_KEY_VALUE_ITERATOR_TYPE", 1043: "JS_ITERATOR_PROTOTYPE_TYPE",
1044: "JS_MAP_VALUE_ITERATOR_TYPE", 1044: "JS_MAP_ITERATOR_PROTOTYPE_TYPE",
1045: "JS_SET_KEY_VALUE_ITERATOR_TYPE", 1045: "JS_OBJECT_PROTOTYPE_TYPE",
1046: "JS_SET_VALUE_ITERATOR_TYPE", 1046: "JS_PROMISE_PROTOTYPE_TYPE",
1047: "JS_GENERATOR_OBJECT_TYPE", 1047: "JS_REG_EXP_PROTOTYPE_TYPE",
1048: "JS_ASYNC_FUNCTION_OBJECT_TYPE", 1048: "JS_SET_ITERATOR_PROTOTYPE_TYPE",
1049: "JS_ASYNC_GENERATOR_OBJECT_TYPE", 1049: "JS_SET_PROTOTYPE_TYPE",
1050: "JS_DATA_VIEW_TYPE", 1050: "JS_STRING_ITERATOR_PROTOTYPE_TYPE",
1051: "JS_TYPED_ARRAY_TYPE", 1051: "JS_MAP_KEY_ITERATOR_TYPE",
1052: "JS_MAP_TYPE", 1052: "JS_MAP_KEY_VALUE_ITERATOR_TYPE",
1053: "JS_SET_TYPE", 1053: "JS_MAP_VALUE_ITERATOR_TYPE",
1054: "JS_WEAK_MAP_TYPE", 1054: "JS_SET_KEY_VALUE_ITERATOR_TYPE",
1055: "JS_WEAK_SET_TYPE", 1055: "JS_SET_VALUE_ITERATOR_TYPE",
1056: "JS_API_OBJECT_TYPE", 1056: "JS_API_OBJECT_TYPE",
1058: "JS_ARGUMENTS_OBJECT_TYPE", 1058: "JS_GENERATOR_OBJECT_TYPE",
1059: "JS_ARRAY_TYPE", 1059: "JS_ASYNC_FUNCTION_OBJECT_TYPE",
1060: "JS_ARRAY_BUFFER_TYPE", 1060: "JS_ASYNC_GENERATOR_OBJECT_TYPE",
1061: "JS_ARRAY_ITERATOR_TYPE", 1061: "JS_DATA_VIEW_TYPE",
1062: "JS_ASYNC_FROM_SYNC_ITERATOR_TYPE", 1062: "JS_TYPED_ARRAY_TYPE",
1063: "JS_COLLATOR_TYPE", 1063: "JS_MAP_TYPE",
1064: "JS_CONTEXT_EXTENSION_OBJECT_TYPE", 1064: "JS_SET_TYPE",
1065: "JS_DATE_TYPE", 1065: "JS_WEAK_MAP_TYPE",
1066: "JS_DATE_TIME_FORMAT_TYPE", 1066: "JS_WEAK_SET_TYPE",
1067: "JS_DISPLAY_NAMES_TYPE", 1067: "JS_ARGUMENTS_OBJECT_TYPE",
1068: "JS_ERROR_TYPE", 1068: "JS_ARRAY_TYPE",
1069: "JS_FINALIZATION_REGISTRY_TYPE", 1069: "JS_ARRAY_BUFFER_TYPE",
1070: "JS_LIST_FORMAT_TYPE", 1070: "JS_ARRAY_ITERATOR_TYPE",
1071: "JS_LOCALE_TYPE", 1071: "JS_ASYNC_FROM_SYNC_ITERATOR_TYPE",
1072: "JS_MESSAGE_OBJECT_TYPE", 1072: "JS_COLLATOR_TYPE",
1073: "JS_NUMBER_FORMAT_TYPE", 1073: "JS_CONTEXT_EXTENSION_OBJECT_TYPE",
1074: "JS_PLURAL_RULES_TYPE", 1074: "JS_DATE_TYPE",
1075: "JS_PROMISE_TYPE", 1075: "JS_DATE_TIME_FORMAT_TYPE",
1076: "JS_REG_EXP_TYPE", 1076: "JS_DISPLAY_NAMES_TYPE",
1077: "JS_REG_EXP_STRING_ITERATOR_TYPE", 1077: "JS_ERROR_TYPE",
1078: "JS_RELATIVE_TIME_FORMAT_TYPE", 1078: "JS_FINALIZATION_REGISTRY_TYPE",
1079: "JS_SEGMENT_ITERATOR_TYPE", 1079: "JS_LIST_FORMAT_TYPE",
1080: "JS_SEGMENTER_TYPE", 1080: "JS_LOCALE_TYPE",
1081: "JS_SEGMENTS_TYPE", 1081: "JS_MESSAGE_OBJECT_TYPE",
1082: "JS_STRING_ITERATOR_TYPE", 1082: "JS_NUMBER_FORMAT_TYPE",
1083: "JS_V8_BREAK_ITERATOR_TYPE", 1083: "JS_PLURAL_RULES_TYPE",
1084: "JS_WEAK_REF_TYPE", 1084: "JS_PROMISE_TYPE",
1085: "WASM_EXCEPTION_OBJECT_TYPE", 1085: "JS_REG_EXP_TYPE",
1086: "WASM_GLOBAL_OBJECT_TYPE", 1086: "JS_REG_EXP_STRING_ITERATOR_TYPE",
1087: "WASM_INSTANCE_OBJECT_TYPE", 1087: "JS_RELATIVE_TIME_FORMAT_TYPE",
1088: "WASM_MEMORY_OBJECT_TYPE", 1088: "JS_SEGMENT_ITERATOR_TYPE",
1089: "WASM_MODULE_OBJECT_TYPE", 1089: "JS_SEGMENTER_TYPE",
1090: "WASM_TABLE_OBJECT_TYPE", 1090: "JS_SEGMENTS_TYPE",
1091: "JS_BOUND_FUNCTION_TYPE", 1091: "JS_STRING_ITERATOR_TYPE",
1092: "JS_FUNCTION_TYPE", 1092: "JS_V8_BREAK_ITERATOR_TYPE",
1093: "JS_WEAK_REF_TYPE",
1094: "WASM_EXCEPTION_OBJECT_TYPE",
1095: "WASM_GLOBAL_OBJECT_TYPE",
1096: "WASM_INSTANCE_OBJECT_TYPE",
1097: "WASM_MEMORY_OBJECT_TYPE",
1098: "WASM_MODULE_OBJECT_TYPE",
1099: "WASM_TABLE_OBJECT_TYPE",
1100: "JS_BOUND_FUNCTION_TYPE",
1101: "JS_FUNCTION_TYPE",
} }
# List of known V8 maps. # List of known V8 maps.
...@@ -360,7 +369,7 @@ KNOWN_MAPS = { ...@@ -360,7 +369,7 @@ KNOWN_MAPS = {
("read_only_space", 0x05d2d): (78, "StoreHandler2Map"), ("read_only_space", 0x05d2d): (78, "StoreHandler2Map"),
("read_only_space", 0x05d55): (78, "StoreHandler3Map"), ("read_only_space", 0x05d55): (78, "StoreHandler3Map"),
("map_space", 0x02115): (1057, "ExternalMap"), ("map_space", 0x02115): (1057, "ExternalMap"),
("map_space", 0x0213d): (1072, "JSMessageObjectMap"), ("map_space", 0x0213d): (1081, "JSMessageObjectMap"),
("map_space", 0x02165): (182, "WasmRttEqrefMap"), ("map_space", 0x02165): (182, "WasmRttEqrefMap"),
("map_space", 0x0218d): (182, "WasmRttAnyrefMap"), ("map_space", 0x0218d): (182, "WasmRttAnyrefMap"),
("map_space", 0x021b5): (182, "WasmRttExternrefMap"), ("map_space", 0x021b5): (182, "WasmRttExternrefMap"),
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment