| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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 <iomanip> | 5 #include <iomanip> |
| 6 #include <sstream> | 6 #include <sstream> |
| 7 | 7 |
| 8 #include "src/v8.h" | 8 #include "src/v8.h" |
| 9 | 9 |
| 10 #include "src/accessors.h" | 10 #include "src/accessors.h" |
| (...skipping 16 matching lines...) Expand all Loading... |
| 27 #include "src/field-index.h" | 27 #include "src/field-index.h" |
| 28 #include "src/full-codegen.h" | 28 #include "src/full-codegen.h" |
| 29 #include "src/heap/mark-compact.h" | 29 #include "src/heap/mark-compact.h" |
| 30 #include "src/heap/objects-visiting-inl.h" | 30 #include "src/heap/objects-visiting-inl.h" |
| 31 #include "src/hydrogen.h" | 31 #include "src/hydrogen.h" |
| 32 #include "src/ic/ic.h" | 32 #include "src/ic/ic.h" |
| 33 #include "src/isolate-inl.h" | 33 #include "src/isolate-inl.h" |
| 34 #include "src/log.h" | 34 #include "src/log.h" |
| 35 #include "src/lookup.h" | 35 #include "src/lookup.h" |
| 36 #include "src/macro-assembler.h" | 36 #include "src/macro-assembler.h" |
| 37 #include "src/messages.h" |
| 37 #include "src/objects-inl.h" | 38 #include "src/objects-inl.h" |
| 38 #include "src/prototype.h" | 39 #include "src/prototype.h" |
| 39 #include "src/safepoint-table.h" | 40 #include "src/safepoint-table.h" |
| 40 #include "src/string-search.h" | 41 #include "src/string-search.h" |
| 41 #include "src/string-stream.h" | 42 #include "src/string-stream.h" |
| 42 #include "src/utils.h" | 43 #include "src/utils.h" |
| 43 | 44 |
| 44 #ifdef ENABLE_DISASSEMBLER | 45 #ifdef ENABLE_DISASSEMBLER |
| 45 #include "src/disasm.h" | 46 #include "src/disasm.h" |
| 46 #include "src/disassembler.h" | 47 #include "src/disassembler.h" |
| (...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 291 MaybeHandle<Object> Object::GetPropertyWithAccessor(Handle<Object> receiver, | 292 MaybeHandle<Object> Object::GetPropertyWithAccessor(Handle<Object> receiver, |
| 292 Handle<Name> name, | 293 Handle<Name> name, |
| 293 Handle<JSObject> holder, | 294 Handle<JSObject> holder, |
| 294 Handle<Object> structure) { | 295 Handle<Object> structure) { |
| 295 Isolate* isolate = name->GetIsolate(); | 296 Isolate* isolate = name->GetIsolate(); |
| 296 DCHECK(!structure->IsForeign()); | 297 DCHECK(!structure->IsForeign()); |
| 297 // api style callbacks. | 298 // api style callbacks. |
| 298 if (structure->IsAccessorInfo()) { | 299 if (structure->IsAccessorInfo()) { |
| 299 Handle<AccessorInfo> info = Handle<AccessorInfo>::cast(structure); | 300 Handle<AccessorInfo> info = Handle<AccessorInfo>::cast(structure); |
| 300 if (!info->IsCompatibleReceiver(*receiver)) { | 301 if (!info->IsCompatibleReceiver(*receiver)) { |
| 301 Handle<Object> args[] = {name, receiver}; | |
| 302 THROW_NEW_ERROR(isolate, | 302 THROW_NEW_ERROR(isolate, |
| 303 NewTypeError("incompatible_method_receiver", | 303 NewTypeError(MessageTemplate::kIncompatibleMethodReceiver, |
| 304 HandleVector(args, arraysize(args))), | 304 name, receiver), |
| 305 Object); | 305 Object); |
| 306 } | 306 } |
| 307 | 307 |
| 308 Handle<ExecutableAccessorInfo> data = | 308 Handle<ExecutableAccessorInfo> data = |
| 309 Handle<ExecutableAccessorInfo>::cast(structure); | 309 Handle<ExecutableAccessorInfo>::cast(structure); |
| 310 v8::AccessorNameGetterCallback call_fun = | 310 v8::AccessorNameGetterCallback call_fun = |
| 311 v8::ToCData<v8::AccessorNameGetterCallback>(data->getter()); | 311 v8::ToCData<v8::AccessorNameGetterCallback>(data->getter()); |
| 312 if (call_fun == NULL) return isolate->factory()->undefined_value(); | 312 if (call_fun == NULL) return isolate->factory()->undefined_value(); |
| 313 | 313 |
| 314 LOG(isolate, ApiNamedPropertyAccess("load", *holder, *name)); | 314 LOG(isolate, ApiNamedPropertyAccess("load", *holder, *name)); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 356 | 356 |
| 357 // We should never get here to initialize a const with the hole | 357 // We should never get here to initialize a const with the hole |
| 358 // value since a const declaration would conflict with the setter. | 358 // value since a const declaration would conflict with the setter. |
| 359 DCHECK(!structure->IsForeign()); | 359 DCHECK(!structure->IsForeign()); |
| 360 if (structure->IsExecutableAccessorInfo()) { | 360 if (structure->IsExecutableAccessorInfo()) { |
| 361 // Don't call executable accessor setters with non-JSObject receivers. | 361 // Don't call executable accessor setters with non-JSObject receivers. |
| 362 if (!receiver->IsJSObject()) return value; | 362 if (!receiver->IsJSObject()) return value; |
| 363 // api style callbacks | 363 // api style callbacks |
| 364 ExecutableAccessorInfo* info = ExecutableAccessorInfo::cast(*structure); | 364 ExecutableAccessorInfo* info = ExecutableAccessorInfo::cast(*structure); |
| 365 if (!info->IsCompatibleReceiver(*receiver)) { | 365 if (!info->IsCompatibleReceiver(*receiver)) { |
| 366 Handle<Object> args[] = {name, receiver}; | |
| 367 THROW_NEW_ERROR(isolate, | 366 THROW_NEW_ERROR(isolate, |
| 368 NewTypeError("incompatible_method_receiver", | 367 NewTypeError(MessageTemplate::kIncompatibleMethodReceiver, |
| 369 HandleVector(args, arraysize(args))), | 368 name, receiver), |
| 370 Object); | 369 Object); |
| 371 } | 370 } |
| 372 Object* call_obj = info->setter(); | 371 Object* call_obj = info->setter(); |
| 373 v8::AccessorNameSetterCallback call_fun = | 372 v8::AccessorNameSetterCallback call_fun = |
| 374 v8::ToCData<v8::AccessorNameSetterCallback>(call_obj); | 373 v8::ToCData<v8::AccessorNameSetterCallback>(call_obj); |
| 375 if (call_fun == NULL) return value; | 374 if (call_fun == NULL) return value; |
| 376 LOG(isolate, ApiNamedPropertyAccess("store", *holder, *name)); | 375 LOG(isolate, ApiNamedPropertyAccess("store", *holder, *name)); |
| 377 PropertyCallbackArguments args(isolate, info->data(), *receiver, *holder); | 376 PropertyCallbackArguments args(isolate, info->data(), *receiver, *holder); |
| 378 args.Call(call_fun, | 377 args.Call(call_fun, |
| 379 v8::Utils::ToLocal(name), | 378 v8::Utils::ToLocal(name), |
| (...skipping 12079 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12459 | 12458 |
| 12460 // Before we can set the prototype we need to be sure | 12459 // Before we can set the prototype we need to be sure |
| 12461 // prototype cycles are prevented. | 12460 // prototype cycles are prevented. |
| 12462 // It is sufficient to validate that the receiver is not in the new prototype | 12461 // It is sufficient to validate that the receiver is not in the new prototype |
| 12463 // chain. | 12462 // chain. |
| 12464 for (PrototypeIterator iter(isolate, *value, | 12463 for (PrototypeIterator iter(isolate, *value, |
| 12465 PrototypeIterator::START_AT_RECEIVER); | 12464 PrototypeIterator::START_AT_RECEIVER); |
| 12466 !iter.IsAtEnd(); iter.Advance()) { | 12465 !iter.IsAtEnd(); iter.Advance()) { |
| 12467 if (JSReceiver::cast(iter.GetCurrent()) == *object) { | 12466 if (JSReceiver::cast(iter.GetCurrent()) == *object) { |
| 12468 // Cycle detected. | 12467 // Cycle detected. |
| 12469 THROW_NEW_ERROR(isolate, | 12468 THROW_NEW_ERROR(isolate, NewError(MessageTemplate::kCyclicProto), Object); |
| 12470 NewError("cyclic_proto", HandleVector<Object>(NULL, 0)), | |
| 12471 Object); | |
| 12472 } | 12469 } |
| 12473 } | 12470 } |
| 12474 | 12471 |
| 12475 bool dictionary_elements_in_chain = | 12472 bool dictionary_elements_in_chain = |
| 12476 object->map()->DictionaryElementsInPrototypeChainOnly(); | 12473 object->map()->DictionaryElementsInPrototypeChainOnly(); |
| 12477 Handle<JSObject> real_receiver = object; | 12474 Handle<JSObject> real_receiver = object; |
| 12478 | 12475 |
| 12479 if (from_javascript) { | 12476 if (from_javascript) { |
| 12480 // Find the first object in the chain whose prototype object is not | 12477 // Find the first object in the chain whose prototype object is not |
| 12481 // hidden and set the new prototype on that object. | 12478 // hidden and set the new prototype on that object. |
| (...skipping 4594 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 17076 if (!invalidate && old_type == PropertyCellType::kConstant && | 17073 if (!invalidate && old_type == PropertyCellType::kConstant && |
| 17077 new_type != PropertyCellType::kConstant) { | 17074 new_type != PropertyCellType::kConstant) { |
| 17078 auto isolate = dictionary->GetIsolate(); | 17075 auto isolate = dictionary->GetIsolate(); |
| 17079 cell->dependent_code()->DeoptimizeDependentCodeGroup( | 17076 cell->dependent_code()->DeoptimizeDependentCodeGroup( |
| 17080 isolate, DependentCode::kPropertyCellChangedGroup); | 17077 isolate, DependentCode::kPropertyCellChangedGroup); |
| 17081 } | 17078 } |
| 17082 return value; | 17079 return value; |
| 17083 } | 17080 } |
| 17084 | 17081 |
| 17085 } } // namespace v8::internal | 17082 } } // namespace v8::internal |
| OLD | NEW |