| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |