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/runtime.cc

Issue 227573002: Return MaybeHandle from SetElement and DeleteElement. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 8 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/runtime.h ('k') | src/scopes.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 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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 4906 matching lines...) Expand 10 before | Expand all | Expand 10 after
4917 } else { 4917 } else {
4918 bool has_pending_exception = false; 4918 bool has_pending_exception = false;
4919 Handle<Object> converted = 4919 Handle<Object> converted =
4920 Execution::ToString(isolate, key, &has_pending_exception); 4920 Execution::ToString(isolate, key, &has_pending_exception);
4921 if (has_pending_exception) return Handle<Name>(); 4921 if (has_pending_exception) return Handle<Name>();
4922 return Handle<Name>::cast(converted); 4922 return Handle<Name>::cast(converted);
4923 } 4923 }
4924 } 4924 }
4925 4925
4926 4926
4927 MaybeObject* Runtime::HasObjectProperty(Isolate* isolate, 4927 MaybeHandle<Object> Runtime::HasObjectProperty(Isolate* isolate,
4928 Handle<JSReceiver> object, 4928 Handle<JSReceiver> object,
4929 Handle<Object> key) { 4929 Handle<Object> key) {
4930 HandleScope scope(isolate);
4931
4932 // Check if the given key is an array index. 4930 // Check if the given key is an array index.
4933 uint32_t index; 4931 uint32_t index;
4934 if (key->ToArrayIndex(&index)) { 4932 if (key->ToArrayIndex(&index)) {
4935 return isolate->heap()->ToBoolean(JSReceiver::HasElement(object, index)); 4933 return isolate->factory()->ToBoolean(JSReceiver::HasElement(object, index));
4936 } 4934 }
4937 4935
4938 // Convert the key to a name - possibly by calling back into JavaScript. 4936 // Convert the key to a name - possibly by calling back into JavaScript.
4939 Handle<Name> name = ToName(isolate, key); 4937 Handle<Name> name = ToName(isolate, key);
4940 RETURN_IF_EMPTY_HANDLE(isolate, name); 4938 RETURN_IF_EMPTY_HANDLE_VALUE(isolate, name, MaybeHandle<Object>());
4941 4939
4942 return isolate->heap()->ToBoolean(JSReceiver::HasProperty(object, name)); 4940 return isolate->factory()->ToBoolean(JSReceiver::HasProperty(object, name));
4943 } 4941 }
4944 4942
4945 4943
4946 Handle<Object> Runtime::GetObjectProperty(Isolate* isolate, 4944 Handle<Object> Runtime::GetObjectProperty(Isolate* isolate,
4947 Handle<Object> object, 4945 Handle<Object> object,
4948 Handle<Object> key) { 4946 Handle<Object> key) {
4949 if (object->IsUndefined() || object->IsNull()) { 4947 if (object->IsUndefined() || object->IsNull()) {
4950 Handle<Object> args[2] = { key, object }; 4948 Handle<Object> args[2] = { key, object };
4951 isolate->Throw(*isolate->factory()->NewTypeError("non_object_property_load", 4949 isolate->Throw(*isolate->factory()->NewTypeError("non_object_property_load",
4952 HandleVector(args, 2))); 4950 HandleVector(args, 2)));
(...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after
5245 isolate->factory()->NewTypeError("non_object_property_store", 5243 isolate->factory()->NewTypeError("non_object_property_store",
5246 HandleVector(args, 2)); 5244 HandleVector(args, 2));
5247 isolate->Throw(*error); 5245 isolate->Throw(*error);
5248 return Handle<Object>(); 5246 return Handle<Object>();
5249 } 5247 }
5250 5248
5251 if (object->IsJSProxy()) { 5249 if (object->IsJSProxy()) {
5252 bool has_pending_exception = false; 5250 bool has_pending_exception = false;
5253 Handle<Object> name_object = key->IsSymbol() 5251 Handle<Object> name_object = key->IsSymbol()
5254 ? key : Execution::ToString(isolate, key, &has_pending_exception); 5252 ? key : Execution::ToString(isolate, key, &has_pending_exception);
5255 if (has_pending_exception) return Handle<Object>(); // exception 5253 if (has_pending_exception) return MaybeHandle<Object>(); // exception
5256 Handle<Name> name = Handle<Name>::cast(name_object); 5254 Handle<Name> name = Handle<Name>::cast(name_object);
5257 return JSReceiver::SetProperty(Handle<JSProxy>::cast(object), name, value, 5255 return JSReceiver::SetProperty(Handle<JSProxy>::cast(object), name, value,
5258 attr, 5256 attr,
5259 strict_mode); 5257 strict_mode);
5260 } 5258 }
5261 5259
5262 // If the object isn't a JavaScript object, we ignore the store. 5260 // If the object isn't a JavaScript object, we ignore the store.
5263 if (!object->IsJSObject()) return value; 5261 if (!object->IsJSObject()) return value;
5264 5262
5265 Handle<JSObject> js_object = Handle<JSObject>::cast(object); 5263 Handle<JSObject> js_object = Handle<JSObject>::cast(object);
(...skipping 12 matching lines...) Expand all
5278 return value; 5276 return value;
5279 } 5277 }
5280 5278
5281 JSObject::ValidateElements(js_object); 5279 JSObject::ValidateElements(js_object);
5282 if (js_object->HasExternalArrayElements() || 5280 if (js_object->HasExternalArrayElements() ||
5283 js_object->HasFixedTypedArrayElements()) { 5281 js_object->HasFixedTypedArrayElements()) {
5284 if (!value->IsNumber() && !value->IsUndefined()) { 5282 if (!value->IsNumber() && !value->IsUndefined()) {
5285 bool has_exception; 5283 bool has_exception;
5286 Handle<Object> number = 5284 Handle<Object> number =
5287 Execution::ToNumber(isolate, value, &has_exception); 5285 Execution::ToNumber(isolate, value, &has_exception);
5288 if (has_exception) return Handle<Object>(); // exception 5286 if (has_exception) return MaybeHandle<Object>(); // exception
5289 value = number; 5287 value = number;
5290 } 5288 }
5291 } 5289 }
5292 Handle<Object> result = JSObject::SetElement(js_object, index, value, attr, 5290
5293 strict_mode, 5291 MaybeHandle<Object> result = JSObject::SetElement(
5294 true, 5292 js_object, index, value, attr, strict_mode, true, set_mode);
5295 set_mode);
5296 JSObject::ValidateElements(js_object); 5293 JSObject::ValidateElements(js_object);
5294
5297 return result.is_null() ? result : value; 5295 return result.is_null() ? result : value;
5298 } 5296 }
5299 5297
5300 if (key->IsName()) { 5298 if (key->IsName()) {
5301 Handle<Name> name = Handle<Name>::cast(key); 5299 Handle<Name> name = Handle<Name>::cast(key);
5302 if (name->AsArrayIndex(&index)) { 5300 if (name->AsArrayIndex(&index)) {
5303 if (js_object->HasExternalArrayElements()) { 5301 if (js_object->HasExternalArrayElements()) {
5304 if (!value->IsNumber() && !value->IsUndefined()) { 5302 if (!value->IsNumber() && !value->IsUndefined()) {
5305 bool has_exception; 5303 bool has_exception;
5306 Handle<Object> number = 5304 Handle<Object> number =
5307 Execution::ToNumber(isolate, value, &has_exception); 5305 Execution::ToNumber(isolate, value, &has_exception);
5308 if (has_exception) return Handle<Object>(); // exception 5306 if (has_exception) return MaybeHandle<Object>(); // exception
5309 value = number; 5307 value = number;
5310 } 5308 }
5311 } 5309 }
5312 return JSObject::SetElement(js_object, index, value, attr, strict_mode, 5310 return JSObject::SetElement(js_object, index, value, attr,
5313 true, 5311 strict_mode, true, set_mode);
5314 set_mode);
5315 } else { 5312 } else {
5316 if (name->IsString()) Handle<String>::cast(name)->TryFlatten(); 5313 if (name->IsString()) Handle<String>::cast(name)->TryFlatten();
5317 return JSReceiver::SetProperty(js_object, name, value, attr, strict_mode); 5314 return JSReceiver::SetProperty(js_object, name, value, attr, strict_mode);
5318 } 5315 }
5319 } 5316 }
5320 5317
5321 // Call-back into JavaScript to convert the key to a string. 5318 // Call-back into JavaScript to convert the key to a string.
5322 bool has_pending_exception = false; 5319 bool has_pending_exception = false;
5323 Handle<Object> converted = 5320 Handle<Object> converted =
5324 Execution::ToString(isolate, key, &has_pending_exception); 5321 Execution::ToString(isolate, key, &has_pending_exception);
5325 if (has_pending_exception) return Handle<Object>(); // exception 5322 if (has_pending_exception) return MaybeHandle<Object>(); // exception
5326 Handle<String> name = Handle<String>::cast(converted); 5323 Handle<String> name = Handle<String>::cast(converted);
5327 5324
5328 if (name->AsArrayIndex(&index)) { 5325 if (name->AsArrayIndex(&index)) {
5329 return JSObject::SetElement(js_object, index, value, attr, strict_mode, 5326 return JSObject::SetElement(js_object, index, value, attr,
5330 true, 5327 strict_mode, true, set_mode);
5331 set_mode);
5332 } else { 5328 } else {
5333 return JSReceiver::SetProperty(js_object, name, value, attr, strict_mode); 5329 return JSReceiver::SetProperty(js_object, name, value, attr, strict_mode);
5334 } 5330 }
5335 } 5331 }
5336 5332
5337 5333
5338 MaybeHandle<Object> Runtime::ForceSetObjectProperty(Handle<JSObject> js_object, 5334 MaybeHandle<Object> Runtime::ForceSetObjectProperty(Handle<JSObject> js_object,
5339 Handle<Object> key, 5335 Handle<Object> key,
5340 Handle<Object> value, 5336 Handle<Object> value,
5341 PropertyAttributes attr) { 5337 PropertyAttributes attr) {
5342 Isolate* isolate = js_object->GetIsolate(); 5338 Isolate* isolate = js_object->GetIsolate();
5343 // Check if the given key is an array index. 5339 // Check if the given key is an array index.
5344 uint32_t index; 5340 uint32_t index;
5345 if (key->ToArrayIndex(&index)) { 5341 if (key->ToArrayIndex(&index)) {
5346 // In Firefox/SpiderMonkey, Safari and Opera you can access the characters 5342 // In Firefox/SpiderMonkey, Safari and Opera you can access the characters
5347 // of a string using [] notation. We need to support this too in 5343 // of a string using [] notation. We need to support this too in
5348 // JavaScript. 5344 // JavaScript.
5349 // In the case of a String object we just need to redirect the assignment to 5345 // In the case of a String object we just need to redirect the assignment to
5350 // the underlying string if the index is in range. Since the underlying 5346 // the underlying string if the index is in range. Since the underlying
5351 // string does nothing with the assignment then we can ignore such 5347 // string does nothing with the assignment then we can ignore such
5352 // assignments. 5348 // assignments.
5353 if (js_object->IsStringObjectWithCharacterAt(index)) { 5349 if (js_object->IsStringObjectWithCharacterAt(index)) {
5354 return value; 5350 return value;
5355 } 5351 }
5356 5352
5357 return JSObject::SetElement(js_object, index, value, attr, SLOPPY, 5353 return JSObject::SetElement(js_object, index, value, attr,
5358 false, 5354 SLOPPY, false, DEFINE_PROPERTY);
5359 DEFINE_PROPERTY);
5360 } 5355 }
5361 5356
5362 if (key->IsName()) { 5357 if (key->IsName()) {
5363 Handle<Name> name = Handle<Name>::cast(key); 5358 Handle<Name> name = Handle<Name>::cast(key);
5364 if (name->AsArrayIndex(&index)) { 5359 if (name->AsArrayIndex(&index)) {
5365 return JSObject::SetElement(js_object, index, value, attr, SLOPPY, 5360 return JSObject::SetElement(js_object, index, value, attr,
5366 false, 5361 SLOPPY, false, DEFINE_PROPERTY);
5367 DEFINE_PROPERTY);
5368 } else { 5362 } else {
5369 if (name->IsString()) Handle<String>::cast(name)->TryFlatten(); 5363 if (name->IsString()) Handle<String>::cast(name)->TryFlatten();
5370 return JSObject::SetLocalPropertyIgnoreAttributes(js_object, name, 5364 return JSObject::SetLocalPropertyIgnoreAttributes(js_object, name,
5371 value, attr); 5365 value, attr);
5372 } 5366 }
5373 } 5367 }
5374 5368
5375 // Call-back into JavaScript to convert the key to a string. 5369 // Call-back into JavaScript to convert the key to a string.
5376 bool has_pending_exception = false; 5370 bool has_pending_exception = false;
5377 Handle<Object> converted = 5371 Handle<Object> converted =
5378 Execution::ToString(isolate, key, &has_pending_exception); 5372 Execution::ToString(isolate, key, &has_pending_exception);
5379 if (has_pending_exception) return Handle<Object>(); // exception 5373 if (has_pending_exception) return MaybeHandle<Object>(); // exception
5380 Handle<String> name = Handle<String>::cast(converted); 5374 Handle<String> name = Handle<String>::cast(converted);
5381 5375
5382 if (name->AsArrayIndex(&index)) { 5376 if (name->AsArrayIndex(&index)) {
5383 return JSObject::SetElement(js_object, index, value, attr, SLOPPY, 5377 return JSObject::SetElement(js_object, index, value, attr,
5384 false, 5378 SLOPPY, false, DEFINE_PROPERTY);
5385 DEFINE_PROPERTY);
5386 } else { 5379 } else {
5387 return JSObject::SetLocalPropertyIgnoreAttributes(js_object, name, value, 5380 return JSObject::SetLocalPropertyIgnoreAttributes(js_object, name, value,
5388 attr); 5381 attr);
5389 } 5382 }
5390 } 5383 }
5391 5384
5392 5385
5393 MaybeObject* Runtime::DeleteObjectProperty(Isolate* isolate, 5386 MaybeHandle<Object> Runtime::DeleteObjectProperty(Isolate* isolate,
5394 Handle<JSReceiver> receiver, 5387 Handle<JSReceiver> receiver,
5395 Handle<Object> key, 5388 Handle<Object> key,
5396 JSReceiver::DeleteMode mode) { 5389 JSReceiver::DeleteMode mode) {
5397 HandleScope scope(isolate);
5398
5399 // Check if the given key is an array index. 5390 // Check if the given key is an array index.
5400 uint32_t index; 5391 uint32_t index;
5401 if (key->ToArrayIndex(&index)) { 5392 if (key->ToArrayIndex(&index)) {
5402 // In Firefox/SpiderMonkey, Safari and Opera you can access the 5393 // In Firefox/SpiderMonkey, Safari and Opera you can access the
5403 // characters of a string using [] notation. In the case of a 5394 // characters of a string using [] notation. In the case of a
5404 // String object we just need to redirect the deletion to the 5395 // String object we just need to redirect the deletion to the
5405 // underlying string if the index is in range. Since the 5396 // underlying string if the index is in range. Since the
5406 // underlying string does nothing with the deletion, we can ignore 5397 // underlying string does nothing with the deletion, we can ignore
5407 // such deletions. 5398 // such deletions.
5408 if (receiver->IsStringObjectWithCharacterAt(index)) { 5399 if (receiver->IsStringObjectWithCharacterAt(index)) {
5409 return isolate->heap()->true_value(); 5400 return isolate->factory()->true_value();
5410 } 5401 }
5411 5402
5412 Handle<Object> result = JSReceiver::DeleteElement(receiver, index, mode); 5403 return JSReceiver::DeleteElement(receiver, index, mode);
5413 RETURN_IF_EMPTY_HANDLE(isolate, result);
5414 return *result;
5415 } 5404 }
5416 5405
5417 Handle<Name> name; 5406 Handle<Name> name;
5418 if (key->IsName()) { 5407 if (key->IsName()) {
5419 name = Handle<Name>::cast(key); 5408 name = Handle<Name>::cast(key);
5420 } else { 5409 } else {
5421 // Call-back into JavaScript to convert the key to a string. 5410 // Call-back into JavaScript to convert the key to a string.
5422 bool has_pending_exception = false; 5411 bool has_pending_exception = false;
5423 Handle<Object> converted = Execution::ToString( 5412 Handle<Object> converted = Execution::ToString(
5424 isolate, key, &has_pending_exception); 5413 isolate, key, &has_pending_exception);
5425 if (has_pending_exception) return Failure::Exception(); 5414 if (has_pending_exception) return MaybeHandle<Object>();
5426 name = Handle<String>::cast(converted); 5415 name = Handle<String>::cast(converted);
5427 } 5416 }
5428 5417
5429 if (name->IsString()) Handle<String>::cast(name)->TryFlatten(); 5418 if (name->IsString()) Handle<String>::cast(name)->TryFlatten();
5430 Handle<Object> result = JSReceiver::DeleteProperty(receiver, name, mode); 5419 return JSReceiver::DeleteProperty(receiver, name, mode);
5431 RETURN_IF_EMPTY_HANDLE(isolate, result);
5432 return *result;
5433 } 5420 }
5434 5421
5435 5422
5436 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetHiddenProperty) { 5423 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetHiddenProperty) {
5437 HandleScope scope(isolate); 5424 HandleScope scope(isolate);
5438 RUNTIME_ASSERT(args.length() == 3); 5425 RUNTIME_ASSERT(args.length() == 3);
5439 5426
5440 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); 5427 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0);
5441 CONVERT_ARG_HANDLE_CHECKED(String, key, 1); 5428 CONVERT_ARG_HANDLE_CHECKED(String, key, 1);
5442 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); 5429 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2);
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after
5637 5624
5638 5625
5639 RUNTIME_FUNCTION(MaybeObject*, Runtime_DeleteProperty) { 5626 RUNTIME_FUNCTION(MaybeObject*, Runtime_DeleteProperty) {
5640 HandleScope scope(isolate); 5627 HandleScope scope(isolate);
5641 ASSERT(args.length() == 3); 5628 ASSERT(args.length() == 3);
5642 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, object, 0); 5629 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, object, 0);
5643 CONVERT_ARG_HANDLE_CHECKED(Name, key, 1); 5630 CONVERT_ARG_HANDLE_CHECKED(Name, key, 1);
5644 CONVERT_STRICT_MODE_ARG_CHECKED(strict_mode, 2); 5631 CONVERT_STRICT_MODE_ARG_CHECKED(strict_mode, 2);
5645 JSReceiver::DeleteMode delete_mode = strict_mode == STRICT 5632 JSReceiver::DeleteMode delete_mode = strict_mode == STRICT
5646 ? JSReceiver::STRICT_DELETION : JSReceiver::NORMAL_DELETION; 5633 ? JSReceiver::STRICT_DELETION : JSReceiver::NORMAL_DELETION;
5647 Handle<Object> result = JSReceiver::DeleteProperty(object, key, delete_mode); 5634 Handle<Object> result;
5648 RETURN_IF_EMPTY_HANDLE(isolate, result); 5635 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
5636 isolate, result,
5637 JSReceiver::DeleteProperty(object, key, delete_mode));
5649 return *result; 5638 return *result;
5650 } 5639 }
5651 5640
5652 5641
5653 static MaybeObject* HasLocalPropertyImplementation(Isolate* isolate, 5642 static MaybeObject* HasLocalPropertyImplementation(Isolate* isolate,
5654 Handle<JSObject> object, 5643 Handle<JSObject> object,
5655 Handle<Name> key) { 5644 Handle<Name> key) {
5656 if (JSReceiver::HasLocalProperty(object, key)) { 5645 if (JSReceiver::HasLocalProperty(object, key)) {
5657 return isolate->heap()->true_value(); 5646 return isolate->heap()->true_value();
5658 } 5647 }
(...skipping 3552 matching lines...) Expand 10 before | Expand all | Expand 10 after
9211 9200
9212 // If the slot was found in a context, it should be DONT_DELETE. 9201 // If the slot was found in a context, it should be DONT_DELETE.
9213 if (holder->IsContext()) { 9202 if (holder->IsContext()) {
9214 return isolate->heap()->false_value(); 9203 return isolate->heap()->false_value();
9215 } 9204 }
9216 9205
9217 // The slot was found in a JSObject, either a context extension object, 9206 // The slot was found in a JSObject, either a context extension object,
9218 // the global object, or the subject of a with. Try to delete it 9207 // the global object, or the subject of a with. Try to delete it
9219 // (respecting DONT_DELETE). 9208 // (respecting DONT_DELETE).
9220 Handle<JSObject> object = Handle<JSObject>::cast(holder); 9209 Handle<JSObject> object = Handle<JSObject>::cast(holder);
9221 Handle<Object> result = JSReceiver::DeleteProperty(object, name); 9210 Handle<Object> result;
9222 RETURN_IF_EMPTY_HANDLE(isolate, result); 9211 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
9212 isolate, result,
9213 JSReceiver::DeleteProperty(object, name));
9223 return *result; 9214 return *result;
9224 } 9215 }
9225 9216
9226 9217
9227 // A mechanism to return a pair of Object pointers in registers (if possible). 9218 // A mechanism to return a pair of Object pointers in registers (if possible).
9228 // How this is achieved is calling convention-dependent. 9219 // How this is achieved is calling convention-dependent.
9229 // All currently supported x86 compiles uses calling conventions that are cdecl 9220 // All currently supported x86 compiles uses calling conventions that are cdecl
9230 // variants where a 64-bit value is returned in two 32-bit registers 9221 // variants where a 64-bit value is returned in two 32-bit registers
9231 // (edx:eax on ia32, r1:r0 on ARM). 9222 // (edx:eax on ia32, r1:r0 on ARM).
9232 // In AMD-64 calling convention a struct of two pointers is returned in rdx:rax. 9223 // In AMD-64 calling convention a struct of two pointers is returned in rdx:rax.
(...skipping 694 matching lines...) Expand 10 before | Expand all | Expand 10 after
9927 CONVERT_ARG_HANDLE_CHECKED(JSArray, array, 0); 9918 CONVERT_ARG_HANDLE_CHECKED(JSArray, array, 0);
9928 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, element, 1); 9919 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, element, 1);
9929 RUNTIME_ASSERT(array->HasFastSmiOrObjectElements()); 9920 RUNTIME_ASSERT(array->HasFastSmiOrObjectElements());
9930 int length = Smi::cast(array->length())->value(); 9921 int length = Smi::cast(array->length())->value();
9931 FixedArray* elements = FixedArray::cast(array->elements()); 9922 FixedArray* elements = FixedArray::cast(array->elements());
9932 for (int i = 0; i < length; i++) { 9923 for (int i = 0; i < length; i++) {
9933 if (elements->get(i) == *element) return isolate->heap()->false_value(); 9924 if (elements->get(i) == *element) return isolate->heap()->false_value();
9934 } 9925 }
9935 9926
9936 // Strict not needed. Used for cycle detection in Array join implementation. 9927 // Strict not needed. Used for cycle detection in Array join implementation.
9937 RETURN_IF_EMPTY_HANDLE(isolate, JSObject::SetFastElement(array, length, 9928 RETURN_FAILURE_ON_EXCEPTION(
9938 element, 9929 isolate,
9939 SLOPPY, 9930 JSObject::SetFastElement(array, length, element, SLOPPY, true));
9940 true));
9941 return isolate->heap()->true_value(); 9931 return isolate->heap()->true_value();
9942 } 9932 }
9943 9933
9944 9934
9945 /** 9935 /**
9946 * A simple visitor visits every element of Array's. 9936 * A simple visitor visits every element of Array's.
9947 * The backend storage can be a fixed array for fast elements case, 9937 * The backend storage can be a fixed array for fast elements case,
9948 * or a dictionary for sparse array. Since Dictionary is a subtype 9938 * or a dictionary for sparse array. Since Dictionary is a subtype
9949 * of FixedArray, the class can be used by both fast and slow cases. 9939 * of FixedArray, the class can be used by both fast and slow cases.
9950 * The second parameter of the constructor, fast_elements, specifies 9940 * The second parameter of the constructor, fast_elements, specifies
(...skipping 2335 matching lines...) Expand 10 before | Expand all | Expand 10 after
12286 } else { 12276 } else {
12287 JavaScriptFrameIterator additional_frame_it(isolate, break_frame_id); 12277 JavaScriptFrameIterator additional_frame_it(isolate, break_frame_id);
12288 // If our frame is a top frame and we are stepping, we can do step-in 12278 // If our frame is a top frame and we are stepping, we can do step-in
12289 // at this place. 12279 // at this place.
12290 accept = additional_frame_it.frame()->id() == id; 12280 accept = additional_frame_it.frame()->id() == id;
12291 } 12281 }
12292 } 12282 }
12293 if (accept) { 12283 if (accept) {
12294 if (break_location_iterator.IsStepInLocation(isolate)) { 12284 if (break_location_iterator.IsStepInLocation(isolate)) {
12295 Smi* position_value = Smi::FromInt(break_location_iterator.position()); 12285 Smi* position_value = Smi::FromInt(break_location_iterator.position());
12296 JSObject::SetElement(array, len, 12286 RETURN_FAILURE_ON_EXCEPTION(
12297 Handle<Object>(position_value, isolate), 12287 isolate,
12298 NONE, SLOPPY); 12288 JSObject::SetElement(array, len,
12289 Handle<Object>(position_value, isolate),
12290 NONE, SLOPPY));
12299 len++; 12291 len++;
12300 } 12292 }
12301 } 12293 }
12302 // Advance iterator. 12294 // Advance iterator.
12303 break_location_iterator.Next(); 12295 break_location_iterator.Next();
12304 if (current_statement_pos != 12296 if (current_statement_pos !=
12305 break_location_iterator.statement_position()) { 12297 break_location_iterator.statement_position()) {
12306 break; 12298 break;
12307 } 12299 }
12308 } 12300 }
(...skipping 2928 matching lines...) Expand 10 before | Expand all | Expand 10 after
15237 } 15229 }
15238 } 15230 }
15239 15231
15240 15232
15241 void Runtime::OutOfMemory() { 15233 void Runtime::OutOfMemory() {
15242 Heap::FatalProcessOutOfMemory("CALL_AND_RETRY_LAST", true); 15234 Heap::FatalProcessOutOfMemory("CALL_AND_RETRY_LAST", true);
15243 UNREACHABLE(); 15235 UNREACHABLE();
15244 } 15236 }
15245 15237
15246 } } // namespace v8::internal 15238 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/runtime.h ('k') | src/scopes.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698