Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(17)

Side by Side Diff: src/objects.cc

Issue 2466553002: [ic] Simplify handling of primitive maps. (Closed)
Patch Set: Now with enabled data-drived ICs Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/objects.h ('k') | src/prototype.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/objects.h" 5 #include "src/objects.h"
6 6
7 #include <cmath> 7 #include <cmath>
8 #include <iomanip> 8 #include <iomanip>
9 #include <memory> 9 #include <memory>
10 #include <sstream> 10 #include <sstream>
(...skipping 1907 matching lines...) Expand 10 before | Expand all | Expand 10 after
1918 PrototypeIterator iter(isolate, object, kStartAtReceiver); 1918 PrototypeIterator iter(isolate, object, kStartAtReceiver);
1919 while (true) { 1919 while (true) {
1920 if (!iter.AdvanceFollowingProxies()) return Nothing<bool>(); 1920 if (!iter.AdvanceFollowingProxies()) return Nothing<bool>();
1921 if (iter.IsAtEnd()) return Just(false); 1921 if (iter.IsAtEnd()) return Just(false);
1922 if (PrototypeIterator::GetCurrent(iter).is_identical_to(proto)) { 1922 if (PrototypeIterator::GetCurrent(iter).is_identical_to(proto)) {
1923 return Just(true); 1923 return Just(true);
1924 } 1924 }
1925 } 1925 }
1926 } 1926 }
1927 1927
1928 Map* Object::GetRootMap(Isolate* isolate) { 1928 Map* Object::GetPrototypeChainRootMap(Isolate* isolate) {
1929 DisallowHeapAllocation no_alloc; 1929 DisallowHeapAllocation no_alloc;
1930 if (IsSmi()) { 1930 if (IsSmi()) {
1931 Context* native_context = isolate->context()->native_context(); 1931 Context* native_context = isolate->context()->native_context();
1932 return native_context->number_function()->initial_map(); 1932 return native_context->number_function()->initial_map();
1933 } 1933 }
1934 1934
1935 // The object is either a number, a string, a symbol, a boolean, a SIMD value, 1935 // The object is either a number, a string, a symbol, a boolean, a SIMD value,
1936 // a real JS object, or a Harmony proxy. 1936 // a real JS object, or a Harmony proxy.
1937 HeapObject* heap_object = HeapObject::cast(this); 1937 HeapObject* heap_object = HeapObject::cast(this);
1938 if (heap_object->IsJSReceiver()) { 1938 return heap_object->map()->GetPrototypeChainRootMap(isolate);
1939 return heap_object->map(); 1939 }
1940
1941 Map* Map::GetPrototypeChainRootMap(Isolate* isolate) {
1942 DisallowHeapAllocation no_alloc;
1943 if (IsJSReceiverMap()) {
1944 return this;
1940 } 1945 }
1941 int constructor_function_index = 1946 int constructor_function_index = GetConstructorFunctionIndex();
1942 heap_object->map()->GetConstructorFunctionIndex();
1943 if (constructor_function_index != Map::kNoConstructorFunctionIndex) { 1947 if (constructor_function_index != Map::kNoConstructorFunctionIndex) {
1944 Context* native_context = isolate->context()->native_context(); 1948 Context* native_context = isolate->context()->native_context();
1945 JSFunction* constructor_function = 1949 JSFunction* constructor_function =
1946 JSFunction::cast(native_context->get(constructor_function_index)); 1950 JSFunction::cast(native_context->get(constructor_function_index));
1947 return constructor_function->initial_map(); 1951 return constructor_function->initial_map();
1948 } 1952 }
1949 return isolate->heap()->null_value()->map(); 1953 return isolate->heap()->null_value()->map();
1950 } 1954 }
1951 1955
1952 namespace { 1956 namespace {
(...skipping 10768 matching lines...) Expand 10 before | Expand all | Expand 10 after
12721 if (value == false && !map->prototype_info()->IsPrototypeInfo()) { 12725 if (value == false && !map->prototype_info()->IsPrototypeInfo()) {
12722 // "False" is the implicit default value, so there's nothing to do. 12726 // "False" is the implicit default value, so there's nothing to do.
12723 return; 12727 return;
12724 } 12728 }
12725 GetOrCreatePrototypeInfo(map, isolate)->set_should_be_fast_map(value); 12729 GetOrCreatePrototypeInfo(map, isolate)->set_should_be_fast_map(value);
12726 } 12730 }
12727 12731
12728 // static 12732 // static
12729 Handle<Cell> Map::GetOrCreatePrototypeChainValidityCell(Handle<Map> map, 12733 Handle<Cell> Map::GetOrCreatePrototypeChainValidityCell(Handle<Map> map,
12730 Isolate* isolate) { 12734 Isolate* isolate) {
12731 Handle<Object> maybe_prototype(map->prototype(), isolate); 12735 Handle<Object> maybe_prototype(
12736 map->GetPrototypeChainRootMap(isolate)->prototype(), isolate);
12732 if (!maybe_prototype->IsJSObject()) return Handle<Cell>::null(); 12737 if (!maybe_prototype->IsJSObject()) return Handle<Cell>::null();
12733 Handle<JSObject> prototype = Handle<JSObject>::cast(maybe_prototype); 12738 Handle<JSObject> prototype = Handle<JSObject>::cast(maybe_prototype);
12734 // Ensure the prototype is registered with its own prototypes so its cell 12739 // Ensure the prototype is registered with its own prototypes so its cell
12735 // will be invalidated when necessary. 12740 // will be invalidated when necessary.
12736 JSObject::LazyRegisterPrototypeUser(handle(prototype->map(), isolate), 12741 JSObject::LazyRegisterPrototypeUser(handle(prototype->map(), isolate),
12737 isolate); 12742 isolate);
12738 Handle<PrototypeInfo> proto_info = 12743 Handle<PrototypeInfo> proto_info =
12739 GetOrCreatePrototypeInfo(prototype, isolate); 12744 GetOrCreatePrototypeInfo(prototype, isolate);
12740 Object* maybe_cell = proto_info->validity_cell(); 12745 Object* maybe_cell = proto_info->validity_cell();
12741 // Return existing cell if it's still valid. 12746 // Return existing cell if it's still valid.
(...skipping 7514 matching lines...) Expand 10 before | Expand all | Expand 10 after
20256 ns, Accessors::ModuleNamespaceEntryInfo(isolate, name, attr)) 20261 ns, Accessors::ModuleNamespaceEntryInfo(isolate, name, attr))
20257 .Check(); 20262 .Check();
20258 } 20263 }
20259 JSObject::PreventExtensions(ns, THROW_ON_ERROR).ToChecked(); 20264 JSObject::PreventExtensions(ns, THROW_ON_ERROR).ToChecked();
20260 20265
20261 return ns; 20266 return ns;
20262 } 20267 }
20263 20268
20264 } // namespace internal 20269 } // namespace internal
20265 } // namespace v8 20270 } // namespace v8
OLDNEW
« no previous file with comments | « src/objects.h ('k') | src/prototype.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698