OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 2855 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2866 NumberDictionary* dictionary = element_dictionary(); | 2866 NumberDictionary* dictionary = element_dictionary(); |
2867 int entry = dictionary->FindEntry(index); | 2867 int entry = dictionary->FindEntry(index); |
2868 if (entry != NumberDictionary::kNotFound) { | 2868 if (entry != NumberDictionary::kNotFound) { |
2869 Object* result = dictionary->DeleteProperty(entry, mode); | 2869 Object* result = dictionary->DeleteProperty(entry, mode); |
2870 if (mode == STRICT_DELETION && result == | 2870 if (mode == STRICT_DELETION && result == |
2871 isolate->heap()->false_value()) { | 2871 isolate->heap()->false_value()) { |
2872 // In strict mode, deleting a non-configurable property throws | 2872 // In strict mode, deleting a non-configurable property throws |
2873 // exception. dictionary->DeleteProperty will return false_value() | 2873 // exception. dictionary->DeleteProperty will return false_value() |
2874 // if a non-configurable property is being deleted. | 2874 // if a non-configurable property is being deleted. |
2875 HandleScope scope; | 2875 HandleScope scope; |
| 2876 Handle<Object> self(this); |
2876 Handle<Object> i = isolate->factory()->NewNumberFromUint(index); | 2877 Handle<Object> i = isolate->factory()->NewNumberFromUint(index); |
2877 Handle<Object> args[2] = { i, Handle<Object>(this) }; | 2878 Handle<Object> args[2] = { i, self }; |
2878 return isolate->Throw(*isolate->factory()->NewTypeError( | 2879 return isolate->Throw(*isolate->factory()->NewTypeError( |
2879 "strict_delete_property", HandleVector(args, 2))); | 2880 "strict_delete_property", HandleVector(args, 2))); |
2880 } | 2881 } |
2881 } | 2882 } |
2882 break; | 2883 break; |
2883 } | 2884 } |
2884 default: | 2885 default: |
2885 UNREACHABLE(); | 2886 UNREACHABLE(); |
2886 break; | 2887 break; |
2887 } | 2888 } |
(...skipping 4397 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7285 | 7286 |
7286 MaybeObject* JSObject::GetElementWithCallback(Object* receiver, | 7287 MaybeObject* JSObject::GetElementWithCallback(Object* receiver, |
7287 Object* structure, | 7288 Object* structure, |
7288 uint32_t index, | 7289 uint32_t index, |
7289 Object* holder) { | 7290 Object* holder) { |
7290 Isolate* isolate = GetIsolate(); | 7291 Isolate* isolate = GetIsolate(); |
7291 ASSERT(!structure->IsProxy()); | 7292 ASSERT(!structure->IsProxy()); |
7292 | 7293 |
7293 // api style callbacks. | 7294 // api style callbacks. |
7294 if (structure->IsAccessorInfo()) { | 7295 if (structure->IsAccessorInfo()) { |
7295 AccessorInfo* data = AccessorInfo::cast(structure); | 7296 Handle<AccessorInfo> data(AccessorInfo::cast(structure)); |
7296 Object* fun_obj = data->getter(); | 7297 Object* fun_obj = data->getter(); |
7297 v8::AccessorGetter call_fun = v8::ToCData<v8::AccessorGetter>(fun_obj); | 7298 v8::AccessorGetter call_fun = v8::ToCData<v8::AccessorGetter>(fun_obj); |
7298 HandleScope scope(isolate); | 7299 HandleScope scope(isolate); |
7299 Handle<JSObject> self(JSObject::cast(receiver)); | 7300 Handle<JSObject> self(JSObject::cast(receiver)); |
7300 Handle<JSObject> holder_handle(JSObject::cast(holder)); | 7301 Handle<JSObject> holder_handle(JSObject::cast(holder)); |
7301 Handle<Object> number = isolate->factory()->NewNumberFromUint(index); | 7302 Handle<Object> number = isolate->factory()->NewNumberFromUint(index); |
7302 Handle<String> key(isolate->factory()->NumberToString(number)); | 7303 Handle<String> key(isolate->factory()->NumberToString(number)); |
7303 LOG(isolate, ApiNamedPropertyAccess("load", *self, *key)); | 7304 LOG(isolate, ApiNamedPropertyAccess("load", *self, *key)); |
7304 CustomArguments args(isolate, data->data(), *self, *holder_handle); | 7305 CustomArguments args(isolate, data->data(), *self, *holder_handle); |
7305 v8::AccessorInfo info(args.end()); | 7306 v8::AccessorInfo info(args.end()); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7342 ASSERT(!value->IsTheHole()); | 7343 ASSERT(!value->IsTheHole()); |
7343 Handle<Object> value_handle(value, isolate); | 7344 Handle<Object> value_handle(value, isolate); |
7344 | 7345 |
7345 // To accommodate both the old and the new api we switch on the | 7346 // To accommodate both the old and the new api we switch on the |
7346 // data structure used to store the callbacks. Eventually proxy | 7347 // data structure used to store the callbacks. Eventually proxy |
7347 // callbacks should be phased out. | 7348 // callbacks should be phased out. |
7348 ASSERT(!structure->IsProxy()); | 7349 ASSERT(!structure->IsProxy()); |
7349 | 7350 |
7350 if (structure->IsAccessorInfo()) { | 7351 if (structure->IsAccessorInfo()) { |
7351 // api style callbacks | 7352 // api style callbacks |
7352 AccessorInfo* data = AccessorInfo::cast(structure); | 7353 Handle<JSObject> self(this); |
| 7354 Handle<JSObject> holder_handle(JSObject::cast(holder)); |
| 7355 Handle<AccessorInfo> data(AccessorInfo::cast(structure)); |
7353 Object* call_obj = data->setter(); | 7356 Object* call_obj = data->setter(); |
7354 v8::AccessorSetter call_fun = v8::ToCData<v8::AccessorSetter>(call_obj); | 7357 v8::AccessorSetter call_fun = v8::ToCData<v8::AccessorSetter>(call_obj); |
7355 if (call_fun == NULL) return value; | 7358 if (call_fun == NULL) return value; |
7356 Handle<Object> number = isolate->factory()->NewNumberFromUint(index); | 7359 Handle<Object> number = isolate->factory()->NewNumberFromUint(index); |
7357 Handle<String> key(isolate->factory()->NumberToString(number)); | 7360 Handle<String> key(isolate->factory()->NumberToString(number)); |
7358 LOG(isolate, ApiNamedPropertyAccess("store", this, *key)); | 7361 LOG(isolate, ApiNamedPropertyAccess("store", *self, *key)); |
7359 CustomArguments args(isolate, data->data(), this, JSObject::cast(holder)); | 7362 CustomArguments args(isolate, data->data(), *self, *holder_handle); |
7360 v8::AccessorInfo info(args.end()); | 7363 v8::AccessorInfo info(args.end()); |
7361 { | 7364 { |
7362 // Leaving JavaScript. | 7365 // Leaving JavaScript. |
7363 VMState state(isolate, EXTERNAL); | 7366 VMState state(isolate, EXTERNAL); |
7364 call_fun(v8::Utils::ToLocal(key), | 7367 call_fun(v8::Utils::ToLocal(key), |
7365 v8::Utils::ToLocal(value_handle), | 7368 v8::Utils::ToLocal(value_handle), |
7366 info); | 7369 info); |
7367 } | 7370 } |
7368 RETURN_IF_SCHEDULED_EXCEPTION(isolate); | 7371 RETURN_IF_SCHEDULED_EXCEPTION(isolate); |
7369 return *value_handle; | 7372 return *value_handle; |
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7551 if (entry != NumberDictionary::kNotFound) { | 7554 if (entry != NumberDictionary::kNotFound) { |
7552 Object* element = dictionary->ValueAt(entry); | 7555 Object* element = dictionary->ValueAt(entry); |
7553 PropertyDetails details = dictionary->DetailsAt(entry); | 7556 PropertyDetails details = dictionary->DetailsAt(entry); |
7554 if (details.type() == CALLBACKS) { | 7557 if (details.type() == CALLBACKS) { |
7555 return SetElementWithCallback(element, index, value, this); | 7558 return SetElementWithCallback(element, index, value, this); |
7556 } else { | 7559 } else { |
7557 dictionary->UpdateMaxNumberKey(index); | 7560 dictionary->UpdateMaxNumberKey(index); |
7558 // If put fails instrict mode, throw exception. | 7561 // If put fails instrict mode, throw exception. |
7559 if (!dictionary->ValueAtPut(entry, value) && | 7562 if (!dictionary->ValueAtPut(entry, value) && |
7560 strict_mode == kStrictMode) { | 7563 strict_mode == kStrictMode) { |
| 7564 Handle<Object> holder(this); |
7561 Handle<Object> number(isolate->factory()->NewNumberFromUint(index)); | 7565 Handle<Object> number(isolate->factory()->NewNumberFromUint(index)); |
7562 Handle<Object> holder(this); | |
7563 Handle<Object> args[2] = { number, holder }; | 7566 Handle<Object> args[2] = { number, holder }; |
7564 return isolate->Throw( | 7567 return isolate->Throw( |
7565 *isolate->factory()->NewTypeError("strict_read_only_property", | 7568 *isolate->factory()->NewTypeError("strict_read_only_property", |
7566 HandleVector(args, 2))); | 7569 HandleVector(args, 2))); |
7567 } | 7570 } |
7568 } | 7571 } |
7569 } else { | 7572 } else { |
7570 // Index not already used. Look for an accessor in the prototype chain. | 7573 // Index not already used. Look for an accessor in the prototype chain. |
7571 if (check_prototype) { | 7574 if (check_prototype) { |
7572 bool found; | 7575 bool found; |
(...skipping 2854 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10427 if (break_point_objects()->IsUndefined()) return 0; | 10430 if (break_point_objects()->IsUndefined()) return 0; |
10428 // Single beak point. | 10431 // Single beak point. |
10429 if (!break_point_objects()->IsFixedArray()) return 1; | 10432 if (!break_point_objects()->IsFixedArray()) return 1; |
10430 // Multiple break points. | 10433 // Multiple break points. |
10431 return FixedArray::cast(break_point_objects())->length(); | 10434 return FixedArray::cast(break_point_objects())->length(); |
10432 } | 10435 } |
10433 #endif | 10436 #endif |
10434 | 10437 |
10435 | 10438 |
10436 } } // namespace v8::internal | 10439 } } // namespace v8::internal |
OLD | NEW |