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

Side by Side Diff: src/runtime.cc

Issue 7795055: Make integer indexed properties ("elements") work for proxies. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Oops. Created 9 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-inl.h ('k') | src/runtime.js » ('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 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 4175 matching lines...) Expand 10 before | Expand all | Expand 10 after
4186 HandleScope scope(isolate); 4186 HandleScope scope(isolate);
4187 4187
4188 if (object->IsUndefined() || object->IsNull()) { 4188 if (object->IsUndefined() || object->IsNull()) {
4189 Handle<Object> args[2] = { key, object }; 4189 Handle<Object> args[2] = { key, object };
4190 Handle<Object> error = 4190 Handle<Object> error =
4191 isolate->factory()->NewTypeError("non_object_property_store", 4191 isolate->factory()->NewTypeError("non_object_property_store",
4192 HandleVector(args, 2)); 4192 HandleVector(args, 2));
4193 return isolate->Throw(*error); 4193 return isolate->Throw(*error);
4194 } 4194 }
4195 4195
4196 if (object->IsJSProxy()) {
4197 bool has_pending_exception = false;
4198 Handle<Object> name = Execution::ToString(key, &has_pending_exception);
4199 if (has_pending_exception) return Failure::Exception();
4200 return JSProxy::cast(*object)->SetProperty(
4201 String::cast(*name), *value, attr, strict_mode);
4202 }
4203
4196 // If the object isn't a JavaScript object, we ignore the store. 4204 // If the object isn't a JavaScript object, we ignore the store.
4197 if (!object->IsJSObject()) return *value; 4205 if (!object->IsJSObject()) return *value;
4198 4206
4199 Handle<JSObject> js_object = Handle<JSObject>::cast(object); 4207 Handle<JSObject> js_object = Handle<JSObject>::cast(object);
4200 4208
4201 // Check if the given key is an array index. 4209 // Check if the given key is an array index.
4202 uint32_t index; 4210 uint32_t index;
4203 if (key->ToArrayIndex(&index)) { 4211 if (key->ToArrayIndex(&index)) {
4204 // In Firefox/SpiderMonkey, Safari and Opera you can access the characters 4212 // In Firefox/SpiderMonkey, Safari and Opera you can access the characters
4205 // of a string using [] notation. We need to support this too in 4213 // of a string using [] notation. We need to support this too in
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
4305 } 4313 }
4306 4314
4307 4315
4308 MaybeObject* Runtime::ForceDeleteObjectProperty(Isolate* isolate, 4316 MaybeObject* Runtime::ForceDeleteObjectProperty(Isolate* isolate,
4309 Handle<JSReceiver> receiver, 4317 Handle<JSReceiver> receiver,
4310 Handle<Object> key) { 4318 Handle<Object> key) {
4311 HandleScope scope(isolate); 4319 HandleScope scope(isolate);
4312 4320
4313 // Check if the given key is an array index. 4321 // Check if the given key is an array index.
4314 uint32_t index; 4322 uint32_t index;
4315 if (receiver->IsJSObject() && key->ToArrayIndex(&index)) { 4323 if (key->ToArrayIndex(&index)) {
4316 // In Firefox/SpiderMonkey, Safari and Opera you can access the 4324 // In Firefox/SpiderMonkey, Safari and Opera you can access the
4317 // characters of a string using [] notation. In the case of a 4325 // characters of a string using [] notation. In the case of a
4318 // String object we just need to redirect the deletion to the 4326 // String object we just need to redirect the deletion to the
4319 // underlying string if the index is in range. Since the 4327 // underlying string if the index is in range. Since the
4320 // underlying string does nothing with the deletion, we can ignore 4328 // underlying string does nothing with the deletion, we can ignore
4321 // such deletions. 4329 // such deletions.
4322 if (receiver->IsStringObjectWithCharacterAt(index)) { 4330 if (receiver->IsStringObjectWithCharacterAt(index)) {
4323 return isolate->heap()->true_value(); 4331 return isolate->heap()->true_value();
4324 } 4332 }
4325 4333
4326 return JSObject::cast(*receiver)->DeleteElement( 4334 return receiver->DeleteElement(index, JSReceiver::FORCE_DELETION);
4327 index, JSReceiver::FORCE_DELETION);
4328 } 4335 }
4329 4336
4330 Handle<String> key_string; 4337 Handle<String> key_string;
4331 if (key->IsString()) { 4338 if (key->IsString()) {
4332 key_string = Handle<String>::cast(key); 4339 key_string = Handle<String>::cast(key);
4333 } else { 4340 } else {
4334 // Call-back into JavaScript to convert the key to a string. 4341 // Call-back into JavaScript to convert the key to a string.
4335 bool has_pending_exception = false; 4342 bool has_pending_exception = false;
4336 Handle<Object> converted = Execution::ToString(key, &has_pending_exception); 4343 Handle<Object> converted = Execution::ToString(key, &has_pending_exception);
4337 if (has_pending_exception) return Failure::Exception(); 4344 if (has_pending_exception) return Failure::Exception();
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
4479 return isolate->heap()->true_value(); 4486 return isolate->heap()->true_value();
4480 } 4487 }
4481 } 4488 }
4482 return isolate->heap()->false_value(); 4489 return isolate->heap()->false_value();
4483 } 4490 }
4484 4491
4485 4492
4486 RUNTIME_FUNCTION(MaybeObject*, Runtime_HasProperty) { 4493 RUNTIME_FUNCTION(MaybeObject*, Runtime_HasProperty) {
4487 NoHandleAllocation na; 4494 NoHandleAllocation na;
4488 ASSERT(args.length() == 2); 4495 ASSERT(args.length() == 2);
4496 CONVERT_CHECKED(JSReceiver, receiver, args[0]);
4497 CONVERT_CHECKED(String, key, args[1]);
4489 4498
4490 // Only JS receivers can have properties. 4499 bool result = receiver->HasProperty(key);
4491 if (args[0]->IsJSReceiver()) { 4500 if (isolate->has_pending_exception()) return Failure::Exception();
4492 JSReceiver* receiver = JSReceiver::cast(args[0]); 4501 return isolate->heap()->ToBoolean(result);
4493 CONVERT_CHECKED(String, key, args[1]);
4494 bool result = receiver->HasProperty(key);
4495 if (isolate->has_pending_exception()) return Failure::Exception();
4496 return isolate->heap()->ToBoolean(result);
4497 }
4498 return isolate->heap()->false_value();
4499 } 4502 }
4500 4503
4501 4504
4502 RUNTIME_FUNCTION(MaybeObject*, Runtime_HasElement) { 4505 RUNTIME_FUNCTION(MaybeObject*, Runtime_HasElement) {
4503 NoHandleAllocation na; 4506 NoHandleAllocation na;
4504 ASSERT(args.length() == 2); 4507 ASSERT(args.length() == 2);
4508 CONVERT_CHECKED(JSReceiver, receiver, args[0]);
4509 CONVERT_CHECKED(Smi, index, args[1]);
4505 4510
4506 // Only JS objects can have elements. 4511 bool result = receiver->HasElement(index->value());
4507 if (args[0]->IsJSObject()) { 4512 if (isolate->has_pending_exception()) return Failure::Exception();
4508 JSObject* object = JSObject::cast(args[0]); 4513 return isolate->heap()->ToBoolean(result);
4509 CONVERT_CHECKED(Smi, index_obj, args[1]);
4510 uint32_t index = index_obj->value();
4511 if (object->HasElement(index)) return isolate->heap()->true_value();
4512 }
4513 return isolate->heap()->false_value();
4514 } 4514 }
4515 4515
4516 4516
4517 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsPropertyEnumerable) { 4517 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsPropertyEnumerable) {
4518 NoHandleAllocation ha; 4518 NoHandleAllocation ha;
4519 ASSERT(args.length() == 2); 4519 ASSERT(args.length() == 2);
4520 4520
4521 CONVERT_CHECKED(JSObject, object, args[0]); 4521 CONVERT_CHECKED(JSObject, object, args[0]);
4522 CONVERT_CHECKED(String, key, args[1]); 4522 CONVERT_CHECKED(String, key, args[1]);
4523 4523
(...skipping 8353 matching lines...) Expand 10 before | Expand all | Expand 10 after
12877 } else { 12877 } else {
12878 // Handle last resort GC and make sure to allow future allocations 12878 // Handle last resort GC and make sure to allow future allocations
12879 // to grow the heap without causing GCs (if possible). 12879 // to grow the heap without causing GCs (if possible).
12880 isolate->counters()->gc_last_resort_from_js()->Increment(); 12880 isolate->counters()->gc_last_resort_from_js()->Increment();
12881 isolate->heap()->CollectAllGarbage(false); 12881 isolate->heap()->CollectAllGarbage(false);
12882 } 12882 }
12883 } 12883 }
12884 12884
12885 12885
12886 } } // namespace v8::internal 12886 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/objects-inl.h ('k') | src/runtime.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698