OLD | NEW |
---|---|
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 4927 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4938 } else { | 4938 } else { |
4939 bool has_pending_exception = false; | 4939 bool has_pending_exception = false; |
4940 Handle<Object> converted = | 4940 Handle<Object> converted = |
4941 Execution::ToString(isolate, key, &has_pending_exception); | 4941 Execution::ToString(isolate, key, &has_pending_exception); |
4942 if (has_pending_exception) return Handle<Name>(); | 4942 if (has_pending_exception) return Handle<Name>(); |
4943 return Handle<Name>::cast(converted); | 4943 return Handle<Name>::cast(converted); |
4944 } | 4944 } |
4945 } | 4945 } |
4946 | 4946 |
4947 | 4947 |
4948 MaybeObject* Runtime::HasObjectProperty(Isolate* isolate, | 4948 MaybeHandle<Object> Runtime::HasObjectProperty(Isolate* isolate, |
4949 Handle<JSReceiver> object, | 4949 Handle<JSReceiver> object, |
4950 Handle<Object> key) { | 4950 Handle<Object> key) { |
4951 HandleScope scope(isolate); | |
4952 | |
4953 // Check if the given key is an array index. | 4951 // Check if the given key is an array index. |
4954 uint32_t index; | 4952 uint32_t index; |
4955 if (key->ToArrayIndex(&index)) { | 4953 if (key->ToArrayIndex(&index)) { |
4956 return isolate->heap()->ToBoolean(JSReceiver::HasElement(object, index)); | 4954 return isolate->factory()->ToBoolean(JSReceiver::HasElement(object, index)); |
4957 } | 4955 } |
4958 | 4956 |
4959 // Convert the key to a name - possibly by calling back into JavaScript. | 4957 // Convert the key to a name - possibly by calling back into JavaScript. |
4960 Handle<Name> name = ToName(isolate, key); | 4958 Handle<Name> name = ToName(isolate, key); |
4961 RETURN_IF_EMPTY_HANDLE(isolate, name); | 4959 RETURN_IF_EMPTY_HANDLE_VALUE(isolate, name, MaybeHandle<Object>()); |
4962 | 4960 |
4963 return isolate->heap()->ToBoolean(JSReceiver::HasProperty(object, name)); | 4961 return isolate->factory()->ToBoolean(JSReceiver::HasProperty(object, name)); |
4964 } | 4962 } |
4965 | 4963 |
4966 | 4964 |
4967 Handle<Object> Runtime::GetObjectProperty(Isolate* isolate, | 4965 Handle<Object> Runtime::GetObjectProperty(Isolate* isolate, |
4968 Handle<Object> object, | 4966 Handle<Object> object, |
4969 Handle<Object> key) { | 4967 Handle<Object> key) { |
4970 if (object->IsUndefined() || object->IsNull()) { | 4968 if (object->IsUndefined() || object->IsNull()) { |
4971 Handle<Object> args[2] = { key, object }; | 4969 Handle<Object> args[2] = { key, object }; |
4972 isolate->Throw(*isolate->factory()->NewTypeError("non_object_property_load", | 4970 isolate->Throw(*isolate->factory()->NewTypeError("non_object_property_load", |
4973 HandleVector(args, 2))); | 4971 HandleVector(args, 2))); |
(...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5269 isolate->factory()->NewTypeError("non_object_property_store", | 5267 isolate->factory()->NewTypeError("non_object_property_store", |
5270 HandleVector(args, 2)); | 5268 HandleVector(args, 2)); |
5271 isolate->Throw(*error); | 5269 isolate->Throw(*error); |
5272 return Handle<Object>(); | 5270 return Handle<Object>(); |
5273 } | 5271 } |
5274 | 5272 |
5275 if (object->IsJSProxy()) { | 5273 if (object->IsJSProxy()) { |
5276 bool has_pending_exception = false; | 5274 bool has_pending_exception = false; |
5277 Handle<Object> name_object = key->IsSymbol() | 5275 Handle<Object> name_object = key->IsSymbol() |
5278 ? key : Execution::ToString(isolate, key, &has_pending_exception); | 5276 ? key : Execution::ToString(isolate, key, &has_pending_exception); |
5279 if (has_pending_exception) return Handle<Object>(); // exception | 5277 if (has_pending_exception) return MaybeHandle<Object>(); // exception |
5280 Handle<Name> name = Handle<Name>::cast(name_object); | 5278 Handle<Name> name = Handle<Name>::cast(name_object); |
5281 return JSReceiver::SetProperty(Handle<JSProxy>::cast(object), name, value, | 5279 return JSReceiver::SetProperty(Handle<JSProxy>::cast(object), name, value, |
5282 attr, | 5280 attr, |
5283 strict_mode); | 5281 strict_mode); |
5284 } | 5282 } |
5285 | 5283 |
5286 // If the object isn't a JavaScript object, we ignore the store. | 5284 // If the object isn't a JavaScript object, we ignore the store. |
5287 if (!object->IsJSObject()) return value; | 5285 if (!object->IsJSObject()) return value; |
5288 | 5286 |
5289 Handle<JSObject> js_object = Handle<JSObject>::cast(object); | 5287 Handle<JSObject> js_object = Handle<JSObject>::cast(object); |
(...skipping 12 matching lines...) Expand all Loading... | |
5302 return value; | 5300 return value; |
5303 } | 5301 } |
5304 | 5302 |
5305 js_object->ValidateElements(); | 5303 js_object->ValidateElements(); |
5306 if (js_object->HasExternalArrayElements() || | 5304 if (js_object->HasExternalArrayElements() || |
5307 js_object->HasFixedTypedArrayElements()) { | 5305 js_object->HasFixedTypedArrayElements()) { |
5308 if (!value->IsNumber() && !value->IsUndefined()) { | 5306 if (!value->IsNumber() && !value->IsUndefined()) { |
5309 bool has_exception; | 5307 bool has_exception; |
5310 Handle<Object> number = | 5308 Handle<Object> number = |
5311 Execution::ToNumber(isolate, value, &has_exception); | 5309 Execution::ToNumber(isolate, value, &has_exception); |
5312 if (has_exception) return Handle<Object>(); // exception | 5310 if (has_exception) return MaybeHandle<Object>(); // exception |
5313 value = number; | 5311 value = number; |
5314 } | 5312 } |
5315 } | 5313 } |
5316 Handle<Object> result = JSObject::SetElement(js_object, index, value, attr, | 5314 MaybeHandle<Object> result = |
5317 strict_mode, | 5315 JSObject::SetElement(js_object, index, value, attr, |
Igor Sheludko
2014/04/07 15:32:31
I would fix identation of this line.
Yang
2014/04/08 06:51:42
Done.
| |
5318 true, | 5316 strict_mode, true, set_mode); |
5319 set_mode); | |
5320 js_object->ValidateElements(); | 5317 js_object->ValidateElements(); |
5321 return result.is_null() ? result : value; | 5318 return result.is_null() ? result : value; |
5322 } | 5319 } |
5323 | 5320 |
5324 if (key->IsName()) { | 5321 if (key->IsName()) { |
5325 Handle<Name> name = Handle<Name>::cast(key); | 5322 Handle<Name> name = Handle<Name>::cast(key); |
5326 if (name->AsArrayIndex(&index)) { | 5323 if (name->AsArrayIndex(&index)) { |
5327 if (js_object->HasExternalArrayElements()) { | 5324 if (js_object->HasExternalArrayElements()) { |
5328 if (!value->IsNumber() && !value->IsUndefined()) { | 5325 if (!value->IsNumber() && !value->IsUndefined()) { |
5329 bool has_exception; | 5326 bool has_exception; |
5330 Handle<Object> number = | 5327 Handle<Object> number = |
5331 Execution::ToNumber(isolate, value, &has_exception); | 5328 Execution::ToNumber(isolate, value, &has_exception); |
5332 if (has_exception) return Handle<Object>(); // exception | 5329 if (has_exception) return MaybeHandle<Object>(); // exception |
5333 value = number; | 5330 value = number; |
5334 } | 5331 } |
5335 } | 5332 } |
5336 return JSObject::SetElement(js_object, index, value, attr, strict_mode, | 5333 return JSObject::SetElement(js_object, index, value, attr, |
5337 true, | 5334 strict_mode, true, set_mode); |
5338 set_mode); | |
5339 } else { | 5335 } else { |
5340 if (name->IsString()) Handle<String>::cast(name)->TryFlatten(); | 5336 if (name->IsString()) Handle<String>::cast(name)->TryFlatten(); |
5341 return JSReceiver::SetProperty(js_object, name, value, attr, strict_mode); | 5337 return JSReceiver::SetProperty(js_object, name, value, attr, strict_mode); |
5342 } | 5338 } |
5343 } | 5339 } |
5344 | 5340 |
5345 // Call-back into JavaScript to convert the key to a string. | 5341 // Call-back into JavaScript to convert the key to a string. |
5346 bool has_pending_exception = false; | 5342 bool has_pending_exception = false; |
5347 Handle<Object> converted = | 5343 Handle<Object> converted = |
5348 Execution::ToString(isolate, key, &has_pending_exception); | 5344 Execution::ToString(isolate, key, &has_pending_exception); |
5349 if (has_pending_exception) return Handle<Object>(); // exception | 5345 if (has_pending_exception) return MaybeHandle<Object>(); // exception |
5350 Handle<String> name = Handle<String>::cast(converted); | 5346 Handle<String> name = Handle<String>::cast(converted); |
5351 | 5347 |
5352 if (name->AsArrayIndex(&index)) { | 5348 if (name->AsArrayIndex(&index)) { |
5353 return JSObject::SetElement(js_object, index, value, attr, strict_mode, | 5349 return JSObject::SetElement(js_object, index, value, attr, |
5354 true, | 5350 strict_mode, true, set_mode); |
5355 set_mode); | |
5356 } else { | 5351 } else { |
5357 return JSReceiver::SetProperty(js_object, name, value, attr, strict_mode); | 5352 return JSReceiver::SetProperty(js_object, name, value, attr, strict_mode); |
5358 } | 5353 } |
5359 } | 5354 } |
5360 | 5355 |
5361 | 5356 |
5362 MaybeHandle<Object> Runtime::ForceSetObjectProperty(Handle<JSObject> js_object, | 5357 MaybeHandle<Object> Runtime::ForceSetObjectProperty(Handle<JSObject> js_object, |
5363 Handle<Object> key, | 5358 Handle<Object> key, |
5364 Handle<Object> value, | 5359 Handle<Object> value, |
5365 PropertyAttributes attr) { | 5360 PropertyAttributes attr) { |
5366 Isolate* isolate = js_object->GetIsolate(); | 5361 Isolate* isolate = js_object->GetIsolate(); |
5367 // Check if the given key is an array index. | 5362 // Check if the given key is an array index. |
5368 uint32_t index; | 5363 uint32_t index; |
5369 if (key->ToArrayIndex(&index)) { | 5364 if (key->ToArrayIndex(&index)) { |
5370 // In Firefox/SpiderMonkey, Safari and Opera you can access the characters | 5365 // In Firefox/SpiderMonkey, Safari and Opera you can access the characters |
5371 // of a string using [] notation. We need to support this too in | 5366 // of a string using [] notation. We need to support this too in |
5372 // JavaScript. | 5367 // JavaScript. |
5373 // In the case of a String object we just need to redirect the assignment to | 5368 // In the case of a String object we just need to redirect the assignment to |
5374 // the underlying string if the index is in range. Since the underlying | 5369 // the underlying string if the index is in range. Since the underlying |
5375 // string does nothing with the assignment then we can ignore such | 5370 // string does nothing with the assignment then we can ignore such |
5376 // assignments. | 5371 // assignments. |
5377 if (js_object->IsStringObjectWithCharacterAt(index)) { | 5372 if (js_object->IsStringObjectWithCharacterAt(index)) { |
5378 return value; | 5373 return value; |
5379 } | 5374 } |
5380 | 5375 |
5381 return JSObject::SetElement(js_object, index, value, attr, SLOPPY, | 5376 return JSObject::SetElement(js_object, index, value, attr, |
5382 false, | 5377 SLOPPY, false, DEFINE_PROPERTY); |
5383 DEFINE_PROPERTY); | |
5384 } | 5378 } |
5385 | 5379 |
5386 if (key->IsName()) { | 5380 if (key->IsName()) { |
5387 Handle<Name> name = Handle<Name>::cast(key); | 5381 Handle<Name> name = Handle<Name>::cast(key); |
5388 if (name->AsArrayIndex(&index)) { | 5382 if (name->AsArrayIndex(&index)) { |
5389 return JSObject::SetElement(js_object, index, value, attr, SLOPPY, | 5383 return JSObject::SetElement(js_object, index, value, attr, |
5390 false, | 5384 SLOPPY, false, DEFINE_PROPERTY); |
5391 DEFINE_PROPERTY); | |
5392 } else { | 5385 } else { |
5393 if (name->IsString()) Handle<String>::cast(name)->TryFlatten(); | 5386 if (name->IsString()) Handle<String>::cast(name)->TryFlatten(); |
5394 return JSObject::SetLocalPropertyIgnoreAttributes(js_object, name, | 5387 return JSObject::SetLocalPropertyIgnoreAttributes(js_object, name, |
5395 value, attr); | 5388 value, attr); |
5396 } | 5389 } |
5397 } | 5390 } |
5398 | 5391 |
5399 // Call-back into JavaScript to convert the key to a string. | 5392 // Call-back into JavaScript to convert the key to a string. |
5400 bool has_pending_exception = false; | 5393 bool has_pending_exception = false; |
5401 Handle<Object> converted = | 5394 Handle<Object> converted = |
5402 Execution::ToString(isolate, key, &has_pending_exception); | 5395 Execution::ToString(isolate, key, &has_pending_exception); |
5403 if (has_pending_exception) return Handle<Object>(); // exception | 5396 if (has_pending_exception) return MaybeHandle<Object>(); // exception |
5404 Handle<String> name = Handle<String>::cast(converted); | 5397 Handle<String> name = Handle<String>::cast(converted); |
5405 | 5398 |
5406 if (name->AsArrayIndex(&index)) { | 5399 if (name->AsArrayIndex(&index)) { |
5407 return JSObject::SetElement(js_object, index, value, attr, SLOPPY, | 5400 return JSObject::SetElement(js_object, index, value, attr, |
5408 false, | 5401 SLOPPY, false, DEFINE_PROPERTY); |
5409 DEFINE_PROPERTY); | |
5410 } else { | 5402 } else { |
5411 return JSObject::SetLocalPropertyIgnoreAttributes(js_object, name, value, | 5403 return JSObject::SetLocalPropertyIgnoreAttributes(js_object, name, value, |
5412 attr); | 5404 attr); |
5413 } | 5405 } |
5414 } | 5406 } |
5415 | 5407 |
5416 | 5408 |
5417 MaybeObject* Runtime::DeleteObjectProperty(Isolate* isolate, | 5409 MaybeHandle<Object> Runtime::DeleteObjectProperty(Isolate* isolate, |
5418 Handle<JSReceiver> receiver, | 5410 Handle<JSReceiver> receiver, |
5419 Handle<Object> key, | 5411 Handle<Object> key, |
5420 JSReceiver::DeleteMode mode) { | 5412 JSReceiver::DeleteMode mode) { |
5421 HandleScope scope(isolate); | |
5422 | |
5423 // Check if the given key is an array index. | 5413 // Check if the given key is an array index. |
5424 uint32_t index; | 5414 uint32_t index; |
5425 if (key->ToArrayIndex(&index)) { | 5415 if (key->ToArrayIndex(&index)) { |
5426 // In Firefox/SpiderMonkey, Safari and Opera you can access the | 5416 // In Firefox/SpiderMonkey, Safari and Opera you can access the |
5427 // characters of a string using [] notation. In the case of a | 5417 // characters of a string using [] notation. In the case of a |
5428 // String object we just need to redirect the deletion to the | 5418 // String object we just need to redirect the deletion to the |
5429 // underlying string if the index is in range. Since the | 5419 // underlying string if the index is in range. Since the |
5430 // underlying string does nothing with the deletion, we can ignore | 5420 // underlying string does nothing with the deletion, we can ignore |
5431 // such deletions. | 5421 // such deletions. |
5432 if (receiver->IsStringObjectWithCharacterAt(index)) { | 5422 if (receiver->IsStringObjectWithCharacterAt(index)) { |
5433 return isolate->heap()->true_value(); | 5423 return isolate->factory()->true_value(); |
5434 } | 5424 } |
5435 | 5425 |
5436 Handle<Object> result = JSReceiver::DeleteElement(receiver, index, mode); | 5426 return JSReceiver::DeleteElement(receiver, index, mode); |
5437 RETURN_IF_EMPTY_HANDLE(isolate, result); | |
5438 return *result; | |
5439 } | 5427 } |
5440 | 5428 |
5441 Handle<Name> name; | 5429 Handle<Name> name; |
5442 if (key->IsName()) { | 5430 if (key->IsName()) { |
5443 name = Handle<Name>::cast(key); | 5431 name = Handle<Name>::cast(key); |
5444 } else { | 5432 } else { |
5445 // Call-back into JavaScript to convert the key to a string. | 5433 // Call-back into JavaScript to convert the key to a string. |
5446 bool has_pending_exception = false; | 5434 bool has_pending_exception = false; |
5447 Handle<Object> converted = Execution::ToString( | 5435 Handle<Object> converted = Execution::ToString( |
5448 isolate, key, &has_pending_exception); | 5436 isolate, key, &has_pending_exception); |
5449 if (has_pending_exception) return Failure::Exception(); | 5437 if (has_pending_exception) return MaybeHandle<Object>(); |
5450 name = Handle<String>::cast(converted); | 5438 name = Handle<String>::cast(converted); |
5451 } | 5439 } |
5452 | 5440 |
5453 if (name->IsString()) Handle<String>::cast(name)->TryFlatten(); | 5441 if (name->IsString()) Handle<String>::cast(name)->TryFlatten(); |
5454 Handle<Object> result = JSReceiver::DeleteProperty(receiver, name, mode); | 5442 return JSReceiver::DeleteProperty(receiver, name, mode); |
5455 RETURN_IF_EMPTY_HANDLE(isolate, result); | |
5456 return *result; | |
5457 } | 5443 } |
5458 | 5444 |
5459 | 5445 |
5460 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetHiddenProperty) { | 5446 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetHiddenProperty) { |
5461 HandleScope scope(isolate); | 5447 HandleScope scope(isolate); |
5462 RUNTIME_ASSERT(args.length() == 3); | 5448 RUNTIME_ASSERT(args.length() == 3); |
5463 | 5449 |
5464 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); | 5450 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); |
5465 CONVERT_ARG_HANDLE_CHECKED(String, key, 1); | 5451 CONVERT_ARG_HANDLE_CHECKED(String, key, 1); |
5466 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); | 5452 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); |
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5661 | 5647 |
5662 | 5648 |
5663 RUNTIME_FUNCTION(MaybeObject*, Runtime_DeleteProperty) { | 5649 RUNTIME_FUNCTION(MaybeObject*, Runtime_DeleteProperty) { |
5664 HandleScope scope(isolate); | 5650 HandleScope scope(isolate); |
5665 ASSERT(args.length() == 3); | 5651 ASSERT(args.length() == 3); |
5666 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, object, 0); | 5652 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, object, 0); |
5667 CONVERT_ARG_HANDLE_CHECKED(Name, key, 1); | 5653 CONVERT_ARG_HANDLE_CHECKED(Name, key, 1); |
5668 CONVERT_STRICT_MODE_ARG_CHECKED(strict_mode, 2); | 5654 CONVERT_STRICT_MODE_ARG_CHECKED(strict_mode, 2); |
5669 JSReceiver::DeleteMode delete_mode = strict_mode == STRICT | 5655 JSReceiver::DeleteMode delete_mode = strict_mode == STRICT |
5670 ? JSReceiver::STRICT_DELETION : JSReceiver::NORMAL_DELETION; | 5656 ? JSReceiver::STRICT_DELETION : JSReceiver::NORMAL_DELETION; |
5671 Handle<Object> result = JSReceiver::DeleteProperty(object, key, delete_mode); | 5657 Handle<Object> result; |
5672 RETURN_IF_EMPTY_HANDLE(isolate, result); | 5658 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
5659 isolate, result, | |
5660 JSReceiver::DeleteProperty(object, key, delete_mode)); | |
5673 return *result; | 5661 return *result; |
5674 } | 5662 } |
5675 | 5663 |
5676 | 5664 |
5677 static MaybeObject* HasLocalPropertyImplementation(Isolate* isolate, | 5665 static MaybeObject* HasLocalPropertyImplementation(Isolate* isolate, |
5678 Handle<JSObject> object, | 5666 Handle<JSObject> object, |
5679 Handle<Name> key) { | 5667 Handle<Name> key) { |
5680 if (JSReceiver::HasLocalProperty(object, key)) { | 5668 if (JSReceiver::HasLocalProperty(object, key)) { |
5681 return isolate->heap()->true_value(); | 5669 return isolate->heap()->true_value(); |
5682 } | 5670 } |
(...skipping 3552 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
9235 | 9223 |
9236 // If the slot was found in a context, it should be DONT_DELETE. | 9224 // If the slot was found in a context, it should be DONT_DELETE. |
9237 if (holder->IsContext()) { | 9225 if (holder->IsContext()) { |
9238 return isolate->heap()->false_value(); | 9226 return isolate->heap()->false_value(); |
9239 } | 9227 } |
9240 | 9228 |
9241 // The slot was found in a JSObject, either a context extension object, | 9229 // The slot was found in a JSObject, either a context extension object, |
9242 // the global object, or the subject of a with. Try to delete it | 9230 // the global object, or the subject of a with. Try to delete it |
9243 // (respecting DONT_DELETE). | 9231 // (respecting DONT_DELETE). |
9244 Handle<JSObject> object = Handle<JSObject>::cast(holder); | 9232 Handle<JSObject> object = Handle<JSObject>::cast(holder); |
9245 Handle<Object> result = JSReceiver::DeleteProperty(object, name); | 9233 Handle<Object> result; |
9246 RETURN_IF_EMPTY_HANDLE(isolate, result); | 9234 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
9235 isolate, result, | |
9236 JSReceiver::DeleteProperty(object, name)); | |
9247 return *result; | 9237 return *result; |
9248 } | 9238 } |
9249 | 9239 |
9250 | 9240 |
9251 // A mechanism to return a pair of Object pointers in registers (if possible). | 9241 // A mechanism to return a pair of Object pointers in registers (if possible). |
9252 // How this is achieved is calling convention-dependent. | 9242 // How this is achieved is calling convention-dependent. |
9253 // All currently supported x86 compiles uses calling conventions that are cdecl | 9243 // All currently supported x86 compiles uses calling conventions that are cdecl |
9254 // variants where a 64-bit value is returned in two 32-bit registers | 9244 // variants where a 64-bit value is returned in two 32-bit registers |
9255 // (edx:eax on ia32, r1:r0 on ARM). | 9245 // (edx:eax on ia32, r1:r0 on ARM). |
9256 // In AMD-64 calling convention a struct of two pointers is returned in rdx:rax. | 9246 // 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 Loading... | |
9951 CONVERT_ARG_HANDLE_CHECKED(JSArray, array, 0); | 9941 CONVERT_ARG_HANDLE_CHECKED(JSArray, array, 0); |
9952 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, element, 1); | 9942 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, element, 1); |
9953 RUNTIME_ASSERT(array->HasFastSmiOrObjectElements()); | 9943 RUNTIME_ASSERT(array->HasFastSmiOrObjectElements()); |
9954 int length = Smi::cast(array->length())->value(); | 9944 int length = Smi::cast(array->length())->value(); |
9955 FixedArray* elements = FixedArray::cast(array->elements()); | 9945 FixedArray* elements = FixedArray::cast(array->elements()); |
9956 for (int i = 0; i < length; i++) { | 9946 for (int i = 0; i < length; i++) { |
9957 if (elements->get(i) == *element) return isolate->heap()->false_value(); | 9947 if (elements->get(i) == *element) return isolate->heap()->false_value(); |
9958 } | 9948 } |
9959 | 9949 |
9960 // Strict not needed. Used for cycle detection in Array join implementation. | 9950 // Strict not needed. Used for cycle detection in Array join implementation. |
9961 RETURN_IF_EMPTY_HANDLE(isolate, JSObject::SetFastElement(array, length, | 9951 RETURN_FAILURE_ON_EXCEPTION( |
9962 element, | 9952 isolate, |
9963 SLOPPY, | 9953 JSObject::SetFastElement(array, length, element, SLOPPY, true)); |
9964 true)); | |
9965 return isolate->heap()->true_value(); | 9954 return isolate->heap()->true_value(); |
9966 } | 9955 } |
9967 | 9956 |
9968 | 9957 |
9969 /** | 9958 /** |
9970 * A simple visitor visits every element of Array's. | 9959 * A simple visitor visits every element of Array's. |
9971 * The backend storage can be a fixed array for fast elements case, | 9960 * The backend storage can be a fixed array for fast elements case, |
9972 * or a dictionary for sparse array. Since Dictionary is a subtype | 9961 * or a dictionary for sparse array. Since Dictionary is a subtype |
9973 * of FixedArray, the class can be used by both fast and slow cases. | 9962 * of FixedArray, the class can be used by both fast and slow cases. |
9974 * The second parameter of the constructor, fast_elements, specifies | 9963 * The second parameter of the constructor, fast_elements, specifies |
(...skipping 2335 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
12310 } else { | 12299 } else { |
12311 JavaScriptFrameIterator additional_frame_it(isolate, break_frame_id); | 12300 JavaScriptFrameIterator additional_frame_it(isolate, break_frame_id); |
12312 // If our frame is a top frame and we are stepping, we can do step-in | 12301 // If our frame is a top frame and we are stepping, we can do step-in |
12313 // at this place. | 12302 // at this place. |
12314 accept = additional_frame_it.frame()->id() == id; | 12303 accept = additional_frame_it.frame()->id() == id; |
12315 } | 12304 } |
12316 } | 12305 } |
12317 if (accept) { | 12306 if (accept) { |
12318 if (break_location_iterator.IsStepInLocation(isolate)) { | 12307 if (break_location_iterator.IsStepInLocation(isolate)) { |
12319 Smi* position_value = Smi::FromInt(break_location_iterator.position()); | 12308 Smi* position_value = Smi::FromInt(break_location_iterator.position()); |
12320 JSObject::SetElement(array, len, | 12309 RETURN_FAILURE_ON_EXCEPTION( |
12321 Handle<Object>(position_value, isolate), | 12310 isolate, |
12322 NONE, SLOPPY); | 12311 JSObject::SetElement(array, len, |
12312 Handle<Object>(position_value, isolate), | |
12313 NONE, SLOPPY)); | |
12323 len++; | 12314 len++; |
12324 } | 12315 } |
12325 } | 12316 } |
12326 // Advance iterator. | 12317 // Advance iterator. |
12327 break_location_iterator.Next(); | 12318 break_location_iterator.Next(); |
12328 if (current_statement_pos != | 12319 if (current_statement_pos != |
12329 break_location_iterator.statement_position()) { | 12320 break_location_iterator.statement_position()) { |
12330 break; | 12321 break; |
12331 } | 12322 } |
12332 } | 12323 } |
(...skipping 2926 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
15259 } | 15250 } |
15260 } | 15251 } |
15261 | 15252 |
15262 | 15253 |
15263 void Runtime::OutOfMemory() { | 15254 void Runtime::OutOfMemory() { |
15264 Heap::FatalProcessOutOfMemory("CALL_AND_RETRY_LAST", true); | 15255 Heap::FatalProcessOutOfMemory("CALL_AND_RETRY_LAST", true); |
15265 UNREACHABLE(); | 15256 UNREACHABLE(); |
15266 } | 15257 } |
15267 | 15258 |
15268 } } // namespace v8::internal | 15259 } } // namespace v8::internal |
OLD | NEW |