| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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/arguments.h" | 7 #include "src/arguments.h" |
| 8 #include "src/bootstrapper.h" | 8 #include "src/bootstrapper.h" |
| 9 #include "src/debug.h" | 9 #include "src/debug.h" |
| 10 #include "src/runtime/runtime.h" | 10 #include "src/runtime/runtime.h" |
| (...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 187 return JSObject::SetElement(js_object, index, value, NONE, language_mode, | 187 return JSObject::SetElement(js_object, index, value, NONE, language_mode, |
| 188 true, SET_PROPERTY); | 188 true, SET_PROPERTY); |
| 189 } | 189 } |
| 190 return Object::SetProperty(object, name, value, language_mode); | 190 return Object::SetProperty(object, name, value, language_mode); |
| 191 } | 191 } |
| 192 | 192 |
| 193 | 193 |
| 194 MaybeHandle<Object> Runtime::DefineObjectProperty(Handle<JSObject> js_object, | 194 MaybeHandle<Object> Runtime::DefineObjectProperty(Handle<JSObject> js_object, |
| 195 Handle<Object> key, | 195 Handle<Object> key, |
| 196 Handle<Object> value, | 196 Handle<Object> value, |
| 197 PropertyAttributes attr) { | 197 PropertyAttributes attrs) { |
| 198 Isolate* isolate = js_object->GetIsolate(); | 198 Isolate* isolate = js_object->GetIsolate(); |
| 199 // Check if the given key is an array index. | 199 // Check if the given key is an array index. |
| 200 uint32_t index; | 200 uint32_t index; |
| 201 if (key->ToArrayIndex(&index)) { | 201 if (key->ToArrayIndex(&index)) { |
| 202 // In Firefox/SpiderMonkey, Safari and Opera you can access the characters | 202 // In Firefox/SpiderMonkey, Safari and Opera you can access the characters |
| 203 // of a string using [] notation. We need to support this too in | 203 // of a string using [] notation. We need to support this too in |
| 204 // JavaScript. | 204 // JavaScript. |
| 205 // In the case of a String object we just need to redirect the assignment to | 205 // In the case of a String object we just need to redirect the assignment to |
| 206 // the underlying string if the index is in range. Since the underlying | 206 // the underlying string if the index is in range. Since the underlying |
| 207 // string does nothing with the assignment then we can ignore such | 207 // string does nothing with the assignment then we can ignore such |
| 208 // assignments. | 208 // assignments. |
| 209 if (js_object->IsStringObjectWithCharacterAt(index)) { | 209 if (js_object->IsStringObjectWithCharacterAt(index)) { |
| 210 return value; | 210 return value; |
| 211 } | 211 } |
| 212 | 212 |
| 213 return JSObject::SetElement(js_object, index, value, attr, SLOPPY, false, | 213 return JSObject::SetElement(js_object, index, value, attrs, SLOPPY, false, |
| 214 DEFINE_PROPERTY); | 214 DEFINE_PROPERTY); |
| 215 } | 215 } |
| 216 | 216 |
| 217 if (key->IsName()) { | 217 if (key->IsName()) { |
| 218 Handle<Name> name = Handle<Name>::cast(key); | 218 Handle<Name> name = Handle<Name>::cast(key); |
| 219 if (name->AsArrayIndex(&index)) { | 219 if (name->AsArrayIndex(&index)) { |
| 220 return JSObject::SetElement(js_object, index, value, attr, SLOPPY, false, | 220 return JSObject::SetElement(js_object, index, value, attrs, SLOPPY, false, |
| 221 DEFINE_PROPERTY); | 221 DEFINE_PROPERTY); |
| 222 } else { | 222 } else { |
| 223 if (name->IsString()) name = String::Flatten(Handle<String>::cast(name)); | 223 if (name->IsString()) name = String::Flatten(Handle<String>::cast(name)); |
| 224 return JSObject::SetOwnPropertyIgnoreAttributes(js_object, name, value, | 224 return JSObject::SetOwnPropertyIgnoreAttributes(js_object, name, value, |
| 225 attr); | 225 attrs); |
| 226 } | 226 } |
| 227 } | 227 } |
| 228 | 228 |
| 229 // Call-back into JavaScript to convert the key to a string. | 229 // Call-back into JavaScript to convert the key to a string. |
| 230 Handle<Object> converted; | 230 Handle<Object> converted; |
| 231 ASSIGN_RETURN_ON_EXCEPTION(isolate, converted, | 231 ASSIGN_RETURN_ON_EXCEPTION(isolate, converted, |
| 232 Execution::ToString(isolate, key), Object); | 232 Execution::ToString(isolate, key), Object); |
| 233 Handle<String> name = Handle<String>::cast(converted); | 233 Handle<String> name = Handle<String>::cast(converted); |
| 234 | 234 |
| 235 if (name->AsArrayIndex(&index)) { | 235 if (name->AsArrayIndex(&index)) { |
| 236 return JSObject::SetElement(js_object, index, value, attr, SLOPPY, false, | 236 return JSObject::SetElement(js_object, index, value, attrs, SLOPPY, false, |
| 237 DEFINE_PROPERTY); | 237 DEFINE_PROPERTY); |
| 238 } else { | 238 } else { |
| 239 return JSObject::SetOwnPropertyIgnoreAttributes(js_object, name, value, | 239 return JSObject::SetOwnPropertyIgnoreAttributes(js_object, name, value, |
| 240 attr); | 240 attrs); |
| 241 } | 241 } |
| 242 } | 242 } |
| 243 | 243 |
| 244 | 244 |
| 245 MaybeHandle<Object> Runtime::GetPrototype(Isolate* isolate, | 245 MaybeHandle<Object> Runtime::GetPrototype(Isolate* isolate, |
| 246 Handle<Object> obj) { | 246 Handle<Object> obj) { |
| 247 // We don't expect access checks to be needed on JSProxy objects. | 247 // We don't expect access checks to be needed on JSProxy objects. |
| 248 DCHECK(!obj->IsAccessCheckNeeded() || obj->IsJSObject()); | 248 DCHECK(!obj->IsAccessCheckNeeded() || obj->IsJSObject()); |
| 249 PrototypeIterator iter(isolate, obj, PrototypeIterator::START_AT_RECEIVER); | 249 PrototypeIterator iter(isolate, obj, PrototypeIterator::START_AT_RECEIVER); |
| 250 do { | 250 do { |
| (...skipping 406 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 657 } | 657 } |
| 658 | 658 |
| 659 | 659 |
| 660 RUNTIME_FUNCTION(Runtime_AddNamedProperty) { | 660 RUNTIME_FUNCTION(Runtime_AddNamedProperty) { |
| 661 HandleScope scope(isolate); | 661 HandleScope scope(isolate); |
| 662 RUNTIME_ASSERT(args.length() == 4); | 662 RUNTIME_ASSERT(args.length() == 4); |
| 663 | 663 |
| 664 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); | 664 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); |
| 665 CONVERT_ARG_HANDLE_CHECKED(Name, key, 1); | 665 CONVERT_ARG_HANDLE_CHECKED(Name, key, 1); |
| 666 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); | 666 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); |
| 667 CONVERT_SMI_ARG_CHECKED(unchecked_attributes, 3); | 667 CONVERT_PROPERTY_ATTRIBUTES_CHECKED(attrs, 3); |
| 668 RUNTIME_ASSERT( | |
| 669 (unchecked_attributes & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0); | |
| 670 // Compute attributes. | |
| 671 PropertyAttributes attributes = | |
| 672 static_cast<PropertyAttributes>(unchecked_attributes); | |
| 673 | 668 |
| 674 #ifdef DEBUG | 669 #ifdef DEBUG |
| 675 uint32_t index = 0; | 670 uint32_t index = 0; |
| 676 DCHECK(!key->ToArrayIndex(&index)); | 671 DCHECK(!key->ToArrayIndex(&index)); |
| 677 LookupIterator it(object, key, LookupIterator::OWN_SKIP_INTERCEPTOR); | 672 LookupIterator it(object, key, LookupIterator::OWN_SKIP_INTERCEPTOR); |
| 678 Maybe<PropertyAttributes> maybe = JSReceiver::GetPropertyAttributes(&it); | 673 Maybe<PropertyAttributes> maybe = JSReceiver::GetPropertyAttributes(&it); |
| 679 if (!maybe.has_value) return isolate->heap()->exception(); | 674 if (!maybe.has_value) return isolate->heap()->exception(); |
| 680 RUNTIME_ASSERT(!it.IsFound()); | 675 RUNTIME_ASSERT(!it.IsFound()); |
| 681 #endif | 676 #endif |
| 682 | 677 |
| 683 Handle<Object> result; | 678 Handle<Object> result; |
| 684 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 679 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| 685 isolate, result, | 680 isolate, result, |
| 686 JSObject::SetOwnPropertyIgnoreAttributes(object, key, value, attributes)); | 681 JSObject::SetOwnPropertyIgnoreAttributes(object, key, value, attrs)); |
| 687 return *result; | 682 return *result; |
| 688 } | 683 } |
| 689 | 684 |
| 690 | 685 |
| 691 RUNTIME_FUNCTION(Runtime_SetProperty) { | 686 RUNTIME_FUNCTION(Runtime_SetProperty) { |
| 692 HandleScope scope(isolate); | 687 HandleScope scope(isolate); |
| 693 RUNTIME_ASSERT(args.length() == 4); | 688 RUNTIME_ASSERT(args.length() == 4); |
| 694 | 689 |
| 695 CONVERT_ARG_HANDLE_CHECKED(Object, object, 0); | 690 CONVERT_ARG_HANDLE_CHECKED(Object, object, 0); |
| 696 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); | 691 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 708 | 703 |
| 709 // Adds an element to an array. | 704 // Adds an element to an array. |
| 710 // This is used to create an indexed data property into an array. | 705 // This is used to create an indexed data property into an array. |
| 711 RUNTIME_FUNCTION(Runtime_AddElement) { | 706 RUNTIME_FUNCTION(Runtime_AddElement) { |
| 712 HandleScope scope(isolate); | 707 HandleScope scope(isolate); |
| 713 RUNTIME_ASSERT(args.length() == 4); | 708 RUNTIME_ASSERT(args.length() == 4); |
| 714 | 709 |
| 715 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); | 710 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); |
| 716 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); | 711 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); |
| 717 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); | 712 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); |
| 718 CONVERT_SMI_ARG_CHECKED(unchecked_attributes, 3); | 713 CONVERT_PROPERTY_ATTRIBUTES_CHECKED(attrs, 3); |
| 719 RUNTIME_ASSERT( | |
| 720 (unchecked_attributes & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0); | |
| 721 // Compute attributes. | |
| 722 PropertyAttributes attributes = | |
| 723 static_cast<PropertyAttributes>(unchecked_attributes); | |
| 724 | 714 |
| 725 uint32_t index = 0; | 715 uint32_t index = 0; |
| 726 key->ToArrayIndex(&index); | 716 key->ToArrayIndex(&index); |
| 727 | 717 |
| 728 Handle<Object> result; | 718 Handle<Object> result; |
| 729 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 719 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| 730 isolate, result, JSObject::SetElement(object, index, value, attributes, | 720 isolate, result, JSObject::SetElement(object, index, value, attrs, SLOPPY, |
| 731 SLOPPY, false, DEFINE_PROPERTY)); | 721 false, DEFINE_PROPERTY)); |
| 732 return *result; | 722 return *result; |
| 733 } | 723 } |
| 734 | 724 |
| 735 | 725 |
| 736 RUNTIME_FUNCTION(Runtime_DeleteProperty) { | 726 RUNTIME_FUNCTION(Runtime_DeleteProperty) { |
| 737 HandleScope scope(isolate); | 727 HandleScope scope(isolate); |
| 738 DCHECK(args.length() == 3); | 728 DCHECK(args.length() == 3); |
| 739 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, object, 0); | 729 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, object, 0); |
| 740 CONVERT_ARG_HANDLE_CHECKED(Name, key, 1); | 730 CONVERT_ARG_HANDLE_CHECKED(Name, key, 1); |
| 741 CONVERT_LANGUAGE_MODE_ARG_CHECKED(language_mode, 2); | 731 CONVERT_LANGUAGE_MODE_ARG_CHECKED(language_mode, 2); |
| (...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1030 // Return the names of the own indexed properties. | 1020 // Return the names of the own indexed properties. |
| 1031 // args[0]: object | 1021 // args[0]: object |
| 1032 RUNTIME_FUNCTION(Runtime_GetOwnElementNames) { | 1022 RUNTIME_FUNCTION(Runtime_GetOwnElementNames) { |
| 1033 HandleScope scope(isolate); | 1023 HandleScope scope(isolate); |
| 1034 DCHECK(args.length() == 1); | 1024 DCHECK(args.length() == 1); |
| 1035 if (!args[0]->IsJSObject()) { | 1025 if (!args[0]->IsJSObject()) { |
| 1036 return isolate->heap()->undefined_value(); | 1026 return isolate->heap()->undefined_value(); |
| 1037 } | 1027 } |
| 1038 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0); | 1028 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0); |
| 1039 | 1029 |
| 1040 int n = obj->NumberOfOwnElements(static_cast<PropertyAttributes>(NONE)); | 1030 int n = obj->NumberOfOwnElements(NONE); |
| 1041 Handle<FixedArray> names = isolate->factory()->NewFixedArray(n); | 1031 Handle<FixedArray> names = isolate->factory()->NewFixedArray(n); |
| 1042 obj->GetOwnElementKeys(*names, static_cast<PropertyAttributes>(NONE)); | 1032 obj->GetOwnElementKeys(*names, NONE); |
| 1043 return *isolate->factory()->NewJSArrayWithElements(names); | 1033 return *isolate->factory()->NewJSArrayWithElements(names); |
| 1044 } | 1034 } |
| 1045 | 1035 |
| 1046 | 1036 |
| 1047 // Return information on whether an object has a named or indexed interceptor. | 1037 // Return information on whether an object has a named or indexed interceptor. |
| 1048 // args[0]: object | 1038 // args[0]: object |
| 1049 RUNTIME_FUNCTION(Runtime_GetInterceptorInfo) { | 1039 RUNTIME_FUNCTION(Runtime_GetInterceptorInfo) { |
| 1050 HandleScope scope(isolate); | 1040 HandleScope scope(isolate); |
| 1051 DCHECK(args.length() == 1); | 1041 DCHECK(args.length() == 1); |
| 1052 if (!args[0]->IsJSObject()) { | 1042 if (!args[0]->IsJSObject()) { |
| (...skipping 384 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1437 RUNTIME_FUNCTION(Runtime_DefineAccessorPropertyUnchecked) { | 1427 RUNTIME_FUNCTION(Runtime_DefineAccessorPropertyUnchecked) { |
| 1438 HandleScope scope(isolate); | 1428 HandleScope scope(isolate); |
| 1439 DCHECK(args.length() == 5); | 1429 DCHECK(args.length() == 5); |
| 1440 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0); | 1430 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0); |
| 1441 RUNTIME_ASSERT(!obj->IsNull()); | 1431 RUNTIME_ASSERT(!obj->IsNull()); |
| 1442 CONVERT_ARG_HANDLE_CHECKED(Name, name, 1); | 1432 CONVERT_ARG_HANDLE_CHECKED(Name, name, 1); |
| 1443 CONVERT_ARG_HANDLE_CHECKED(Object, getter, 2); | 1433 CONVERT_ARG_HANDLE_CHECKED(Object, getter, 2); |
| 1444 RUNTIME_ASSERT(IsValidAccessor(getter)); | 1434 RUNTIME_ASSERT(IsValidAccessor(getter)); |
| 1445 CONVERT_ARG_HANDLE_CHECKED(Object, setter, 3); | 1435 CONVERT_ARG_HANDLE_CHECKED(Object, setter, 3); |
| 1446 RUNTIME_ASSERT(IsValidAccessor(setter)); | 1436 RUNTIME_ASSERT(IsValidAccessor(setter)); |
| 1447 CONVERT_SMI_ARG_CHECKED(unchecked, 4); | 1437 CONVERT_PROPERTY_ATTRIBUTES_CHECKED(attrs, 4); |
| 1448 RUNTIME_ASSERT((unchecked & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0); | |
| 1449 PropertyAttributes attr = static_cast<PropertyAttributes>(unchecked); | |
| 1450 | 1438 |
| 1451 RETURN_FAILURE_ON_EXCEPTION( | 1439 RETURN_FAILURE_ON_EXCEPTION( |
| 1452 isolate, JSObject::DefineAccessor(obj, name, getter, setter, attr)); | 1440 isolate, JSObject::DefineAccessor(obj, name, getter, setter, attrs)); |
| 1453 return isolate->heap()->undefined_value(); | 1441 return isolate->heap()->undefined_value(); |
| 1454 } | 1442 } |
| 1455 | 1443 |
| 1456 | 1444 |
| 1457 // Implements part of 8.12.9 DefineOwnProperty. | 1445 // Implements part of 8.12.9 DefineOwnProperty. |
| 1458 // There are 3 cases that lead here: | 1446 // There are 3 cases that lead here: |
| 1459 // Step 4a - define a new data property. | 1447 // Step 4a - define a new data property. |
| 1460 // Steps 9b & 12 - replace an existing accessor property with a data property. | 1448 // Steps 9b & 12 - replace an existing accessor property with a data property. |
| 1461 // Step 12 - update an existing data property with a data or generic | 1449 // Step 12 - update an existing data property with a data or generic |
| 1462 // descriptor. | 1450 // descriptor. |
| 1463 RUNTIME_FUNCTION(Runtime_DefineDataPropertyUnchecked) { | 1451 RUNTIME_FUNCTION(Runtime_DefineDataPropertyUnchecked) { |
| 1464 HandleScope scope(isolate); | 1452 HandleScope scope(isolate); |
| 1465 DCHECK(args.length() == 4); | 1453 DCHECK(args.length() == 4); |
| 1466 CONVERT_ARG_HANDLE_CHECKED(JSObject, js_object, 0); | 1454 CONVERT_ARG_HANDLE_CHECKED(JSObject, js_object, 0); |
| 1467 CONVERT_ARG_HANDLE_CHECKED(Name, name, 1); | 1455 CONVERT_ARG_HANDLE_CHECKED(Name, name, 1); |
| 1468 CONVERT_ARG_HANDLE_CHECKED(Object, obj_value, 2); | 1456 CONVERT_ARG_HANDLE_CHECKED(Object, obj_value, 2); |
| 1469 CONVERT_SMI_ARG_CHECKED(unchecked, 3); | 1457 CONVERT_PROPERTY_ATTRIBUTES_CHECKED(attrs, 3); |
| 1470 RUNTIME_ASSERT((unchecked & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0); | |
| 1471 PropertyAttributes attr = static_cast<PropertyAttributes>(unchecked); | |
| 1472 | 1458 |
| 1473 LookupIterator it(js_object, name, LookupIterator::OWN_SKIP_INTERCEPTOR); | 1459 LookupIterator it(js_object, name, LookupIterator::OWN_SKIP_INTERCEPTOR); |
| 1474 if (it.IsFound() && it.state() == LookupIterator::ACCESS_CHECK) { | 1460 if (it.IsFound() && it.state() == LookupIterator::ACCESS_CHECK) { |
| 1475 if (!isolate->MayNamedAccess(js_object, name, v8::ACCESS_SET)) { | 1461 if (!isolate->MayNamedAccess(js_object, name, v8::ACCESS_SET)) { |
| 1476 return isolate->heap()->undefined_value(); | 1462 return isolate->heap()->undefined_value(); |
| 1477 } | 1463 } |
| 1478 it.Next(); | 1464 it.Next(); |
| 1479 } | 1465 } |
| 1480 | 1466 |
| 1481 // Take special care when attributes are different and there is already | 1467 // Take special care when attributes are different and there is already |
| 1482 // a property. | 1468 // a property. |
| 1483 if (it.state() == LookupIterator::ACCESSOR) { | 1469 if (it.state() == LookupIterator::ACCESSOR) { |
| 1484 // Use IgnoreAttributes version since a readonly property may be | 1470 // Use IgnoreAttributes version since a readonly property may be |
| 1485 // overridden and SetProperty does not allow this. | 1471 // overridden and SetProperty does not allow this. |
| 1486 Handle<Object> result; | 1472 Handle<Object> result; |
| 1487 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 1473 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| 1488 isolate, result, | 1474 isolate, result, |
| 1489 JSObject::SetOwnPropertyIgnoreAttributes( | 1475 JSObject::SetOwnPropertyIgnoreAttributes( |
| 1490 js_object, name, obj_value, attr, JSObject::DONT_FORCE_FIELD)); | 1476 js_object, name, obj_value, attrs, JSObject::DONT_FORCE_FIELD)); |
| 1491 return *result; | 1477 return *result; |
| 1492 } | 1478 } |
| 1493 | 1479 |
| 1494 Handle<Object> result; | 1480 Handle<Object> result; |
| 1495 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 1481 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| 1496 isolate, result, | 1482 isolate, result, |
| 1497 Runtime::DefineObjectProperty(js_object, name, obj_value, attr)); | 1483 Runtime::DefineObjectProperty(js_object, name, obj_value, attrs)); |
| 1498 return *result; | 1484 return *result; |
| 1499 } | 1485 } |
| 1500 | 1486 |
| 1501 | 1487 |
| 1502 // Return property without being observable by accessors or interceptors. | 1488 // Return property without being observable by accessors or interceptors. |
| 1503 RUNTIME_FUNCTION(Runtime_GetDataProperty) { | 1489 RUNTIME_FUNCTION(Runtime_GetDataProperty) { |
| 1504 HandleScope scope(isolate); | 1490 HandleScope scope(isolate); |
| 1505 DCHECK(args.length() == 2); | 1491 DCHECK(args.length() == 2); |
| 1506 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); | 1492 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); |
| 1507 CONVERT_ARG_HANDLE_CHECKED(Name, key, 1); | 1493 CONVERT_ARG_HANDLE_CHECKED(Name, key, 1); |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1586 return JSReceiver::cast(obj)->class_name(); | 1572 return JSReceiver::cast(obj)->class_name(); |
| 1587 } | 1573 } |
| 1588 | 1574 |
| 1589 | 1575 |
| 1590 RUNTIME_FUNCTION(Runtime_DefineGetterPropertyUnchecked) { | 1576 RUNTIME_FUNCTION(Runtime_DefineGetterPropertyUnchecked) { |
| 1591 HandleScope scope(isolate); | 1577 HandleScope scope(isolate); |
| 1592 DCHECK(args.length() == 4); | 1578 DCHECK(args.length() == 4); |
| 1593 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); | 1579 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); |
| 1594 CONVERT_ARG_HANDLE_CHECKED(Name, name, 1); | 1580 CONVERT_ARG_HANDLE_CHECKED(Name, name, 1); |
| 1595 CONVERT_ARG_HANDLE_CHECKED(JSFunction, getter, 2); | 1581 CONVERT_ARG_HANDLE_CHECKED(JSFunction, getter, 2); |
| 1596 CONVERT_SMI_ARG_CHECKED(unchecked, 3); | 1582 CONVERT_PROPERTY_ATTRIBUTES_CHECKED(attrs, 3); |
| 1597 RUNTIME_ASSERT((unchecked & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0); | |
| 1598 PropertyAttributes attrs = static_cast<PropertyAttributes>(unchecked); | |
| 1599 | 1583 |
| 1600 RETURN_FAILURE_ON_EXCEPTION( | 1584 RETURN_FAILURE_ON_EXCEPTION( |
| 1601 isolate, | 1585 isolate, |
| 1602 JSObject::DefineAccessor(object, name, getter, | 1586 JSObject::DefineAccessor(object, name, getter, |
| 1603 isolate->factory()->null_value(), attrs)); | 1587 isolate->factory()->null_value(), attrs)); |
| 1604 return isolate->heap()->undefined_value(); | 1588 return isolate->heap()->undefined_value(); |
| 1605 } | 1589 } |
| 1606 | 1590 |
| 1607 | 1591 |
| 1608 RUNTIME_FUNCTION(Runtime_DefineSetterPropertyUnchecked) { | 1592 RUNTIME_FUNCTION(Runtime_DefineSetterPropertyUnchecked) { |
| 1609 HandleScope scope(isolate); | 1593 HandleScope scope(isolate); |
| 1610 DCHECK(args.length() == 4); | 1594 DCHECK(args.length() == 4); |
| 1611 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); | 1595 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); |
| 1612 CONVERT_ARG_HANDLE_CHECKED(Name, name, 1); | 1596 CONVERT_ARG_HANDLE_CHECKED(Name, name, 1); |
| 1613 CONVERT_ARG_HANDLE_CHECKED(JSFunction, setter, 2); | 1597 CONVERT_ARG_HANDLE_CHECKED(JSFunction, setter, 2); |
| 1614 CONVERT_SMI_ARG_CHECKED(unchecked, 3); | 1598 CONVERT_PROPERTY_ATTRIBUTES_CHECKED(attrs, 3); |
| 1615 RUNTIME_ASSERT((unchecked & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0); | |
| 1616 PropertyAttributes attrs = static_cast<PropertyAttributes>(unchecked); | |
| 1617 | 1599 |
| 1618 RETURN_FAILURE_ON_EXCEPTION( | 1600 RETURN_FAILURE_ON_EXCEPTION( |
| 1619 isolate, | 1601 isolate, |
| 1620 JSObject::DefineAccessor(object, name, isolate->factory()->null_value(), | 1602 JSObject::DefineAccessor(object, name, isolate->factory()->null_value(), |
| 1621 setter, attrs)); | 1603 setter, attrs)); |
| 1622 return isolate->heap()->undefined_value(); | 1604 return isolate->heap()->undefined_value(); |
| 1623 } | 1605 } |
| 1624 } | 1606 } |
| 1625 } // namespace v8::internal | 1607 } // namespace v8::internal |
| OLD | NEW |