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

Side by Side Diff: src/objects.cc

Issue 24176002: Handlify JSReceiver::SetPropertyWithDefinedSetter method. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years, 3 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 | Annotate | Revision Log
« no previous file with comments | « src/objects.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 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 2801 matching lines...) Expand 10 before | Expand all | Expand 10 after
2812 v8::Utils::ToLocal(key), 2812 v8::Utils::ToLocal(key),
2813 v8::Utils::ToLocal(value)); 2813 v8::Utils::ToLocal(value));
2814 RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object); 2814 RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object);
2815 return value; 2815 return value;
2816 } 2816 }
2817 2817
2818 if (structure->IsAccessorPair()) { 2818 if (structure->IsAccessorPair()) {
2819 Handle<Object> setter(AccessorPair::cast(*structure)->setter(), isolate); 2819 Handle<Object> setter(AccessorPair::cast(*structure)->setter(), isolate);
2820 if (setter->IsSpecFunction()) { 2820 if (setter->IsSpecFunction()) {
2821 // TODO(rossberg): nicer would be to cast to some JSCallable here... 2821 // TODO(rossberg): nicer would be to cast to some JSCallable here...
2822 CALL_HEAP_FUNCTION(isolate, 2822 return SetPropertyWithDefinedSetter(
2823 object->SetPropertyWithDefinedSetter( 2823 object, Handle<JSReceiver>::cast(setter), value);
2824 JSReceiver::cast(*setter), *value),
2825 Object);
2826 } else { 2824 } else {
2827 if (strict_mode == kNonStrictMode) { 2825 if (strict_mode == kNonStrictMode) {
2828 return value; 2826 return value;
2829 } 2827 }
2830 Handle<Object> args[2] = { name, holder }; 2828 Handle<Object> args[2] = { name, holder };
2831 Handle<Object> error = 2829 Handle<Object> error =
2832 isolate->factory()->NewTypeError("no_setter_in_callback", 2830 isolate->factory()->NewTypeError("no_setter_in_callback",
2833 HandleVector(args, 2)); 2831 HandleVector(args, 2));
2834 isolate->Throw(*error); 2832 isolate->Throw(*error);
2835 return Handle<Object>(); 2833 return Handle<Object>();
2836 } 2834 }
2837 } 2835 }
2838 2836
2839 // TODO(dcarney): Handle correctly. 2837 // TODO(dcarney): Handle correctly.
2840 if (structure->IsDeclaredAccessorInfo()) { 2838 if (structure->IsDeclaredAccessorInfo()) {
2841 return value; 2839 return value;
2842 } 2840 }
2843 2841
2844 UNREACHABLE(); 2842 UNREACHABLE();
2845 return Handle<Object>(); 2843 return Handle<Object>();
2846 } 2844 }
2847 2845
2848 2846
2849 MaybeObject* JSReceiver::SetPropertyWithDefinedSetter(JSReceiver* setter, 2847 Handle<Object> JSReceiver::SetPropertyWithDefinedSetter(
2850 Object* value) { 2848 Handle<JSReceiver> object,
2851 Isolate* isolate = GetIsolate(); 2849 Handle<JSReceiver> setter,
2852 Handle<Object> value_handle(value, isolate); 2850 Handle<Object> value) {
2853 Handle<JSReceiver> fun(setter, isolate); 2851 Isolate* isolate = object->GetIsolate();
2854 Handle<JSReceiver> self(this, isolate); 2852
2855 #ifdef ENABLE_DEBUGGER_SUPPORT 2853 #ifdef ENABLE_DEBUGGER_SUPPORT
2856 Debug* debug = isolate->debug(); 2854 Debug* debug = isolate->debug();
2857 // Handle stepping into a setter if step into is active. 2855 // Handle stepping into a setter if step into is active.
2858 // TODO(rossberg): should this apply to getters that are function proxies? 2856 // TODO(rossberg): should this apply to getters that are function proxies?
2859 if (debug->StepInActive() && fun->IsJSFunction()) { 2857 if (debug->StepInActive() && setter->IsJSFunction()) {
2860 debug->HandleStepIn( 2858 debug->HandleStepIn(
2861 Handle<JSFunction>::cast(fun), Handle<Object>::null(), 0, false); 2859 Handle<JSFunction>::cast(setter), Handle<Object>::null(), 0, false);
2862 } 2860 }
2863 #endif 2861 #endif
2864 bool has_pending_exception; 2862 bool has_pending_exception;
2865 Handle<Object> argv[] = { value_handle }; 2863 Handle<Object> argv[] = { value };
2866 Execution::Call( 2864 Execution::Call(
2867 isolate, fun, self, ARRAY_SIZE(argv), argv, &has_pending_exception); 2865 isolate, setter, object, ARRAY_SIZE(argv), argv, &has_pending_exception);
2868 // Check for pending exception and return the result. 2866 // Check for pending exception and return the result.
2869 if (has_pending_exception) return Failure::Exception(); 2867 if (has_pending_exception) return Handle<Object>();
2870 return *value_handle; 2868 return value;
2871 } 2869 }
2872 2870
2873 2871
2874 MaybeObject* JSObject::SetElementWithCallbackSetterInPrototypes( 2872 MaybeObject* JSObject::SetElementWithCallbackSetterInPrototypes(
2875 uint32_t index, 2873 uint32_t index,
2876 Object* value, 2874 Object* value,
2877 bool* found, 2875 bool* found,
2878 StrictModeFlag strict_mode) { 2876 StrictModeFlag strict_mode) {
2879 Heap* heap = GetHeap(); 2877 Heap* heap = GetHeap();
2880 for (Object* pt = GetPrototype(); 2878 for (Object* pt = GetPrototype();
(...skipping 652 matching lines...) Expand 10 before | Expand all | Expand 10 after
3533 return Handle<Object>(); 3531 return Handle<Object>();
3534 } 3532 }
3535 3533
3536 // We have an AccessorDescriptor. 3534 // We have an AccessorDescriptor.
3537 Handle<String> set_name = isolate->factory()->InternalizeOneByteString( 3535 Handle<String> set_name = isolate->factory()->InternalizeOneByteString(
3538 STATIC_ASCII_VECTOR("set_")); 3536 STATIC_ASCII_VECTOR("set_"));
3539 Handle<Object> setter(v8::internal::GetProperty(isolate, desc, set_name)); 3537 Handle<Object> setter(v8::internal::GetProperty(isolate, desc, set_name));
3540 ASSERT(!isolate->has_pending_exception()); 3538 ASSERT(!isolate->has_pending_exception());
3541 if (!setter->IsUndefined()) { 3539 if (!setter->IsUndefined()) {
3542 // TODO(rossberg): nicer would be to cast to some JSCallable here... 3540 // TODO(rossberg): nicer would be to cast to some JSCallable here...
3543 CALL_HEAP_FUNCTION(isolate, 3541 return SetPropertyWithDefinedSetter(
3544 receiver->SetPropertyWithDefinedSetter( 3542 receiver, Handle<JSReceiver>::cast(setter), value);
3545 JSReceiver::cast(*setter), *value),
3546 Object);
3547 } 3543 }
3548 3544
3549 if (strict_mode == kNonStrictMode) return value; 3545 if (strict_mode == kNonStrictMode) return value;
3550 Handle<Object> args2[] = { name, proxy }; 3546 Handle<Object> args2[] = { name, proxy };
3551 Handle<Object> error = isolate->factory()->NewTypeError( 3547 Handle<Object> error = isolate->factory()->NewTypeError(
3552 "no_setter_in_callback", HandleVector(args2, ARRAY_SIZE(args2))); 3548 "no_setter_in_callback", HandleVector(args2, ARRAY_SIZE(args2)));
3553 isolate->Throw(*error); 3549 isolate->Throw(*error);
3554 return Handle<Object>(); 3550 return Handle<Object>();
3555 } 3551 }
3556 3552
(...skipping 8152 matching lines...) Expand 10 before | Expand all | Expand 10 after
11709 v8::Utils::ToLocal(key), 11705 v8::Utils::ToLocal(key),
11710 v8::Utils::ToLocal(value)); 11706 v8::Utils::ToLocal(value));
11711 RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object); 11707 RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object);
11712 return value; 11708 return value;
11713 } 11709 }
11714 11710
11715 if (structure->IsAccessorPair()) { 11711 if (structure->IsAccessorPair()) {
11716 Handle<Object> setter(AccessorPair::cast(*structure)->setter(), isolate); 11712 Handle<Object> setter(AccessorPair::cast(*structure)->setter(), isolate);
11717 if (setter->IsSpecFunction()) { 11713 if (setter->IsSpecFunction()) {
11718 // TODO(rossberg): nicer would be to cast to some JSCallable here... 11714 // TODO(rossberg): nicer would be to cast to some JSCallable here...
11719 CALL_HEAP_FUNCTION(isolate, 11715 return SetPropertyWithDefinedSetter(
11720 object->SetPropertyWithDefinedSetter( 11716 object, Handle<JSReceiver>::cast(setter), value);
11721 JSReceiver::cast(*setter), *value),
11722 Object);
11723 } else { 11717 } else {
11724 if (strict_mode == kNonStrictMode) { 11718 if (strict_mode == kNonStrictMode) {
11725 return value; 11719 return value;
11726 } 11720 }
11727 Handle<Object> key(isolate->factory()->NewNumberFromUint(index)); 11721 Handle<Object> key(isolate->factory()->NewNumberFromUint(index));
11728 Handle<Object> args[2] = { key, holder }; 11722 Handle<Object> args[2] = { key, holder };
11729 Handle<Object> error = isolate->factory()->NewTypeError( 11723 Handle<Object> error = isolate->factory()->NewTypeError(
11730 "no_setter_in_callback", HandleVector(args, 2)); 11724 "no_setter_in_callback", HandleVector(args, 2));
11731 isolate->Throw(*error); 11725 isolate->Throw(*error);
11732 return Handle<Object>(); 11726 return Handle<Object>();
(...skipping 4371 matching lines...) Expand 10 before | Expand all | Expand 10 after
16104 #define ERROR_MESSAGES_TEXTS(C, T) T, 16098 #define ERROR_MESSAGES_TEXTS(C, T) T,
16105 static const char* error_messages_[] = { 16099 static const char* error_messages_[] = {
16106 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) 16100 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS)
16107 }; 16101 };
16108 #undef ERROR_MESSAGES_TEXTS 16102 #undef ERROR_MESSAGES_TEXTS
16109 return error_messages_[reason]; 16103 return error_messages_[reason];
16110 } 16104 }
16111 16105
16112 16106
16113 } } // namespace v8::internal 16107 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/objects.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698