Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1224 LOG(isolate, ApiNamedPropertyAccess("store", *holder, *name)); | 1236 LOG(isolate, ApiNamedPropertyAccess("store", *holder, *name)); |
| 1225 PropertyCallbackArguments args(isolate, info->data(), *receiver, *holder, | 1237 PropertyCallbackArguments args(isolate, info->data(), *receiver, *holder, |
| 1226 should_throw); | 1238 should_throw); |
| 1227 args.Call(call_fun, v8::Utils::ToLocal(name), v8::Utils::ToLocal(value)); | 1239 args.Call(call_fun, v8::Utils::ToLocal(name), v8::Utils::ToLocal(value)); |
| 1228 RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate, Nothing<bool>()); | 1240 RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate, Nothing<bool>()); |
| 1229 return Just(true); | 1241 return Just(true); |
| 1230 } | 1242 } |
| 1231 | 1243 |
| 1232 // Regular accessor. | 1244 // Regular accessor. |
| 1233 Handle<Object> setter(AccessorPair::cast(*structure)->setter(), isolate); | 1245 Handle<Object> setter(AccessorPair::cast(*structure)->setter(), isolate); |
| 1234 if (setter->IsCallable()) { | 1246 if (setter->IsFunctionTemplateInfo()) { |
| 1247 Handle<Object> argv[] = {value}; | |
| 1248 auto result = | |
| 1249 Builtins::InvokeApiFunction(Handle<FunctionTemplateInfo>::cast(setter), | |
| 1250 receiver, arraysize(argv), argv); | |
| 1251 if (isolate->has_pending_exception()) { | |
| 1252 return Nothing<bool>(); | |
| 1253 } | |
| 1254 return Just(true); | |
| 1255 } else if (setter->IsCallable()) { | |
| 1235 // TODO(rossberg): nicer would be to cast to some JSCallable here... | 1256 // TODO(rossberg): nicer would be to cast to some JSCallable here... |
| 1236 return SetPropertyWithDefinedSetter( | 1257 return SetPropertyWithDefinedSetter( |
| 1237 receiver, Handle<JSReceiver>::cast(setter), value, should_throw); | 1258 receiver, Handle<JSReceiver>::cast(setter), value, should_throw); |
| 1238 } | 1259 } |
| 1239 | 1260 |
| 1240 RETURN_FAILURE(isolate, should_throw, | 1261 RETURN_FAILURE(isolate, should_throw, |
| 1241 NewTypeError(MessageTemplate::kNoSetterInCallback, | 1262 NewTypeError(MessageTemplate::kNoSetterInCallback, |
| 1242 it->GetName(), it->GetHolder<JSObject>())); | 1263 it->GetName(), it->GetHolder<JSObject>())); |
| 1243 } | 1264 } |
| 1244 | 1265 |
| (...skipping 7747 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 8992 bool preexists = false; | 9013 bool preexists = false; |
| 8993 if (is_observed) { | 9014 if (is_observed) { |
| 8994 CHECK(GetPropertyAttributes(it).IsJust()); | 9015 CHECK(GetPropertyAttributes(it).IsJust()); |
| 8995 preexists = it->IsFound(); | 9016 preexists = it->IsFound(); |
| 8996 if (preexists && (it->state() == LookupIterator::DATA || | 9017 if (preexists && (it->state() == LookupIterator::DATA || |
| 8997 it->GetAccessors()->IsAccessorInfo())) { | 9018 it->GetAccessors()->IsAccessorInfo())) { |
| 8998 old_value = GetProperty(it).ToHandleChecked(); | 9019 old_value = GetProperty(it).ToHandleChecked(); |
| 8999 } | 9020 } |
| 9000 } | 9021 } |
| 9001 | 9022 |
| 9002 DCHECK(getter->IsCallable() || getter->IsUndefined() || getter->IsNull()); | 9023 DCHECK(getter->IsCallable() || getter->IsUndefined() || getter->IsNull() || |
| 9003 DCHECK(setter->IsCallable() || setter->IsUndefined() || setter->IsNull()); | 9024 getter->IsFunctionTemplateInfo()); |
| 9025 DCHECK(setter->IsCallable() || setter->IsUndefined() || setter->IsNull() || | |
| 9026 getter->IsFunctionTemplateInfo()); | |
| 9004 // At least one of the accessors needs to be a new value. | 9027 // At least one of the accessors needs to be a new value. |
| 9005 DCHECK(!getter->IsNull() || !setter->IsNull()); | 9028 DCHECK(!getter->IsNull() || !setter->IsNull()); |
| 9006 if (!getter->IsNull()) { | 9029 if (!getter->IsNull()) { |
| 9007 it->TransitionToAccessorProperty(ACCESSOR_GETTER, getter, attributes); | 9030 it->TransitionToAccessorProperty(ACCESSOR_GETTER, getter, attributes); |
| 9008 } | 9031 } |
| 9009 if (!setter->IsNull()) { | 9032 if (!setter->IsNull()) { |
| 9010 it->TransitionToAccessorProperty(ACCESSOR_SETTER, setter, attributes); | 9033 it->TransitionToAccessorProperty(ACCESSOR_SETTER, setter, attributes); |
| 9011 } | 9034 } |
| 9012 | 9035 |
| 9013 if (is_observed) { | 9036 if (is_observed) { |
| (...skipping 1891 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 10905 Handle<AccessorPair> AccessorPair::Copy(Handle<AccessorPair> pair) { | 10928 Handle<AccessorPair> AccessorPair::Copy(Handle<AccessorPair> pair) { |
| 10906 Handle<AccessorPair> copy = pair->GetIsolate()->factory()->NewAccessorPair(); | 10929 Handle<AccessorPair> copy = pair->GetIsolate()->factory()->NewAccessorPair(); |
| 10907 copy->set_getter(pair->getter()); | 10930 copy->set_getter(pair->getter()); |
| 10908 copy->set_setter(pair->setter()); | 10931 copy->set_setter(pair->setter()); |
| 10909 return copy; | 10932 return copy; |
| 10910 } | 10933 } |
| 10911 | 10934 |
| 10912 | 10935 |
| 10913 Object* AccessorPair::GetComponent(AccessorComponent component) { | 10936 Object* AccessorPair::GetComponent(AccessorComponent component) { |
| 10914 Object* accessor = get(component); | 10937 Object* accessor = get(component); |
| 10938 if (accessor->IsFunctionTemplateInfo()) { | |
| 10939 auto function = i::ApiNatives::InstantiateFunction( | |
| 10940 handle(FunctionTemplateInfo::cast(accessor))); | |
| 10941 set(component, *function.ToHandleChecked()); | |
|
Toon Verwaest
2016/01/28 12:05:19
If we'd like to share the accessorpair with Functi
epertoso
2016/02/01 16:18:03
I modified JSReceiver::GetOwnPropertyDescriptor an
| |
| 10942 accessor = get(component); | |
| 10943 } | |
| 10915 return accessor->IsTheHole() ? GetHeap()->undefined_value() : accessor; | 10944 return accessor->IsTheHole() ? GetHeap()->undefined_value() : accessor; |
| 10916 } | 10945 } |
| 10917 | 10946 |
| 10918 | 10947 |
| 10919 Handle<DeoptimizationInputData> DeoptimizationInputData::New( | 10948 Handle<DeoptimizationInputData> DeoptimizationInputData::New( |
| 10920 Isolate* isolate, int deopt_entry_count, PretenureFlag pretenure) { | 10949 Isolate* isolate, int deopt_entry_count, PretenureFlag pretenure) { |
| 10921 return Handle<DeoptimizationInputData>::cast( | 10950 return Handle<DeoptimizationInputData>::cast( |
| 10922 isolate->factory()->NewFixedArray(LengthFor(deopt_entry_count), | 10951 isolate->factory()->NewFixedArray(LengthFor(deopt_entry_count), |
| 10923 pretenure)); | 10952 pretenure)); |
| 10924 } | 10953 } |
| (...skipping 8824 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 19749 if (cell->value() != *new_value) { | 19778 if (cell->value() != *new_value) { |
| 19750 cell->set_value(*new_value); | 19779 cell->set_value(*new_value); |
| 19751 Isolate* isolate = cell->GetIsolate(); | 19780 Isolate* isolate = cell->GetIsolate(); |
| 19752 cell->dependent_code()->DeoptimizeDependentCodeGroup( | 19781 cell->dependent_code()->DeoptimizeDependentCodeGroup( |
| 19753 isolate, DependentCode::kPropertyCellChangedGroup); | 19782 isolate, DependentCode::kPropertyCellChangedGroup); |
| 19754 } | 19783 } |
| 19755 } | 19784 } |
| 19756 | 19785 |
| 19757 } // namespace internal | 19786 } // namespace internal |
| 19758 } // namespace v8 | 19787 } // namespace v8 |
| OLD | NEW |