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

Side by Side Diff: src/objects.cc

Issue 368853003: Remove special ExecutableAccessorInfo handling based on flag (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Fix Created 6 years, 5 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') | src/runtime.cc » ('j') | 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 // 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 "src/v8.h" 5 #include "src/v8.h"
6 6
7 #include "src/accessors.h" 7 #include "src/accessors.h"
8 #include "src/allocation-site-scopes.h" 8 #include "src/allocation-site-scopes.h"
9 #include "src/api.h" 9 #include "src/api.h"
10 #include "src/arguments.h" 10 #include "src/arguments.h"
(...skipping 4186 matching lines...) Expand 10 before | Expand all | Expand 10 after
4197 // callback setter removed. The two lines looking up the LookupResult 4197 // callback setter removed. The two lines looking up the LookupResult
4198 // result are also added. If one of the functions is changed, the other 4198 // result are also added. If one of the functions is changed, the other
4199 // should be. 4199 // should be.
4200 MaybeHandle<Object> JSObject::SetOwnPropertyIgnoreAttributes( 4200 MaybeHandle<Object> JSObject::SetOwnPropertyIgnoreAttributes(
4201 Handle<JSObject> object, 4201 Handle<JSObject> object,
4202 Handle<Name> name, 4202 Handle<Name> name,
4203 Handle<Object> value, 4203 Handle<Object> value,
4204 PropertyAttributes attributes, 4204 PropertyAttributes attributes,
4205 StoreMode mode, 4205 StoreMode mode,
4206 ExtensibilityCheck extensibility_check, 4206 ExtensibilityCheck extensibility_check,
4207 StoreFromKeyed store_from_keyed, 4207 StoreFromKeyed store_from_keyed) {
4208 ExecutableAccessorInfoHandling handling) {
4209 Isolate* isolate = object->GetIsolate(); 4208 Isolate* isolate = object->GetIsolate();
4210 4209
4211 // Make sure that the top context does not change when doing callbacks or 4210 // Make sure that the top context does not change when doing callbacks or
4212 // interceptor calls. 4211 // interceptor calls.
4213 AssertNoContextChange ncc(isolate); 4212 AssertNoContextChange ncc(isolate);
4214 4213
4215 LookupResult lookup(isolate); 4214 LookupResult lookup(isolate);
4216 object->LookupOwn(name, &lookup, true); 4215 object->LookupOwn(name, &lookup, true);
4217 if (!lookup.IsFound()) { 4216 if (!lookup.IsFound()) {
4218 object->map()->LookupTransition(*object, *name, &lookup); 4217 object->map()->LookupTransition(*object, *name, &lookup);
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
4253 PropertyAttributes old_attributes = ABSENT; 4252 PropertyAttributes old_attributes = ABSENT;
4254 bool is_observed = object->map()->is_observed() && 4253 bool is_observed = object->map()->is_observed() &&
4255 *name != isolate->heap()->hidden_string(); 4254 *name != isolate->heap()->hidden_string();
4256 if (is_observed && lookup.IsProperty()) { 4255 if (is_observed && lookup.IsProperty()) {
4257 if (lookup.IsDataProperty()) { 4256 if (lookup.IsDataProperty()) {
4258 old_value = Object::GetPropertyOrElement(object, name).ToHandleChecked(); 4257 old_value = Object::GetPropertyOrElement(object, name).ToHandleChecked();
4259 } 4258 }
4260 old_attributes = lookup.GetAttributes(); 4259 old_attributes = lookup.GetAttributes();
4261 } 4260 }
4262 4261
4263 bool executed_set_prototype = false;
4264
4265 // Check of IsReadOnly removed from here in clone. 4262 // Check of IsReadOnly removed from here in clone.
4266 if (lookup.IsTransition()) { 4263 if (lookup.IsTransition()) {
4267 Handle<Object> result; 4264 Handle<Object> result;
4268 ASSIGN_RETURN_ON_EXCEPTION( 4265 ASSIGN_RETURN_ON_EXCEPTION(
4269 isolate, result, 4266 isolate, result,
4270 SetPropertyUsingTransition( 4267 SetPropertyUsingTransition(
4271 handle(lookup.holder()), &lookup, name, value, attributes), 4268 handle(lookup.holder()), &lookup, name, value, attributes),
4272 Object); 4269 Object);
4273 } else { 4270 } else {
4274 switch (lookup.type()) { 4271 switch (lookup.type()) {
4275 case NORMAL: 4272 case NORMAL:
4276 ReplaceSlowProperty(object, name, value, attributes); 4273 ReplaceSlowProperty(object, name, value, attributes);
4277 break; 4274 break;
4278 case FIELD: 4275 case FIELD:
4279 SetPropertyToFieldWithAttributes(&lookup, name, value, attributes); 4276 SetPropertyToFieldWithAttributes(&lookup, name, value, attributes);
4280 break; 4277 break;
4281 case CONSTANT: 4278 case CONSTANT:
4282 // Only replace the constant if necessary. 4279 // Only replace the constant if necessary.
4283 if (lookup.GetAttributes() != attributes || 4280 if (lookup.GetAttributes() != attributes ||
4284 *value != lookup.GetConstant()) { 4281 *value != lookup.GetConstant()) {
4285 SetPropertyToFieldWithAttributes(&lookup, name, value, attributes); 4282 SetPropertyToFieldWithAttributes(&lookup, name, value, attributes);
4286 } 4283 }
4287 break; 4284 break;
4288 case CALLBACKS: 4285 case CALLBACKS: {
4289 {
4290 Handle<Object> callback(lookup.GetCallbackObject(), isolate); 4286 Handle<Object> callback(lookup.GetCallbackObject(), isolate);
4291 if (callback->IsExecutableAccessorInfo() && 4287 if (callback->IsExecutableAccessorInfo()) {
4292 handling == DONT_FORCE_FIELD) {
4293 Handle<Object> result; 4288 Handle<Object> result;
4294 ASSIGN_RETURN_ON_EXCEPTION( 4289 ASSIGN_RETURN_ON_EXCEPTION(
4295 isolate, result, 4290 isolate, result,
4296 JSObject::SetPropertyWithCallback(object, 4291 JSObject::SetPropertyWithCallback(object,
4297 name, 4292 name,
4298 value, 4293 value,
4299 handle(lookup.holder()), 4294 handle(lookup.holder()),
4300 callback, 4295 callback,
4301 STRICT), 4296 STRICT),
4302 Object); 4297 Object);
4303 4298
4304 if (attributes != lookup.GetAttributes()) { 4299 if (attributes == lookup.GetAttributes()) return result;
4305 Handle<ExecutableAccessorInfo> new_data = 4300
4306 Accessors::CloneAccessor( 4301 Handle<ExecutableAccessorInfo> new_data =
4307 isolate, Handle<ExecutableAccessorInfo>::cast(callback)); 4302 Accessors::CloneAccessor(
4308 new_data->set_property_attributes(attributes); 4303 isolate, Handle<ExecutableAccessorInfo>::cast(callback));
4309 if (attributes & READ_ONLY) { 4304 new_data->set_property_attributes(attributes);
4310 // This way we don't have to introduce a lookup to the setter, 4305 // This way we don't have to introduce a lookup to the setter, simply
4311 // simply make it unavailable to reflect the attributes. 4306 // make it unavailable to reflect the attributes.
4312 new_data->clear_setter(); 4307 if (attributes & READ_ONLY) new_data->clear_setter();
4308 SetPropertyCallback(object, name, new_data, attributes);
4309
4310 if (is_observed) {
4311 Handle<Object> new_value =
4312 Object::GetPropertyOrElement(object, name).ToHandleChecked();
4313 if (old_value->SameValue(*new_value)) {
4314 old_value = isolate->factory()->the_hole_value();
4313 } 4315 }
4316 EnqueueChangeRecord(object, "reconfigure", name, old_value);
4317 }
4314 4318
4315 SetPropertyCallback(object, name, new_data, attributes); 4319 return result;
4316 }
4317 if (is_observed) {
4318 // If we are setting the prototype of a function and are observed,
4319 // don't send change records because the prototype handles that
4320 // itself.
4321 executed_set_prototype = object->IsJSFunction() &&
4322 String::Equals(isolate->factory()->prototype_string(),
4323 Handle<String>::cast(name)) &&
4324 Handle<JSFunction>::cast(object)->should_have_prototype();
4325 }
4326 } else {
4327 ConvertAndSetOwnProperty(&lookup, name, value, attributes);
4328 } 4320 }
4321 ConvertAndSetOwnProperty(&lookup, name, value, attributes);
4329 break; 4322 break;
4330 } 4323 }
4331 case NONEXISTENT: 4324 case NONEXISTENT:
4332 case HANDLER: 4325 case HANDLER:
4333 case INTERCEPTOR: 4326 case INTERCEPTOR:
4334 UNREACHABLE(); 4327 UNREACHABLE();
4335 } 4328 }
4336 } 4329 }
4337 4330
4338 if (is_observed && !executed_set_prototype) { 4331 if (is_observed) {
4339 if (lookup.IsTransition()) { 4332 if (lookup.IsTransition()) {
4340 EnqueueChangeRecord(object, "add", name, old_value); 4333 EnqueueChangeRecord(object, "add", name, old_value);
4341 } else if (old_value->IsTheHole()) { 4334 } else if (old_value->IsTheHole()) {
4342 EnqueueChangeRecord(object, "reconfigure", name, old_value); 4335 EnqueueChangeRecord(object, "reconfigure", name, old_value);
4343 } else { 4336 } else {
4344 LookupResult new_lookup(isolate); 4337 LookupResult new_lookup(isolate);
4345 object->LookupOwn(name, &new_lookup, true); 4338 object->LookupOwn(name, &new_lookup, true);
4346 bool value_changed = false; 4339 bool value_changed = false;
4347 if (new_lookup.IsDataProperty()) { 4340 if (new_lookup.IsDataProperty()) {
4348 Handle<Object> new_value = 4341 Handle<Object> new_value =
(...skipping 12594 matching lines...) Expand 10 before | Expand all | Expand 10 after
16943 #define ERROR_MESSAGES_TEXTS(C, T) T, 16936 #define ERROR_MESSAGES_TEXTS(C, T) T,
16944 static const char* error_messages_[] = { 16937 static const char* error_messages_[] = {
16945 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) 16938 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS)
16946 }; 16939 };
16947 #undef ERROR_MESSAGES_TEXTS 16940 #undef ERROR_MESSAGES_TEXTS
16948 return error_messages_[reason]; 16941 return error_messages_[reason];
16949 } 16942 }
16950 16943
16951 16944
16952 } } // namespace v8::internal 16945 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/objects.h ('k') | src/runtime.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698