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

Side by Side Diff: src/runtime.cc

Issue 593073002: Stores and compound assignments for named super properties. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: CR feedback Created 6 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 | Annotate | Revision Log
OLDNEW
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 <stdlib.h> 5 #include <stdlib.h>
6 #include <limits> 6 #include <limits>
7 7
8 #include "src/v8.h" 8 #include "src/v8.h"
9 9
10 #include "src/accessors.h" 10 #include "src/accessors.h"
(...skipping 2065 matching lines...) Expand 10 before | Expand all | Expand 10 after
2076 2076
2077 RUNTIME_FUNCTION(Runtime_HomeObjectSymbol) { 2077 RUNTIME_FUNCTION(Runtime_HomeObjectSymbol) {
2078 DCHECK(args.length() == 0); 2078 DCHECK(args.length() == 0);
2079 return isolate->heap()->home_object_symbol(); 2079 return isolate->heap()->home_object_symbol();
2080 } 2080 }
2081 2081
2082 2082
2083 RUNTIME_FUNCTION(Runtime_LoadFromSuper) { 2083 RUNTIME_FUNCTION(Runtime_LoadFromSuper) {
2084 HandleScope scope(isolate); 2084 HandleScope scope(isolate);
2085 DCHECK(args.length() == 3); 2085 DCHECK(args.length() == 3);
2086 CONVERT_ARG_HANDLE_CHECKED(JSObject, home_object, 0); 2086 CONVERT_ARG_HANDLE_CHECKED(Object, receiver, 0);
2087 CONVERT_ARG_HANDLE_CHECKED(Object, receiver, 1); 2087 CONVERT_ARG_HANDLE_CHECKED(JSObject, home_object, 1);
2088 CONVERT_ARG_HANDLE_CHECKED(Name, name, 2); 2088 CONVERT_ARG_HANDLE_CHECKED(Name, name, 2);
2089 2089
2090 if (home_object->IsAccessCheckNeeded() && 2090 if (home_object->IsAccessCheckNeeded() &&
2091 !isolate->MayNamedAccess(home_object, name, v8::ACCESS_GET)) { 2091 !isolate->MayNamedAccess(home_object, name, v8::ACCESS_GET)) {
2092 isolate->ReportFailedAccessCheck(home_object, v8::ACCESS_GET); 2092 isolate->ReportFailedAccessCheck(home_object, v8::ACCESS_GET);
2093 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate); 2093 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate);
2094 } 2094 }
2095 2095
2096 PrototypeIterator iter(isolate, home_object); 2096 PrototypeIterator iter(isolate, home_object);
2097 Handle<Object> proto = PrototypeIterator::GetCurrent(iter); 2097 Handle<Object> proto = PrototypeIterator::GetCurrent(iter);
2098 if (!proto->IsJSReceiver()) return isolate->heap()->undefined_value(); 2098 if (!proto->IsJSReceiver()) return isolate->heap()->undefined_value();
2099 2099
2100 LookupIterator it(receiver, name, Handle<JSReceiver>::cast(proto)); 2100 LookupIterator it(receiver, name, Handle<JSReceiver>::cast(proto));
2101 Handle<Object> result; 2101 Handle<Object> result;
2102 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, Object::GetProperty(&it)); 2102 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, Object::GetProperty(&it));
2103 return *result; 2103 return *result;
2104 } 2104 }
2105 2105
2106 2106
2107 static Object* StoreToSuper(Isolate* isolate, Handle<JSObject> home_object,
2108 Handle<Object> receiver, Handle<Name> name,
2109 Handle<Object> value, StrictMode strict_mode) {
2110 if (home_object->IsAccessCheckNeeded() &&
2111 !isolate->MayNamedAccess(home_object, name, v8::ACCESS_SET)) {
2112 isolate->ReportFailedAccessCheck(home_object, v8::ACCESS_SET);
2113 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate);
2114 }
2115
2116 PrototypeIterator iter(isolate, home_object);
2117 Handle<Object> proto = PrototypeIterator::GetCurrent(iter);
2118 if (!proto->IsJSReceiver()) return isolate->heap()->undefined_value();
2119
2120 LookupIterator it(receiver, name, Handle<JSReceiver>::cast(proto));
2121 Handle<Object> result;
2122 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
2123 isolate, result,
2124 Object::SetProperty(&it, value, strict_mode,
2125 Object::CERTAINLY_NOT_STORE_FROM_KEYED,
2126 Object::SUPER_PROPERTY));
2127 return *result;
2128 }
2129
2130
2131 RUNTIME_FUNCTION(Runtime_StoreToSuper_Strict) {
2132 HandleScope scope(isolate);
2133 DCHECK(args.length() == 4);
2134 CONVERT_ARG_HANDLE_CHECKED(Object, receiver, 0);
2135 CONVERT_ARG_HANDLE_CHECKED(JSObject, home_object, 1);
2136 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2);
2137 CONVERT_ARG_HANDLE_CHECKED(Name, name, 3);
2138
2139 return StoreToSuper(isolate, home_object, receiver, name, value, STRICT);
2140 }
2141
2142
2143 RUNTIME_FUNCTION(Runtime_StoreToSuper_Sloppy) {
2144 HandleScope scope(isolate);
2145 DCHECK(args.length() == 4);
2146 CONVERT_ARG_HANDLE_CHECKED(Object, receiver, 0);
2147 CONVERT_ARG_HANDLE_CHECKED(JSObject, home_object, 1);
2148 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2);
2149 CONVERT_ARG_HANDLE_CHECKED(Name, name, 3);
2150
2151 return StoreToSuper(isolate, home_object, receiver, name, value, SLOPPY);
2152 }
2153
2154
2107 RUNTIME_FUNCTION(Runtime_IsExtensible) { 2155 RUNTIME_FUNCTION(Runtime_IsExtensible) {
2108 SealHandleScope shs(isolate); 2156 SealHandleScope shs(isolate);
2109 DCHECK(args.length() == 1); 2157 DCHECK(args.length() == 1);
2110 CONVERT_ARG_CHECKED(JSObject, obj, 0); 2158 CONVERT_ARG_CHECKED(JSObject, obj, 0);
2111 if (obj->IsJSGlobalProxy()) { 2159 if (obj->IsJSGlobalProxy()) {
2112 PrototypeIterator iter(isolate, obj); 2160 PrototypeIterator iter(isolate, obj);
2113 if (iter.IsAtEnd()) return isolate->heap()->false_value(); 2161 if (iter.IsAtEnd()) return isolate->heap()->false_value();
2114 DCHECK(iter.GetCurrent()->IsJSGlobalObject()); 2162 DCHECK(iter.GetCurrent()->IsJSGlobalObject());
2115 obj = JSObject::cast(iter.GetCurrent()); 2163 obj = JSObject::cast(iter.GetCurrent());
2116 } 2164 }
(...skipping 13631 matching lines...) Expand 10 before | Expand all | Expand 10 after
15748 } 15796 }
15749 return NULL; 15797 return NULL;
15750 } 15798 }
15751 15799
15752 15800
15753 const Runtime::Function* Runtime::FunctionForId(Runtime::FunctionId id) { 15801 const Runtime::Function* Runtime::FunctionForId(Runtime::FunctionId id) {
15754 return &(kIntrinsicFunctions[static_cast<int>(id)]); 15802 return &(kIntrinsicFunctions[static_cast<int>(id)]);
15755 } 15803 }
15756 15804
15757 } } // namespace v8::internal 15805 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/runtime.h ('k') | test/mjsunit/harmony/super.js » ('j') | test/mjsunit/harmony/super.js » ('J')

Powered by Google App Engine
This is Rietveld 408576698