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

Side by Side Diff: src/objects.cc

Issue 1609233002: Do not eagerly instantiate accessors' JSFunction. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Update. Created 4 years, 11 months 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
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 <sstream> 9 #include <sstream>
10 10
11 #include "src/accessors.h" 11 #include "src/accessors.h"
12 #include "src/allocation-site-scopes.h" 12 #include "src/allocation-site-scopes.h"
13 #include "src/api.h" 13 #include "src/api.h"
14 #include "src/api-natives.h"
14 #include "src/arguments.h" 15 #include "src/arguments.h"
15 #include "src/base/bits.h" 16 #include "src/base/bits.h"
16 #include "src/base/utils/random-number-generator.h" 17 #include "src/base/utils/random-number-generator.h"
17 #include "src/bootstrapper.h" 18 #include "src/bootstrapper.h"
18 #include "src/code-stubs.h" 19 #include "src/code-stubs.h"
19 #include "src/codegen.h" 20 #include "src/codegen.h"
20 #include "src/compilation-dependencies.h" 21 #include "src/compilation-dependencies.h"
21 #include "src/compiler.h" 22 #include "src/compiler.h"
22 #include "src/date.h" 23 #include "src/date.h"
23 #include "src/debug/debug.h" 24 #include "src/debug/debug.h"
(...skipping 1142 matching lines...) Expand 10 before | Expand all | Expand 10 after
1166 return ReadAbsentProperty(isolate, receiver, name, language_mode); 1167 return ReadAbsentProperty(isolate, receiver, name, language_mode);
1167 } 1168 }
1168 Handle<Object> return_value = v8::Utils::OpenHandle(*result); 1169 Handle<Object> return_value = v8::Utils::OpenHandle(*result);
1169 return_value->VerifyApiCallResultType(); 1170 return_value->VerifyApiCallResultType();
1170 // Rebox handle before return. 1171 // Rebox handle before return.
1171 return handle(*return_value, isolate); 1172 return handle(*return_value, isolate);
1172 } 1173 }
1173 1174
1174 // Regular accessor. 1175 // Regular accessor.
1175 Handle<Object> getter(AccessorPair::cast(*structure)->getter(), isolate); 1176 Handle<Object> getter(AccessorPair::cast(*structure)->getter(), isolate);
1176 if (getter->IsCallable()) { 1177 if (getter->IsFunctionTemplateInfo()) {
1178 auto result = Builtins::InvokeApiFunction(
1179 Handle<FunctionTemplateInfo>::cast(getter), receiver, 0, nullptr);
1180 if (isolate->has_pending_exception()) {
1181 return MaybeHandle<Object>();
1182 }
1183 Handle<Object> return_value;
1184 if (result.ToHandle(&return_value)) {
1185 return_value->VerifyApiCallResultType();
1186 return handle(*return_value, isolate);
1187 }
1188 } else if (getter->IsCallable()) {
1177 // TODO(rossberg): nicer would be to cast to some JSCallable here... 1189 // TODO(rossberg): nicer would be to cast to some JSCallable here...
1178 return Object::GetPropertyWithDefinedGetter( 1190 return Object::GetPropertyWithDefinedGetter(
1179 receiver, Handle<JSReceiver>::cast(getter)); 1191 receiver, Handle<JSReceiver>::cast(getter));
1180 } 1192 }
1181 // Getter is not a function. 1193 // Getter is not a function.
1182 return ReadAbsentProperty(isolate, receiver, it->GetName(), language_mode); 1194 return ReadAbsentProperty(isolate, receiver, it->GetName(), language_mode);
1183 } 1195 }
1184 1196
1185 1197
1186 bool AccessorInfo::IsCompatibleReceiverMap(Isolate* isolate, 1198 bool AccessorInfo::IsCompatibleReceiverMap(Isolate* isolate,
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1225 1237
1226 LOG(isolate, ApiNamedPropertyAccess("store", *holder, *name)); 1238 LOG(isolate, ApiNamedPropertyAccess("store", *holder, *name));
1227 PropertyCallbackArguments args(isolate, info->data(), *receiver, *holder); 1239 PropertyCallbackArguments args(isolate, info->data(), *receiver, *holder);
1228 args.Call(call_fun, v8::Utils::ToLocal(name), v8::Utils::ToLocal(value)); 1240 args.Call(call_fun, v8::Utils::ToLocal(name), v8::Utils::ToLocal(value));
1229 RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate, Nothing<bool>()); 1241 RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate, Nothing<bool>());
1230 return Just(true); 1242 return Just(true);
1231 } 1243 }
1232 1244
1233 // Regular accessor. 1245 // Regular accessor.
1234 Handle<Object> setter(AccessorPair::cast(*structure)->setter(), isolate); 1246 Handle<Object> setter(AccessorPair::cast(*structure)->setter(), isolate);
1235 if (setter->IsCallable()) { 1247 if (setter->IsFunctionTemplateInfo()) {
1248 Handle<Object> argv[] = {value};
1249 auto result =
1250 Builtins::InvokeApiFunction(Handle<FunctionTemplateInfo>::cast(setter),
1251 receiver, arraysize(argv), argv);
1252 if (isolate->has_pending_exception()) {
1253 return Nothing<bool>();
1254 }
1255 return Just(true);
1256 } else if (setter->IsCallable()) {
1236 // TODO(rossberg): nicer would be to cast to some JSCallable here... 1257 // TODO(rossberg): nicer would be to cast to some JSCallable here...
1237 return SetPropertyWithDefinedSetter( 1258 return SetPropertyWithDefinedSetter(
1238 receiver, Handle<JSReceiver>::cast(setter), value, should_throw); 1259 receiver, Handle<JSReceiver>::cast(setter), value, should_throw);
1239 } 1260 }
1240 1261
1241 RETURN_FAILURE(isolate, should_throw, 1262 RETURN_FAILURE(isolate, should_throw,
1242 NewTypeError(MessageTemplate::kNoSetterInCallback, 1263 NewTypeError(MessageTemplate::kNoSetterInCallback,
1243 it->GetName(), it->GetHolder<JSObject>())); 1264 it->GetName(), it->GetHolder<JSObject>()));
1244 } 1265 }
1245 1266
(...skipping 7692 matching lines...) Expand 10 before | Expand all | Expand 10 after
8938 bool preexists = false; 8959 bool preexists = false;
8939 if (is_observed) { 8960 if (is_observed) {
8940 CHECK(GetPropertyAttributes(it).IsJust()); 8961 CHECK(GetPropertyAttributes(it).IsJust());
8941 preexists = it->IsFound(); 8962 preexists = it->IsFound();
8942 if (preexists && (it->state() == LookupIterator::DATA || 8963 if (preexists && (it->state() == LookupIterator::DATA ||
8943 it->GetAccessors()->IsAccessorInfo())) { 8964 it->GetAccessors()->IsAccessorInfo())) {
8944 old_value = GetProperty(it).ToHandleChecked(); 8965 old_value = GetProperty(it).ToHandleChecked();
8945 } 8966 }
8946 } 8967 }
8947 8968
8948 DCHECK(getter->IsCallable() || getter->IsUndefined() || getter->IsNull()); 8969 DCHECK(getter->IsCallable() || getter->IsUndefined() || getter->IsNull() ||
8949 DCHECK(setter->IsCallable() || setter->IsUndefined() || setter->IsNull()); 8970 getter->IsFunctionTemplateInfo());
8971 DCHECK(setter->IsCallable() || setter->IsUndefined() || setter->IsNull() ||
8972 getter->IsFunctionTemplateInfo());
8950 // At least one of the accessors needs to be a new value. 8973 // At least one of the accessors needs to be a new value.
8951 DCHECK(!getter->IsNull() || !setter->IsNull()); 8974 DCHECK(!getter->IsNull() || !setter->IsNull());
8952 if (!getter->IsNull()) { 8975 if (!getter->IsNull()) {
8953 it->TransitionToAccessorProperty(ACCESSOR_GETTER, getter, attributes); 8976 it->TransitionToAccessorProperty(ACCESSOR_GETTER, getter, attributes);
8954 } 8977 }
8955 if (!setter->IsNull()) { 8978 if (!setter->IsNull()) {
8956 it->TransitionToAccessorProperty(ACCESSOR_SETTER, setter, attributes); 8979 it->TransitionToAccessorProperty(ACCESSOR_SETTER, setter, attributes);
8957 } 8980 }
8958 8981
8959 if (is_observed) { 8982 if (is_observed) {
(...skipping 1891 matching lines...) Expand 10 before | Expand all | Expand 10 after
10851 Handle<AccessorPair> AccessorPair::Copy(Handle<AccessorPair> pair) { 10874 Handle<AccessorPair> AccessorPair::Copy(Handle<AccessorPair> pair) {
10852 Handle<AccessorPair> copy = pair->GetIsolate()->factory()->NewAccessorPair(); 10875 Handle<AccessorPair> copy = pair->GetIsolate()->factory()->NewAccessorPair();
10853 copy->set_getter(pair->getter()); 10876 copy->set_getter(pair->getter());
10854 copy->set_setter(pair->setter()); 10877 copy->set_setter(pair->setter());
10855 return copy; 10878 return copy;
10856 } 10879 }
10857 10880
10858 10881
10859 Object* AccessorPair::GetComponent(AccessorComponent component) { 10882 Object* AccessorPair::GetComponent(AccessorComponent component) {
10860 Object* accessor = get(component); 10883 Object* accessor = get(component);
10884 if (accessor->IsFunctionTemplateInfo()) {
10885 auto function = i::ApiNatives::InstantiateFunction(
10886 handle(FunctionTemplateInfo::cast(accessor)));
10887 set(component, *function.ToHandleChecked());
10888 accessor = get(component);
10889 }
10861 return accessor->IsTheHole() ? GetHeap()->undefined_value() : accessor; 10890 return accessor->IsTheHole() ? GetHeap()->undefined_value() : accessor;
10862 } 10891 }
10863 10892
10864 10893
10865 Handle<DeoptimizationInputData> DeoptimizationInputData::New( 10894 Handle<DeoptimizationInputData> DeoptimizationInputData::New(
10866 Isolate* isolate, int deopt_entry_count, PretenureFlag pretenure) { 10895 Isolate* isolate, int deopt_entry_count, PretenureFlag pretenure) {
10867 return Handle<DeoptimizationInputData>::cast( 10896 return Handle<DeoptimizationInputData>::cast(
10868 isolate->factory()->NewFixedArray(LengthFor(deopt_entry_count), 10897 isolate->factory()->NewFixedArray(LengthFor(deopt_entry_count),
10869 pretenure)); 10898 pretenure));
10870 } 10899 }
(...skipping 8871 matching lines...) Expand 10 before | Expand all | Expand 10 after
19742 if (cell->value() != *new_value) { 19771 if (cell->value() != *new_value) {
19743 cell->set_value(*new_value); 19772 cell->set_value(*new_value);
19744 Isolate* isolate = cell->GetIsolate(); 19773 Isolate* isolate = cell->GetIsolate();
19745 cell->dependent_code()->DeoptimizeDependentCodeGroup( 19774 cell->dependent_code()->DeoptimizeDependentCodeGroup(
19746 isolate, DependentCode::kPropertyCellChangedGroup); 19775 isolate, DependentCode::kPropertyCellChangedGroup);
19747 } 19776 }
19748 } 19777 }
19749 19778
19750 } // namespace internal 19779 } // namespace internal
19751 } // namespace v8 19780 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698