Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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/api.h" | 5 #include "src/api.h" |
| 6 | 6 |
| 7 #include <string.h> // For memcpy, strlen. | 7 #include <string.h> // For memcpy, strlen. |
| 8 #ifdef V8_USE_ADDRESS_SANITIZER | 8 #ifdef V8_USE_ADDRESS_SANITIZER |
| 9 #include <sanitizer/asan_interface.h> | 9 #include <sanitizer/asan_interface.h> |
| 10 #endif // V8_USE_ADDRESS_SANITIZER | 10 #endif // V8_USE_ADDRESS_SANITIZER |
| (...skipping 3546 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3557 | 3557 |
| 3558 | 3558 |
| 3559 bool v8::Object::HasIndexedLookupInterceptor() { | 3559 bool v8::Object::HasIndexedLookupInterceptor() { |
| 3560 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); | 3560 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); |
| 3561 ON_BAILOUT(isolate, "v8::Object::HasIndexedLookupInterceptor()", | 3561 ON_BAILOUT(isolate, "v8::Object::HasIndexedLookupInterceptor()", |
| 3562 return false); | 3562 return false); |
| 3563 return Utils::OpenHandle(this)->HasIndexedInterceptor(); | 3563 return Utils::OpenHandle(this)->HasIndexedInterceptor(); |
| 3564 } | 3564 } |
| 3565 | 3565 |
| 3566 | 3566 |
| 3567 static Local<Value> GetPropertyByLookup(i::Isolate* isolate, | 3567 static Local<Value> GetPropertyByLookup(i::LookupIterator* it) { |
| 3568 i::Handle<i::JSObject> receiver, | 3568 // If the property being looked up is a callback, it can throw an exception. |
| 3569 i::Handle<i::String> name, | 3569 EXCEPTION_PREAMBLE(it->isolate()); |
| 3570 i::LookupResult* lookup) { | |
| 3571 if (!lookup->IsProperty()) { | |
| 3572 // No real property was found. | |
| 3573 return Local<Value>(); | |
| 3574 } | |
| 3575 | |
| 3576 // If the property being looked up is a callback, it can throw | |
| 3577 // an exception. | |
| 3578 EXCEPTION_PREAMBLE(isolate); | |
| 3579 i::LookupIterator it(receiver, name, | |
| 3580 i::Handle<i::JSReceiver>(lookup->holder(), isolate), | |
| 3581 i::LookupIterator::CHECK_DERIVED_SKIP_INTERCEPTOR); | |
| 3582 i::Handle<i::Object> result; | 3570 i::Handle<i::Object> result; |
| 3583 has_pending_exception = !i::Object::GetProperty(&it).ToHandle(&result); | 3571 has_pending_exception = !i::Object::GetProperty(it).ToHandle(&result); |
| 3584 EXCEPTION_BAILOUT_CHECK(isolate, Local<Value>()); | 3572 EXCEPTION_BAILOUT_CHECK(it->isolate(), Local<Value>()); |
| 3585 | 3573 |
| 3586 return Utils::ToLocal(result); | 3574 return Utils::ToLocal(result); |
| 3587 } | 3575 } |
| 3588 | 3576 |
| 3589 | 3577 |
| 3590 Local<Value> v8::Object::GetRealNamedPropertyInPrototypeChain( | 3578 Local<Value> v8::Object::GetRealNamedPropertyInPrototypeChain( |
| 3591 Handle<String> key) { | 3579 Handle<String> key) { |
| 3592 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); | 3580 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); |
| 3593 ON_BAILOUT(isolate, | 3581 ON_BAILOUT(isolate, |
| 3594 "v8::Object::GetRealNamedPropertyInPrototypeChain()", | 3582 "v8::Object::GetRealNamedPropertyInPrototypeChain()", |
| 3595 return Local<Value>()); | 3583 return Local<Value>()); |
| 3596 ENTER_V8(isolate); | 3584 ENTER_V8(isolate); |
| 3597 i::Handle<i::JSObject> self_obj = Utils::OpenHandle(this); | 3585 i::Handle<i::JSObject> self_obj = Utils::OpenHandle(this); |
| 3598 i::Handle<i::String> key_obj = Utils::OpenHandle(*key); | 3586 i::Handle<i::String> key_obj = Utils::OpenHandle(*key); |
| 3599 i::LookupResult lookup(isolate); | 3587 i::PrototypeIterator iter(isolate, self_obj); |
| 3600 self_obj->LookupRealNamedPropertyInPrototypes(key_obj, &lookup); | 3588 if (iter.IsAtEnd()) return Local<Value>(); |
| 3601 return GetPropertyByLookup(isolate, self_obj, key_obj, &lookup); | 3589 i::LookupIterator it(i::PrototypeIterator::GetCurrent(iter), key_obj, |
| 3590 i::LookupIterator::CHECK_DERIVED_PROPERTY); | |
| 3591 return GetPropertyByLookup(&it); | |
| 3602 } | 3592 } |
| 3603 | 3593 |
| 3604 | 3594 |
| 3605 Local<Value> v8::Object::GetRealNamedProperty(Handle<String> key) { | 3595 Local<Value> v8::Object::GetRealNamedProperty(Handle<String> key) { |
| 3606 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); | 3596 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); |
| 3607 ON_BAILOUT(isolate, "v8::Object::GetRealNamedProperty()", | 3597 ON_BAILOUT(isolate, "v8::Object::GetRealNamedProperty()", |
| 3608 return Local<Value>()); | 3598 return Local<Value>()); |
| 3609 ENTER_V8(isolate); | 3599 ENTER_V8(isolate); |
| 3610 i::Handle<i::JSObject> self_obj = Utils::OpenHandle(this); | 3600 i::Handle<i::JSObject> self_obj = Utils::OpenHandle(this); |
| 3611 i::Handle<i::String> key_obj = Utils::OpenHandle(*key); | 3601 i::Handle<i::String> key_obj = Utils::OpenHandle(*key); |
| 3612 i::LookupResult lookup(isolate); | 3602 i::LookupIterator it(self_obj, key_obj, |
| 3613 self_obj->LookupRealNamedProperty(key_obj, &lookup); | 3603 i::LookupIterator::CHECK_DERIVED_PROPERTY); |
| 3614 return GetPropertyByLookup(isolate, self_obj, key_obj, &lookup); | 3604 return GetPropertyByLookup(&it); |
| 3615 } | 3605 } |
| 3616 | 3606 |
| 3617 | 3607 |
| 3618 // Turns on access checks by copying the map and setting the check flag. | 3608 // Turns on access checks by copying the map and setting the check flag. |
| 3619 // Because the object gets a new map, existing inline cache caching | 3609 // Because the object gets a new map, existing inline cache caching |
| 3620 // the old map of this object will fail. | 3610 // the old map of this object will fail. |
| 3621 void v8::Object::TurnOnAccessCheck() { | 3611 void v8::Object::TurnOnAccessCheck() { |
| 3622 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); | 3612 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); |
| 3623 ON_BAILOUT(isolate, "v8::Object::TurnOnAccessCheck()", return); | 3613 ON_BAILOUT(isolate, "v8::Object::TurnOnAccessCheck()", return); |
| 3624 ENTER_V8(isolate); | 3614 ENTER_V8(isolate); |
| (...skipping 433 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4058 Handle<Value> Function::GetDisplayName() const { | 4048 Handle<Value> Function::GetDisplayName() const { |
| 4059 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); | 4049 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); |
| 4060 ON_BAILOUT(isolate, "v8::Function::GetDisplayName()", | 4050 ON_BAILOUT(isolate, "v8::Function::GetDisplayName()", |
| 4061 return ToApiHandle<Primitive>( | 4051 return ToApiHandle<Primitive>( |
| 4062 isolate->factory()->undefined_value())); | 4052 isolate->factory()->undefined_value())); |
| 4063 ENTER_V8(isolate); | 4053 ENTER_V8(isolate); |
| 4064 i::Handle<i::JSFunction> func = Utils::OpenHandle(this); | 4054 i::Handle<i::JSFunction> func = Utils::OpenHandle(this); |
| 4065 i::Handle<i::String> property_name = | 4055 i::Handle<i::String> property_name = |
| 4066 isolate->factory()->InternalizeOneByteString( | 4056 isolate->factory()->InternalizeOneByteString( |
| 4067 STATIC_ASCII_VECTOR("displayName")); | 4057 STATIC_ASCII_VECTOR("displayName")); |
| 4068 i::LookupResult lookup(isolate); | 4058 i::LookupIterator it(func, property_name, |
|
aandrey
2014/08/19 16:01:15
this var is not used, or does it behave like a sco
Toon Verwaest
2014/08/19 16:04:48
I just realized, hence https://codereview.chromium
| |
| 4069 func->LookupRealNamedProperty(property_name, &lookup); | 4059 i::LookupIterator::CHECK_DERIVED_PROPERTY); |
| 4070 if (lookup.IsFound()) { | 4060 |
| 4071 i::Object* value = lookup.GetLazyValue(); | 4061 i::Handle<i::Object> value = |
| 4072 if (value && value->IsString()) { | 4062 i::JSObject::GetDataProperty(func, property_name); |
|
aandrey
2014/08/19 16:01:15
this should not result in any side effects, like c
Toon Verwaest
2014/08/19 16:04:48
Yes, that's what GetDataProperty is for.
| |
| 4073 i::String* name = i::String::cast(value); | 4063 if (value->IsString()) { |
| 4074 if (name->length() > 0) return Utils::ToLocal(i::Handle<i::String>(name)); | 4064 i::Handle<i::String> name = i::Handle<i::String>::cast(value); |
| 4075 } | 4065 if (name->length() > 0) return Utils::ToLocal(name); |
| 4076 } | 4066 } |
| 4067 | |
| 4077 return ToApiHandle<Primitive>(isolate->factory()->undefined_value()); | 4068 return ToApiHandle<Primitive>(isolate->factory()->undefined_value()); |
| 4078 } | 4069 } |
| 4079 | 4070 |
| 4080 | 4071 |
| 4081 ScriptOrigin Function::GetScriptOrigin() const { | 4072 ScriptOrigin Function::GetScriptOrigin() const { |
| 4082 i::Handle<i::JSFunction> func = Utils::OpenHandle(this); | 4073 i::Handle<i::JSFunction> func = Utils::OpenHandle(this); |
| 4083 if (func->shared()->script()->IsScript()) { | 4074 if (func->shared()->script()->IsScript()) { |
| 4084 i::Handle<i::Script> script(i::Script::cast(func->shared()->script())); | 4075 i::Handle<i::Script> script(i::Script::cast(func->shared()->script())); |
| 4085 i::Handle<i::Object> scriptName = i::Script::GetNameOrSourceURL(script); | 4076 i::Handle<i::Object> scriptName = i::Script::GetNameOrSourceURL(script); |
| 4086 v8::Isolate* isolate = reinterpret_cast<v8::Isolate*>(func->GetIsolate()); | 4077 v8::Isolate* isolate = reinterpret_cast<v8::Isolate*>(func->GetIsolate()); |
| (...skipping 3558 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 7645 Isolate* isolate = reinterpret_cast<Isolate*>(info.GetIsolate()); | 7636 Isolate* isolate = reinterpret_cast<Isolate*>(info.GetIsolate()); |
| 7646 Address callback_address = | 7637 Address callback_address = |
| 7647 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); | 7638 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); |
| 7648 VMState<EXTERNAL> state(isolate); | 7639 VMState<EXTERNAL> state(isolate); |
| 7649 ExternalCallbackScope call_scope(isolate, callback_address); | 7640 ExternalCallbackScope call_scope(isolate, callback_address); |
| 7650 callback(info); | 7641 callback(info); |
| 7651 } | 7642 } |
| 7652 | 7643 |
| 7653 | 7644 |
| 7654 } } // namespace v8::internal | 7645 } } // namespace v8::internal |
| OLD | NEW |