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 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |