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

Side by Side Diff: src/objects.cc

Issue 242050: Changed structure of accessor arguments passing to allow accessor (Closed)
Patch Set: Tuned Created 11 years, 2 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 2006-2009 the V8 project authors. All rights reserved. 1 // Copyright 2006-2009 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 10 matching lines...) Expand all
21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 27
28 #include "v8.h" 28 #include "v8.h"
29 29
30 #include "api.h" 30 #include "api.h"
31 #include "arguments.h"
31 #include "bootstrapper.h" 32 #include "bootstrapper.h"
32 #include "debug.h" 33 #include "debug.h"
33 #include "execution.h" 34 #include "execution.h"
34 #include "objects-inl.h" 35 #include "objects-inl.h"
35 #include "macro-assembler.h" 36 #include "macro-assembler.h"
36 #include "scanner.h" 37 #include "scanner.h"
37 #include "scopeinfo.h" 38 #include "scopeinfo.h"
38 #include "string-stream.h" 39 #include "string-stream.h"
39 40
40 #ifdef ENABLE_DISASSEMBLER 41 #ifdef ENABLE_DISASSEMBLER
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
151 RETURN_IF_SCHEDULED_EXCEPTION(); 152 RETURN_IF_SCHEDULED_EXCEPTION();
152 return value; 153 return value;
153 } 154 }
154 155
155 // api style callbacks. 156 // api style callbacks.
156 if (structure->IsAccessorInfo()) { 157 if (structure->IsAccessorInfo()) {
157 AccessorInfo* data = AccessorInfo::cast(structure); 158 AccessorInfo* data = AccessorInfo::cast(structure);
158 Object* fun_obj = data->getter(); 159 Object* fun_obj = data->getter();
159 v8::AccessorGetter call_fun = v8::ToCData<v8::AccessorGetter>(fun_obj); 160 v8::AccessorGetter call_fun = v8::ToCData<v8::AccessorGetter>(fun_obj);
160 HandleScope scope; 161 HandleScope scope;
161 Handle<JSObject> self(JSObject::cast(receiver)); 162 JSObject* self = JSObject::cast(receiver);
162 Handle<JSObject> holder_handle(JSObject::cast(holder)); 163 JSObject* holder_handle = JSObject::cast(holder);
163 Handle<String> key(name); 164 Handle<String> key(name);
164 Handle<Object> fun_data(data->data()); 165 LOG(ApiNamedPropertyAccess("load", self, name));
165 LOG(ApiNamedPropertyAccess("load", *self, name)); 166 CustomArguments args(data->data(), self, holder_handle);
166 v8::AccessorInfo info(v8::Utils::ToLocal(self), 167 v8::AccessorInfo info(args.end());
167 v8::Utils::ToLocal(fun_data),
168 v8::Utils::ToLocal(holder_handle));
169 v8::Handle<v8::Value> result; 168 v8::Handle<v8::Value> result;
170 { 169 {
171 // Leaving JavaScript. 170 // Leaving JavaScript.
172 VMState state(EXTERNAL); 171 VMState state(EXTERNAL);
173 result = call_fun(v8::Utils::ToLocal(key), info); 172 result = call_fun(v8::Utils::ToLocal(key), info);
174 } 173 }
175 RETURN_IF_SCHEDULED_EXCEPTION(); 174 RETURN_IF_SCHEDULED_EXCEPTION();
176 if (result.IsEmpty()) return Heap::undefined_value(); 175 if (result.IsEmpty()) return Heap::undefined_value();
177 return *v8::Utils::OpenHandle(*result); 176 return *v8::Utils::OpenHandle(*result);
178 } 177 }
(...skipping 1352 matching lines...) Expand 10 before | Expand all | Expand 10 after
1531 1530
1532 Object* JSObject::SetPropertyWithInterceptor(String* name, 1531 Object* JSObject::SetPropertyWithInterceptor(String* name,
1533 Object* value, 1532 Object* value,
1534 PropertyAttributes attributes) { 1533 PropertyAttributes attributes) {
1535 HandleScope scope; 1534 HandleScope scope;
1536 Handle<JSObject> this_handle(this); 1535 Handle<JSObject> this_handle(this);
1537 Handle<String> name_handle(name); 1536 Handle<String> name_handle(name);
1538 Handle<Object> value_handle(value); 1537 Handle<Object> value_handle(value);
1539 Handle<InterceptorInfo> interceptor(GetNamedInterceptor()); 1538 Handle<InterceptorInfo> interceptor(GetNamedInterceptor());
1540 if (!interceptor->setter()->IsUndefined()) { 1539 if (!interceptor->setter()->IsUndefined()) {
1541 Handle<Object> data_handle(interceptor->data());
1542 LOG(ApiNamedPropertyAccess("interceptor-named-set", this, name)); 1540 LOG(ApiNamedPropertyAccess("interceptor-named-set", this, name));
1543 v8::AccessorInfo info(v8::Utils::ToLocal(this_handle), 1541 CustomArguments args(interceptor->data(), this, this);
1544 v8::Utils::ToLocal(data_handle), 1542 v8::AccessorInfo info(args.end());
1545 v8::Utils::ToLocal(this_handle));
1546 v8::NamedPropertySetter setter = 1543 v8::NamedPropertySetter setter =
1547 v8::ToCData<v8::NamedPropertySetter>(interceptor->setter()); 1544 v8::ToCData<v8::NamedPropertySetter>(interceptor->setter());
1548 v8::Handle<v8::Value> result; 1545 v8::Handle<v8::Value> result;
1549 { 1546 {
1550 // Leaving JavaScript. 1547 // Leaving JavaScript.
1551 VMState state(EXTERNAL); 1548 VMState state(EXTERNAL);
1552 Handle<Object> value_unhole(value->IsTheHole() ? 1549 Handle<Object> value_unhole(value->IsTheHole() ?
1553 Heap::undefined_value() : 1550 Heap::undefined_value() :
1554 value); 1551 value);
1555 result = setter(v8::Utils::ToLocal(name_handle), 1552 result = setter(v8::Utils::ToLocal(name_handle),
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
1598 if (obj->IsFailure()) return obj; 1595 if (obj->IsFailure()) return obj;
1599 return *value_handle; 1596 return *value_handle;
1600 } 1597 }
1601 1598
1602 if (structure->IsAccessorInfo()) { 1599 if (structure->IsAccessorInfo()) {
1603 // api style callbacks 1600 // api style callbacks
1604 AccessorInfo* data = AccessorInfo::cast(structure); 1601 AccessorInfo* data = AccessorInfo::cast(structure);
1605 Object* call_obj = data->setter(); 1602 Object* call_obj = data->setter();
1606 v8::AccessorSetter call_fun = v8::ToCData<v8::AccessorSetter>(call_obj); 1603 v8::AccessorSetter call_fun = v8::ToCData<v8::AccessorSetter>(call_obj);
1607 if (call_fun == NULL) return value; 1604 if (call_fun == NULL) return value;
1608 Handle<JSObject> self(this);
1609 Handle<JSObject> holder_handle(JSObject::cast(holder));
1610 Handle<String> key(name); 1605 Handle<String> key(name);
1611 Handle<Object> fun_data(data->data());
1612 LOG(ApiNamedPropertyAccess("store", this, name)); 1606 LOG(ApiNamedPropertyAccess("store", this, name));
1613 v8::AccessorInfo info(v8::Utils::ToLocal(self), 1607 CustomArguments args(data->data(), this, JSObject::cast(holder));
1614 v8::Utils::ToLocal(fun_data), 1608 v8::AccessorInfo info(args.end());
1615 v8::Utils::ToLocal(holder_handle));
1616 { 1609 {
1617 // Leaving JavaScript. 1610 // Leaving JavaScript.
1618 VMState state(EXTERNAL); 1611 VMState state(EXTERNAL);
1619 call_fun(v8::Utils::ToLocal(key), 1612 call_fun(v8::Utils::ToLocal(key),
1620 v8::Utils::ToLocal(value_handle), 1613 v8::Utils::ToLocal(value_handle),
1621 info); 1614 info);
1622 } 1615 }
1623 RETURN_IF_SCHEDULED_EXCEPTION(); 1616 RETURN_IF_SCHEDULED_EXCEPTION();
1624 return *value_handle; 1617 return *value_handle;
1625 } 1618 }
(...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after
2029 bool continue_search) { 2022 bool continue_search) {
2030 // Make sure that the top context does not change when doing 2023 // Make sure that the top context does not change when doing
2031 // callbacks or interceptor calls. 2024 // callbacks or interceptor calls.
2032 AssertNoContextChange ncc; 2025 AssertNoContextChange ncc;
2033 2026
2034 HandleScope scope; 2027 HandleScope scope;
2035 Handle<InterceptorInfo> interceptor(GetNamedInterceptor()); 2028 Handle<InterceptorInfo> interceptor(GetNamedInterceptor());
2036 Handle<JSObject> receiver_handle(receiver); 2029 Handle<JSObject> receiver_handle(receiver);
2037 Handle<JSObject> holder_handle(this); 2030 Handle<JSObject> holder_handle(this);
2038 Handle<String> name_handle(name); 2031 Handle<String> name_handle(name);
2039 Handle<Object> data_handle(interceptor->data()); 2032 CustomArguments args(interceptor->data(), receiver, this);
2040 v8::AccessorInfo info(v8::Utils::ToLocal(receiver_handle), 2033 v8::AccessorInfo info(args.end());
2041 v8::Utils::ToLocal(data_handle),
2042 v8::Utils::ToLocal(holder_handle));
2043 if (!interceptor->query()->IsUndefined()) { 2034 if (!interceptor->query()->IsUndefined()) {
2044 v8::NamedPropertyQuery query = 2035 v8::NamedPropertyQuery query =
2045 v8::ToCData<v8::NamedPropertyQuery>(interceptor->query()); 2036 v8::ToCData<v8::NamedPropertyQuery>(interceptor->query());
2046 LOG(ApiNamedPropertyAccess("interceptor-named-has", *holder_handle, name)); 2037 LOG(ApiNamedPropertyAccess("interceptor-named-has", *holder_handle, name));
2047 v8::Handle<v8::Boolean> result; 2038 v8::Handle<v8::Boolean> result;
2048 { 2039 {
2049 // Leaving JavaScript. 2040 // Leaving JavaScript.
2050 VMState state(EXTERNAL); 2041 VMState state(EXTERNAL);
2051 result = query(v8::Utils::ToLocal(name_handle), info); 2042 result = query(v8::Utils::ToLocal(name_handle), info);
2052 } 2043 }
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after
2300 2291
2301 2292
2302 Object* JSObject::DeletePropertyWithInterceptor(String* name) { 2293 Object* JSObject::DeletePropertyWithInterceptor(String* name) {
2303 HandleScope scope; 2294 HandleScope scope;
2304 Handle<InterceptorInfo> interceptor(GetNamedInterceptor()); 2295 Handle<InterceptorInfo> interceptor(GetNamedInterceptor());
2305 Handle<String> name_handle(name); 2296 Handle<String> name_handle(name);
2306 Handle<JSObject> this_handle(this); 2297 Handle<JSObject> this_handle(this);
2307 if (!interceptor->deleter()->IsUndefined()) { 2298 if (!interceptor->deleter()->IsUndefined()) {
2308 v8::NamedPropertyDeleter deleter = 2299 v8::NamedPropertyDeleter deleter =
2309 v8::ToCData<v8::NamedPropertyDeleter>(interceptor->deleter()); 2300 v8::ToCData<v8::NamedPropertyDeleter>(interceptor->deleter());
2310 Handle<Object> data_handle(interceptor->data());
2311 LOG(ApiNamedPropertyAccess("interceptor-named-delete", *this_handle, name)); 2301 LOG(ApiNamedPropertyAccess("interceptor-named-delete", *this_handle, name));
2312 v8::AccessorInfo info(v8::Utils::ToLocal(this_handle), 2302 CustomArguments args(interceptor->data(), this, this);
2313 v8::Utils::ToLocal(data_handle), 2303 v8::AccessorInfo info(args.end());
2314 v8::Utils::ToLocal(this_handle));
2315 v8::Handle<v8::Boolean> result; 2304 v8::Handle<v8::Boolean> result;
2316 { 2305 {
2317 // Leaving JavaScript. 2306 // Leaving JavaScript.
2318 VMState state(EXTERNAL); 2307 VMState state(EXTERNAL);
2319 result = deleter(v8::Utils::ToLocal(name_handle), info); 2308 result = deleter(v8::Utils::ToLocal(name_handle), info);
2320 } 2309 }
2321 RETURN_IF_SCHEDULED_EXCEPTION(); 2310 RETURN_IF_SCHEDULED_EXCEPTION();
2322 if (!result.IsEmpty()) { 2311 if (!result.IsEmpty()) {
2323 ASSERT(result->IsBoolean()); 2312 ASSERT(result->IsBoolean());
2324 return *v8::Utils::OpenHandle(*result); 2313 return *v8::Utils::OpenHandle(*result);
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
2363 Object* JSObject::DeleteElementWithInterceptor(uint32_t index) { 2352 Object* JSObject::DeleteElementWithInterceptor(uint32_t index) {
2364 // Make sure that the top context does not change when doing 2353 // Make sure that the top context does not change when doing
2365 // callbacks or interceptor calls. 2354 // callbacks or interceptor calls.
2366 AssertNoContextChange ncc; 2355 AssertNoContextChange ncc;
2367 HandleScope scope; 2356 HandleScope scope;
2368 Handle<InterceptorInfo> interceptor(GetIndexedInterceptor()); 2357 Handle<InterceptorInfo> interceptor(GetIndexedInterceptor());
2369 if (interceptor->deleter()->IsUndefined()) return Heap::false_value(); 2358 if (interceptor->deleter()->IsUndefined()) return Heap::false_value();
2370 v8::IndexedPropertyDeleter deleter = 2359 v8::IndexedPropertyDeleter deleter =
2371 v8::ToCData<v8::IndexedPropertyDeleter>(interceptor->deleter()); 2360 v8::ToCData<v8::IndexedPropertyDeleter>(interceptor->deleter());
2372 Handle<JSObject> this_handle(this); 2361 Handle<JSObject> this_handle(this);
2373 Handle<Object> data_handle(interceptor->data());
2374 LOG(ApiIndexedPropertyAccess("interceptor-indexed-delete", this, index)); 2362 LOG(ApiIndexedPropertyAccess("interceptor-indexed-delete", this, index));
2375 v8::AccessorInfo info(v8::Utils::ToLocal(this_handle), 2363 CustomArguments args(interceptor->data(), this, this);
2376 v8::Utils::ToLocal(data_handle), 2364 v8::AccessorInfo info(args.end());
2377 v8::Utils::ToLocal(this_handle));
2378 v8::Handle<v8::Boolean> result; 2365 v8::Handle<v8::Boolean> result;
2379 { 2366 {
2380 // Leaving JavaScript. 2367 // Leaving JavaScript.
2381 VMState state(EXTERNAL); 2368 VMState state(EXTERNAL);
2382 result = deleter(index, info); 2369 result = deleter(index, info);
2383 } 2370 }
2384 RETURN_IF_SCHEDULED_EXCEPTION(); 2371 RETURN_IF_SCHEDULED_EXCEPTION();
2385 if (!result.IsEmpty()) { 2372 if (!result.IsEmpty()) {
2386 ASSERT(result->IsBoolean()); 2373 ASSERT(result->IsBoolean());
2387 return *v8::Utils::OpenHandle(*result); 2374 return *v8::Utils::OpenHandle(*result);
(...skipping 1576 matching lines...) Expand 10 before | Expand all | Expand 10 after
3964 } 3951 }
3965 default: 3952 default:
3966 break; 3953 break;
3967 } 3954 }
3968 3955
3969 UNREACHABLE(); 3956 UNREACHABLE();
3970 return 0; 3957 return 0;
3971 } 3958 }
3972 3959
3973 3960
3974 FlatStringReader* FlatStringReader::top_ = NULL; 3961 Relocatable* Relocatable::top_ = NULL;
3962
3963
3964 void Relocatable::PostGarbageCollectionProcessing() {
3965 Relocatable* current = top_;
3966 while (current != NULL) {
3967 current->PostGarbageCollection();
3968 current = current->prev_;
3969 }
3970 }
3971
3972
3973 // Reserve space for statics needing saving and restoring.
3974 int Relocatable::ArchiveSpacePerThread() {
3975 return sizeof(top_);
3976 }
3977
3978
3979 // Archive statics that are thread local.
3980 char* Relocatable::ArchiveState(char* to) {
3981 *reinterpret_cast<Relocatable**>(to) = top_;
3982 top_ = NULL;
3983 return to + ArchiveSpacePerThread();
3984 }
3985
3986
3987 // Restore statics that are thread local.
3988 char* Relocatable::RestoreState(char* from) {
3989 top_ = *reinterpret_cast<Relocatable**>(from);
3990 return from + ArchiveSpacePerThread();
3991 }
3992
3993
3994 char* Relocatable::Iterate(ObjectVisitor* v, char* thread_storage) {
3995 Relocatable* top = *reinterpret_cast<Relocatable**>(thread_storage);
3996 Iterate(v, top);
3997 return thread_storage + ArchiveSpacePerThread();
3998 }
3999
4000
4001 void Relocatable::Iterate(ObjectVisitor* v) {
4002 Iterate(v, top_);
4003 }
4004
4005
4006 void Relocatable::Iterate(ObjectVisitor* v, Relocatable* top) {
4007 Relocatable* current = top;
4008 while (current != NULL) {
4009 current->IterateInstance(v);
4010 current = current->prev_;
4011 }
4012 }
3975 4013
3976 4014
3977 FlatStringReader::FlatStringReader(Handle<String> str) 4015 FlatStringReader::FlatStringReader(Handle<String> str)
3978 : str_(str.location()), 4016 : str_(str.location()),
3979 length_(str->length()), 4017 length_(str->length()) {
3980 prev_(top_) { 4018 PostGarbageCollection();
3981 top_ = this;
3982 RefreshState();
3983 } 4019 }
3984 4020
3985 4021
3986 FlatStringReader::FlatStringReader(Vector<const char> input) 4022 FlatStringReader::FlatStringReader(Vector<const char> input)
3987 : str_(NULL), 4023 : str_(0),
3988 is_ascii_(true), 4024 is_ascii_(true),
3989 length_(input.length()), 4025 length_(input.length()),
3990 start_(input.start()), 4026 start_(input.start()) { }
3991 prev_(top_) {
3992 top_ = this;
3993 }
3994 4027
3995 4028
3996 FlatStringReader::~FlatStringReader() { 4029 void FlatStringReader::PostGarbageCollection() {
3997 ASSERT_EQ(top_, this);
3998 top_ = prev_;
3999 }
4000
4001
4002 void FlatStringReader::RefreshState() {
4003 if (str_ == NULL) return; 4030 if (str_ == NULL) return;
4004 Handle<String> str(str_); 4031 Handle<String> str(str_);
4005 ASSERT(str->IsFlat()); 4032 ASSERT(str->IsFlat());
4006 is_ascii_ = str->IsAsciiRepresentation(); 4033 is_ascii_ = str->IsAsciiRepresentation();
4007 if (is_ascii_) { 4034 if (is_ascii_) {
4008 start_ = str->ToAsciiVector().start(); 4035 start_ = str->ToAsciiVector().start();
4009 } else { 4036 } else {
4010 start_ = str->ToUC16Vector().start(); 4037 start_ = str->ToUC16Vector().start();
4011 } 4038 }
4012 } 4039 }
4013 4040
4014 4041
4015 void FlatStringReader::PostGarbageCollectionProcessing() {
4016 FlatStringReader* current = top_;
4017 while (current != NULL) {
4018 current->RefreshState();
4019 current = current->prev_;
4020 }
4021 }
4022
4023
4024 void StringInputBuffer::Seek(unsigned pos) { 4042 void StringInputBuffer::Seek(unsigned pos) {
4025 Reset(pos, input_); 4043 Reset(pos, input_);
4026 } 4044 }
4027 4045
4028 4046
4029 void SafeStringInputBuffer::Seek(unsigned pos) { 4047 void SafeStringInputBuffer::Seek(unsigned pos) {
4030 Reset(pos, input_); 4048 Reset(pos, input_);
4031 } 4049 }
4032 4050
4033 4051
(...skipping 1388 matching lines...) Expand 10 before | Expand all | Expand 10 after
5422 5440
5423 5441
5424 bool JSObject::HasElementWithInterceptor(JSObject* receiver, uint32_t index) { 5442 bool JSObject::HasElementWithInterceptor(JSObject* receiver, uint32_t index) {
5425 // Make sure that the top context does not change when doing 5443 // Make sure that the top context does not change when doing
5426 // callbacks or interceptor calls. 5444 // callbacks or interceptor calls.
5427 AssertNoContextChange ncc; 5445 AssertNoContextChange ncc;
5428 HandleScope scope; 5446 HandleScope scope;
5429 Handle<InterceptorInfo> interceptor(GetIndexedInterceptor()); 5447 Handle<InterceptorInfo> interceptor(GetIndexedInterceptor());
5430 Handle<JSObject> receiver_handle(receiver); 5448 Handle<JSObject> receiver_handle(receiver);
5431 Handle<JSObject> holder_handle(this); 5449 Handle<JSObject> holder_handle(this);
5432 Handle<Object> data_handle(interceptor->data()); 5450 CustomArguments args(interceptor->data(), receiver, this);
5433 v8::AccessorInfo info(v8::Utils::ToLocal(receiver_handle), 5451 v8::AccessorInfo info(args.end());
5434 v8::Utils::ToLocal(data_handle),
5435 v8::Utils::ToLocal(holder_handle));
5436 if (!interceptor->query()->IsUndefined()) { 5452 if (!interceptor->query()->IsUndefined()) {
5437 v8::IndexedPropertyQuery query = 5453 v8::IndexedPropertyQuery query =
5438 v8::ToCData<v8::IndexedPropertyQuery>(interceptor->query()); 5454 v8::ToCData<v8::IndexedPropertyQuery>(interceptor->query());
5439 LOG(ApiIndexedPropertyAccess("interceptor-indexed-has", this, index)); 5455 LOG(ApiIndexedPropertyAccess("interceptor-indexed-has", this, index));
5440 v8::Handle<v8::Boolean> result; 5456 v8::Handle<v8::Boolean> result;
5441 { 5457 {
5442 // Leaving JavaScript. 5458 // Leaving JavaScript.
5443 VMState state(EXTERNAL); 5459 VMState state(EXTERNAL);
5444 result = query(index, info); 5460 result = query(index, info);
5445 } 5461 }
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
5557 // Make sure that the top context does not change when doing 5573 // Make sure that the top context does not change when doing
5558 // callbacks or interceptor calls. 5574 // callbacks or interceptor calls.
5559 AssertNoContextChange ncc; 5575 AssertNoContextChange ncc;
5560 HandleScope scope; 5576 HandleScope scope;
5561 Handle<InterceptorInfo> interceptor(GetIndexedInterceptor()); 5577 Handle<InterceptorInfo> interceptor(GetIndexedInterceptor());
5562 Handle<JSObject> this_handle(this); 5578 Handle<JSObject> this_handle(this);
5563 Handle<Object> value_handle(value); 5579 Handle<Object> value_handle(value);
5564 if (!interceptor->setter()->IsUndefined()) { 5580 if (!interceptor->setter()->IsUndefined()) {
5565 v8::IndexedPropertySetter setter = 5581 v8::IndexedPropertySetter setter =
5566 v8::ToCData<v8::IndexedPropertySetter>(interceptor->setter()); 5582 v8::ToCData<v8::IndexedPropertySetter>(interceptor->setter());
5567 Handle<Object> data_handle(interceptor->data());
5568 LOG(ApiIndexedPropertyAccess("interceptor-indexed-set", this, index)); 5583 LOG(ApiIndexedPropertyAccess("interceptor-indexed-set", this, index));
5569 v8::AccessorInfo info(v8::Utils::ToLocal(this_handle), 5584 CustomArguments args(interceptor->data(), this, this);
5570 v8::Utils::ToLocal(data_handle), 5585 v8::AccessorInfo info(args.end());
5571 v8::Utils::ToLocal(this_handle));
5572 v8::Handle<v8::Value> result; 5586 v8::Handle<v8::Value> result;
5573 { 5587 {
5574 // Leaving JavaScript. 5588 // Leaving JavaScript.
5575 VMState state(EXTERNAL); 5589 VMState state(EXTERNAL);
5576 result = setter(index, v8::Utils::ToLocal(value_handle), info); 5590 result = setter(index, v8::Utils::ToLocal(value_handle), info);
5577 } 5591 }
5578 RETURN_IF_SCHEDULED_EXCEPTION(); 5592 RETURN_IF_SCHEDULED_EXCEPTION();
5579 if (!result.IsEmpty()) return *value_handle; 5593 if (!result.IsEmpty()) return *value_handle;
5580 } 5594 }
5581 Object* raw_result = 5595 Object* raw_result =
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after
5829 uint32_t index) { 5843 uint32_t index) {
5830 // Make sure that the top context does not change when doing 5844 // Make sure that the top context does not change when doing
5831 // callbacks or interceptor calls. 5845 // callbacks or interceptor calls.
5832 AssertNoContextChange ncc; 5846 AssertNoContextChange ncc;
5833 HandleScope scope; 5847 HandleScope scope;
5834 Handle<InterceptorInfo> interceptor(GetIndexedInterceptor()); 5848 Handle<InterceptorInfo> interceptor(GetIndexedInterceptor());
5835 Handle<JSObject> this_handle(receiver); 5849 Handle<JSObject> this_handle(receiver);
5836 Handle<JSObject> holder_handle(this); 5850 Handle<JSObject> holder_handle(this);
5837 5851
5838 if (!interceptor->getter()->IsUndefined()) { 5852 if (!interceptor->getter()->IsUndefined()) {
5839 Handle<Object> data_handle(interceptor->data());
5840 v8::IndexedPropertyGetter getter = 5853 v8::IndexedPropertyGetter getter =
5841 v8::ToCData<v8::IndexedPropertyGetter>(interceptor->getter()); 5854 v8::ToCData<v8::IndexedPropertyGetter>(interceptor->getter());
5842 LOG(ApiIndexedPropertyAccess("interceptor-indexed-get", this, index)); 5855 LOG(ApiIndexedPropertyAccess("interceptor-indexed-get", this, index));
5843 v8::AccessorInfo info(v8::Utils::ToLocal(this_handle), 5856 CustomArguments args(interceptor->data(), receiver, this);
5844 v8::Utils::ToLocal(data_handle), 5857 v8::AccessorInfo info(args.end());
5845 v8::Utils::ToLocal(holder_handle));
5846 v8::Handle<v8::Value> result; 5858 v8::Handle<v8::Value> result;
5847 { 5859 {
5848 // Leaving JavaScript. 5860 // Leaving JavaScript.
5849 VMState state(EXTERNAL); 5861 VMState state(EXTERNAL);
5850 result = getter(index, info); 5862 result = getter(index, info);
5851 } 5863 }
5852 RETURN_IF_SCHEDULED_EXCEPTION(); 5864 RETURN_IF_SCHEDULED_EXCEPTION();
5853 if (!result.IsEmpty()) return *v8::Utils::OpenHandle(*result); 5865 if (!result.IsEmpty()) return *v8::Utils::OpenHandle(*result);
5854 } 5866 }
5855 5867
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after
6067 6079
6068 Object* JSObject::GetPropertyWithInterceptor( 6080 Object* JSObject::GetPropertyWithInterceptor(
6069 JSObject* receiver, 6081 JSObject* receiver,
6070 String* name, 6082 String* name,
6071 PropertyAttributes* attributes) { 6083 PropertyAttributes* attributes) {
6072 InterceptorInfo* interceptor = GetNamedInterceptor(); 6084 InterceptorInfo* interceptor = GetNamedInterceptor();
6073 HandleScope scope; 6085 HandleScope scope;
6074 Handle<JSObject> receiver_handle(receiver); 6086 Handle<JSObject> receiver_handle(receiver);
6075 Handle<JSObject> holder_handle(this); 6087 Handle<JSObject> holder_handle(this);
6076 Handle<String> name_handle(name); 6088 Handle<String> name_handle(name);
6077 Handle<Object> data_handle(interceptor->data());
6078 6089
6079 if (!interceptor->getter()->IsUndefined()) { 6090 if (!interceptor->getter()->IsUndefined()) {
6080 v8::NamedPropertyGetter getter = 6091 v8::NamedPropertyGetter getter =
6081 v8::ToCData<v8::NamedPropertyGetter>(interceptor->getter()); 6092 v8::ToCData<v8::NamedPropertyGetter>(interceptor->getter());
6082 LOG(ApiNamedPropertyAccess("interceptor-named-get", *holder_handle, name)); 6093 LOG(ApiNamedPropertyAccess("interceptor-named-get", *holder_handle, name));
6083 v8::AccessorInfo info(v8::Utils::ToLocal(receiver_handle), 6094 CustomArguments args(interceptor->data(), receiver, this);
6084 v8::Utils::ToLocal(data_handle), 6095 v8::AccessorInfo info(args.end());
6085 v8::Utils::ToLocal(holder_handle));
6086 v8::Handle<v8::Value> result; 6096 v8::Handle<v8::Value> result;
6087 { 6097 {
6088 // Leaving JavaScript. 6098 // Leaving JavaScript.
6089 VMState state(EXTERNAL); 6099 VMState state(EXTERNAL);
6090 result = getter(v8::Utils::ToLocal(name_handle), info); 6100 result = getter(v8::Utils::ToLocal(name_handle), info);
6091 } 6101 }
6092 RETURN_IF_SCHEDULED_EXCEPTION(); 6102 RETURN_IF_SCHEDULED_EXCEPTION();
6093 if (!result.IsEmpty()) { 6103 if (!result.IsEmpty()) {
6094 *attributes = NONE; 6104 *attributes = NONE;
6095 return *v8::Utils::OpenHandle(*result); 6105 return *v8::Utils::OpenHandle(*result);
(...skipping 1867 matching lines...) Expand 10 before | Expand all | Expand 10 after
7963 if (break_point_objects()->IsUndefined()) return 0; 7973 if (break_point_objects()->IsUndefined()) return 0;
7964 // Single beak point. 7974 // Single beak point.
7965 if (!break_point_objects()->IsFixedArray()) return 1; 7975 if (!break_point_objects()->IsFixedArray()) return 1;
7966 // Multiple break points. 7976 // Multiple break points.
7967 return FixedArray::cast(break_point_objects())->length(); 7977 return FixedArray::cast(break_point_objects())->length();
7968 } 7978 }
7969 #endif 7979 #endif
7970 7980
7971 7981
7972 } } // namespace v8::internal 7982 } } // namespace v8::internal
OLDNEW
« src/objects.h ('K') | « src/objects.h ('k') | src/stub-cache.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698