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 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
281 } | 281 } |
282 | 282 |
283 | 283 |
284 static Handle<Map> ComputeObjectLiteralMap( | 284 static Handle<Map> ComputeObjectLiteralMap( |
285 Handle<Context> context, | 285 Handle<Context> context, |
286 Handle<FixedArray> constant_properties, | 286 Handle<FixedArray> constant_properties, |
287 bool* is_result_from_cache) { | 287 bool* is_result_from_cache) { |
288 Isolate* isolate = context->GetIsolate(); | 288 Isolate* isolate = context->GetIsolate(); |
289 int properties_length = constant_properties->length(); | 289 int properties_length = constant_properties->length(); |
290 int number_of_properties = properties_length / 2; | 290 int number_of_properties = properties_length / 2; |
291 // Check that there are only symbols and array indices among keys. | 291 // Check that there are only internal strings and array indices among keys. |
292 int number_of_symbol_keys = 0; | 292 int number_of_string_keys = 0; |
293 for (int p = 0; p != properties_length; p += 2) { | 293 for (int p = 0; p != properties_length; p += 2) { |
294 Object* key = constant_properties->get(p); | 294 Object* key = constant_properties->get(p); |
295 uint32_t element_index = 0; | 295 uint32_t element_index = 0; |
296 if (key->IsSymbol()) { | 296 if (key->IsInternalizedString()) { |
297 number_of_symbol_keys++; | 297 number_of_string_keys++; |
298 } else if (key->ToArrayIndex(&element_index)) { | 298 } else if (key->ToArrayIndex(&element_index)) { |
299 // An index key does not require space in the property backing store. | 299 // An index key does not require space in the property backing store. |
300 number_of_properties--; | 300 number_of_properties--; |
301 } else { | 301 } else { |
302 // Bail out as a non-symbol non-index key makes caching impossible. | 302 // Bail out as a non-internalized-string non-index key makes caching |
| 303 // impossible. |
303 // ASSERT to make sure that the if condition after the loop is false. | 304 // ASSERT to make sure that the if condition after the loop is false. |
304 ASSERT(number_of_symbol_keys != number_of_properties); | 305 ASSERT(number_of_string_keys != number_of_properties); |
305 break; | 306 break; |
306 } | 307 } |
307 } | 308 } |
308 // If we only have symbols and array indices among keys then we can | 309 // If we only have internalized strings and array indices among keys then we |
309 // use the map cache in the native context. | 310 // can use the map cache in the native context. |
310 const int kMaxKeys = 10; | 311 const int kMaxKeys = 10; |
311 if ((number_of_symbol_keys == number_of_properties) && | 312 if ((number_of_string_keys == number_of_properties) && |
312 (number_of_symbol_keys < kMaxKeys)) { | 313 (number_of_string_keys < kMaxKeys)) { |
313 // Create the fixed array with the key. | 314 // Create the fixed array with the key. |
314 Handle<FixedArray> keys = | 315 Handle<FixedArray> keys = |
315 isolate->factory()->NewFixedArray(number_of_symbol_keys); | 316 isolate->factory()->NewFixedArray(number_of_string_keys); |
316 if (number_of_symbol_keys > 0) { | 317 if (number_of_string_keys > 0) { |
317 int index = 0; | 318 int index = 0; |
318 for (int p = 0; p < properties_length; p += 2) { | 319 for (int p = 0; p < properties_length; p += 2) { |
319 Object* key = constant_properties->get(p); | 320 Object* key = constant_properties->get(p); |
320 if (key->IsSymbol()) { | 321 if (key->IsInternalizedString()) { |
321 keys->set(index++, key); | 322 keys->set(index++, key); |
322 } | 323 } |
323 } | 324 } |
324 ASSERT(index == number_of_symbol_keys); | 325 ASSERT(index == number_of_string_keys); |
325 } | 326 } |
326 *is_result_from_cache = true; | 327 *is_result_from_cache = true; |
327 return isolate->factory()->ObjectLiteralMapFromCache(context, keys); | 328 return isolate->factory()->ObjectLiteralMapFromCache(context, keys); |
328 } | 329 } |
329 *is_result_from_cache = false; | 330 *is_result_from_cache = false; |
330 return isolate->factory()->CopyMap( | 331 return isolate->factory()->CopyMap( |
331 Handle<Map>(context->object_function()->initial_map()), | 332 Handle<Map>(context->object_function()->initial_map()), |
332 number_of_properties); | 333 number_of_properties); |
333 } | 334 } |
334 | 335 |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
387 Handle<Object> value(constant_properties->get(index+1), isolate); | 388 Handle<Object> value(constant_properties->get(index+1), isolate); |
388 if (value->IsFixedArray()) { | 389 if (value->IsFixedArray()) { |
389 // The value contains the constant_properties of a | 390 // The value contains the constant_properties of a |
390 // simple object or array literal. | 391 // simple object or array literal. |
391 Handle<FixedArray> array = Handle<FixedArray>::cast(value); | 392 Handle<FixedArray> array = Handle<FixedArray>::cast(value); |
392 value = CreateLiteralBoilerplate(isolate, literals, array); | 393 value = CreateLiteralBoilerplate(isolate, literals, array); |
393 if (value.is_null()) return value; | 394 if (value.is_null()) return value; |
394 } | 395 } |
395 Handle<Object> result; | 396 Handle<Object> result; |
396 uint32_t element_index = 0; | 397 uint32_t element_index = 0; |
397 if (key->IsSymbol()) { | 398 if (key->IsInternalizedString()) { |
398 if (Handle<String>::cast(key)->AsArrayIndex(&element_index)) { | 399 if (Handle<String>::cast(key)->AsArrayIndex(&element_index)) { |
399 // Array index as string (uint32). | 400 // Array index as string (uint32). |
400 result = JSObject::SetOwnElement( | 401 result = JSObject::SetOwnElement( |
401 boilerplate, element_index, value, kNonStrictMode); | 402 boilerplate, element_index, value, kNonStrictMode); |
402 } else { | 403 } else { |
403 Handle<String> name(String::cast(*key)); | 404 Handle<String> name(String::cast(*key)); |
404 ASSERT(!name->AsArrayIndex(&element_index)); | 405 ASSERT(!name->AsArrayIndex(&element_index)); |
405 result = JSObject::SetLocalPropertyIgnoreAttributes( | 406 result = JSObject::SetLocalPropertyIgnoreAttributes( |
406 boilerplate, name, value, NONE); | 407 boilerplate, name, value, NONE); |
407 } | 408 } |
(...skipping 537 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
945 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetPrototype) { | 946 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetPrototype) { |
946 NoHandleAllocation ha; | 947 NoHandleAllocation ha; |
947 ASSERT(args.length() == 1); | 948 ASSERT(args.length() == 1); |
948 CONVERT_ARG_CHECKED(JSReceiver, input_obj, 0); | 949 CONVERT_ARG_CHECKED(JSReceiver, input_obj, 0); |
949 Object* obj = input_obj; | 950 Object* obj = input_obj; |
950 // We don't expect access checks to be needed on JSProxy objects. | 951 // We don't expect access checks to be needed on JSProxy objects. |
951 ASSERT(!obj->IsAccessCheckNeeded() || obj->IsJSObject()); | 952 ASSERT(!obj->IsAccessCheckNeeded() || obj->IsJSObject()); |
952 do { | 953 do { |
953 if (obj->IsAccessCheckNeeded() && | 954 if (obj->IsAccessCheckNeeded() && |
954 !isolate->MayNamedAccess(JSObject::cast(obj), | 955 !isolate->MayNamedAccess(JSObject::cast(obj), |
955 isolate->heap()->Proto_symbol(), | 956 isolate->heap()->proto_string(), |
956 v8::ACCESS_GET)) { | 957 v8::ACCESS_GET)) { |
957 isolate->ReportFailedAccessCheck(JSObject::cast(obj), v8::ACCESS_GET); | 958 isolate->ReportFailedAccessCheck(JSObject::cast(obj), v8::ACCESS_GET); |
958 return isolate->heap()->undefined_value(); | 959 return isolate->heap()->undefined_value(); |
959 } | 960 } |
960 obj = obj->GetPrototype(); | 961 obj = obj->GetPrototype(); |
961 } while (obj->IsJSObject() && | 962 } while (obj->IsJSObject() && |
962 JSObject::cast(obj)->map()->is_hidden_prototype()); | 963 JSObject::cast(obj)->map()->is_hidden_prototype()); |
963 return obj; | 964 return obj; |
964 } | 965 } |
965 | 966 |
(...skipping 805 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1771 } | 1772 } |
1772 | 1773 |
1773 | 1774 |
1774 RUNTIME_FUNCTION(MaybeObject*, Runtime_RegExpInitializeObject) { | 1775 RUNTIME_FUNCTION(MaybeObject*, Runtime_RegExpInitializeObject) { |
1775 AssertNoAllocation no_alloc; | 1776 AssertNoAllocation no_alloc; |
1776 ASSERT(args.length() == 5); | 1777 ASSERT(args.length() == 5); |
1777 CONVERT_ARG_CHECKED(JSRegExp, regexp, 0); | 1778 CONVERT_ARG_CHECKED(JSRegExp, regexp, 0); |
1778 CONVERT_ARG_CHECKED(String, source, 1); | 1779 CONVERT_ARG_CHECKED(String, source, 1); |
1779 // If source is the empty string we set it to "(?:)" instead as | 1780 // If source is the empty string we set it to "(?:)" instead as |
1780 // suggested by ECMA-262, 5th, section 15.10.4.1. | 1781 // suggested by ECMA-262, 5th, section 15.10.4.1. |
1781 if (source->length() == 0) source = isolate->heap()->query_colon_symbol(); | 1782 if (source->length() == 0) source = isolate->heap()->query_colon_string(); |
1782 | 1783 |
1783 Object* global = args[2]; | 1784 Object* global = args[2]; |
1784 if (!global->IsTrue()) global = isolate->heap()->false_value(); | 1785 if (!global->IsTrue()) global = isolate->heap()->false_value(); |
1785 | 1786 |
1786 Object* ignoreCase = args[3]; | 1787 Object* ignoreCase = args[3]; |
1787 if (!ignoreCase->IsTrue()) ignoreCase = isolate->heap()->false_value(); | 1788 if (!ignoreCase->IsTrue()) ignoreCase = isolate->heap()->false_value(); |
1788 | 1789 |
1789 Object* multiline = args[4]; | 1790 Object* multiline = args[4]; |
1790 if (!multiline->IsTrue()) multiline = isolate->heap()->false_value(); | 1791 if (!multiline->IsTrue()) multiline = isolate->heap()->false_value(); |
1791 | 1792 |
(...skipping 16 matching lines...) Expand all Loading... |
1808 return regexp; | 1809 return regexp; |
1809 } | 1810 } |
1810 | 1811 |
1811 // Map has changed, so use generic, but slower, method. | 1812 // Map has changed, so use generic, but slower, method. |
1812 PropertyAttributes final = | 1813 PropertyAttributes final = |
1813 static_cast<PropertyAttributes>(READ_ONLY | DONT_ENUM | DONT_DELETE); | 1814 static_cast<PropertyAttributes>(READ_ONLY | DONT_ENUM | DONT_DELETE); |
1814 PropertyAttributes writable = | 1815 PropertyAttributes writable = |
1815 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE); | 1816 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE); |
1816 Heap* heap = isolate->heap(); | 1817 Heap* heap = isolate->heap(); |
1817 MaybeObject* result; | 1818 MaybeObject* result; |
1818 result = regexp->SetLocalPropertyIgnoreAttributes(heap->source_symbol(), | 1819 result = regexp->SetLocalPropertyIgnoreAttributes(heap->source_string(), |
1819 source, | 1820 source, |
1820 final); | 1821 final); |
1821 // TODO(jkummerow): Turn these back into ASSERTs when we can be certain | 1822 // TODO(jkummerow): Turn these back into ASSERTs when we can be certain |
1822 // that it never fires in Release mode in the wild. | 1823 // that it never fires in Release mode in the wild. |
1823 CHECK(!result->IsFailure()); | 1824 CHECK(!result->IsFailure()); |
1824 result = regexp->SetLocalPropertyIgnoreAttributes(heap->global_symbol(), | 1825 result = regexp->SetLocalPropertyIgnoreAttributes(heap->global_string(), |
1825 global, | 1826 global, |
1826 final); | 1827 final); |
1827 CHECK(!result->IsFailure()); | 1828 CHECK(!result->IsFailure()); |
1828 result = | 1829 result = |
1829 regexp->SetLocalPropertyIgnoreAttributes(heap->ignore_case_symbol(), | 1830 regexp->SetLocalPropertyIgnoreAttributes(heap->ignore_case_string(), |
1830 ignoreCase, | 1831 ignoreCase, |
1831 final); | 1832 final); |
1832 CHECK(!result->IsFailure()); | 1833 CHECK(!result->IsFailure()); |
1833 result = regexp->SetLocalPropertyIgnoreAttributes(heap->multiline_symbol(), | 1834 result = regexp->SetLocalPropertyIgnoreAttributes(heap->multiline_string(), |
1834 multiline, | 1835 multiline, |
1835 final); | 1836 final); |
1836 CHECK(!result->IsFailure()); | 1837 CHECK(!result->IsFailure()); |
1837 result = | 1838 result = |
1838 regexp->SetLocalPropertyIgnoreAttributes(heap->last_index_symbol(), | 1839 regexp->SetLocalPropertyIgnoreAttributes(heap->last_index_string(), |
1839 Smi::FromInt(0), | 1840 Smi::FromInt(0), |
1840 writable); | 1841 writable); |
1841 CHECK(!result->IsFailure()); | 1842 CHECK(!result->IsFailure()); |
1842 USE(result); | 1843 USE(result); |
1843 return regexp; | 1844 return regexp; |
1844 } | 1845 } |
1845 | 1846 |
1846 | 1847 |
1847 RUNTIME_FUNCTION(MaybeObject*, Runtime_FinishArrayPrototypeSetup) { | 1848 RUNTIME_FUNCTION(MaybeObject*, Runtime_FinishArrayPrototypeSetup) { |
1848 HandleScope scope(isolate); | 1849 HandleScope scope(isolate); |
1849 ASSERT(args.length() == 1); | 1850 ASSERT(args.length() == 1); |
1850 CONVERT_ARG_HANDLE_CHECKED(JSArray, prototype, 0); | 1851 CONVERT_ARG_HANDLE_CHECKED(JSArray, prototype, 0); |
1851 // This is necessary to enable fast checks for absence of elements | 1852 // This is necessary to enable fast checks for absence of elements |
1852 // on Array.prototype and below. | 1853 // on Array.prototype and below. |
1853 prototype->set_elements(isolate->heap()->empty_fixed_array()); | 1854 prototype->set_elements(isolate->heap()->empty_fixed_array()); |
1854 return Smi::FromInt(0); | 1855 return Smi::FromInt(0); |
1855 } | 1856 } |
1856 | 1857 |
1857 | 1858 |
1858 static Handle<JSFunction> InstallBuiltin(Isolate* isolate, | 1859 static Handle<JSFunction> InstallBuiltin(Isolate* isolate, |
1859 Handle<JSObject> holder, | 1860 Handle<JSObject> holder, |
1860 const char* name, | 1861 const char* name, |
1861 Builtins::Name builtin_name) { | 1862 Builtins::Name builtin_name) { |
1862 Handle<String> key = isolate->factory()->LookupUtf8Symbol(name); | 1863 Handle<String> key = isolate->factory()->InternalizeUtf8String(name); |
1863 Handle<Code> code(isolate->builtins()->builtin(builtin_name)); | 1864 Handle<Code> code(isolate->builtins()->builtin(builtin_name)); |
1864 Handle<JSFunction> optimized = | 1865 Handle<JSFunction> optimized = |
1865 isolate->factory()->NewFunction(key, | 1866 isolate->factory()->NewFunction(key, |
1866 JS_OBJECT_TYPE, | 1867 JS_OBJECT_TYPE, |
1867 JSObject::kHeaderSize, | 1868 JSObject::kHeaderSize, |
1868 code, | 1869 code, |
1869 false); | 1870 false); |
1870 optimized->shared()->DontAdaptArguments(); | 1871 optimized->shared()->DontAdaptArguments(); |
1871 JSReceiver::SetProperty(holder, key, optimized, NONE, kStrictMode); | 1872 JSReceiver::SetProperty(holder, key, optimized, NONE, kStrictMode); |
1872 return optimized; | 1873 return optimized; |
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2076 } | 2077 } |
2077 return args[0]; // return TOS | 2078 return args[0]; // return TOS |
2078 } | 2079 } |
2079 | 2080 |
2080 | 2081 |
2081 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionSetReadOnlyPrototype) { | 2082 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionSetReadOnlyPrototype) { |
2082 NoHandleAllocation ha; | 2083 NoHandleAllocation ha; |
2083 RUNTIME_ASSERT(args.length() == 1); | 2084 RUNTIME_ASSERT(args.length() == 1); |
2084 CONVERT_ARG_CHECKED(JSFunction, function, 0); | 2085 CONVERT_ARG_CHECKED(JSFunction, function, 0); |
2085 | 2086 |
2086 String* name = isolate->heap()->prototype_symbol(); | 2087 String* name = isolate->heap()->prototype_string(); |
2087 | 2088 |
2088 if (function->HasFastProperties()) { | 2089 if (function->HasFastProperties()) { |
2089 // Construct a new field descriptor with updated attributes. | 2090 // Construct a new field descriptor with updated attributes. |
2090 DescriptorArray* instance_desc = function->map()->instance_descriptors(); | 2091 DescriptorArray* instance_desc = function->map()->instance_descriptors(); |
2091 | 2092 |
2092 int index = instance_desc->SearchWithCache(name, function->map()); | 2093 int index = instance_desc->SearchWithCache(name, function->map()); |
2093 ASSERT(index != DescriptorArray::kNotFound); | 2094 ASSERT(index != DescriptorArray::kNotFound); |
2094 PropertyDetails details = instance_desc->GetDetails(index); | 2095 PropertyDetails details = instance_desc->GetDetails(index); |
2095 | 2096 |
2096 CallbacksDescriptor new_desc(name, | 2097 CallbacksDescriptor new_desc(name, |
(...skipping 1698 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3795 // Character array used for conversion. | 3796 // Character array used for conversion. |
3796 static const char kCharTable[] = "0123456789abcdefghijklmnopqrstuvwxyz"; | 3797 static const char kCharTable[] = "0123456789abcdefghijklmnopqrstuvwxyz"; |
3797 return isolate->heap()-> | 3798 return isolate->heap()-> |
3798 LookupSingleCharacterStringFromCode(kCharTable[value]); | 3799 LookupSingleCharacterStringFromCode(kCharTable[value]); |
3799 } | 3800 } |
3800 } | 3801 } |
3801 | 3802 |
3802 // Slow case. | 3803 // Slow case. |
3803 CONVERT_DOUBLE_ARG_CHECKED(value, 0); | 3804 CONVERT_DOUBLE_ARG_CHECKED(value, 0); |
3804 if (isnan(value)) { | 3805 if (isnan(value)) { |
3805 return *isolate->factory()->nan_symbol(); | 3806 return *isolate->factory()->nan_string(); |
3806 } | 3807 } |
3807 if (isinf(value)) { | 3808 if (isinf(value)) { |
3808 if (value < 0) { | 3809 if (value < 0) { |
3809 return *isolate->factory()->minus_infinity_symbol(); | 3810 return *isolate->factory()->minus_infinity_string(); |
3810 } | 3811 } |
3811 return *isolate->factory()->infinity_symbol(); | 3812 return *isolate->factory()->infinity_string(); |
3812 } | 3813 } |
3813 char* str = DoubleToRadixCString(value, radix); | 3814 char* str = DoubleToRadixCString(value, radix); |
3814 MaybeObject* result = | 3815 MaybeObject* result = |
3815 isolate->heap()->AllocateStringFromOneByte(CStrVector(str)); | 3816 isolate->heap()->AllocateStringFromOneByte(CStrVector(str)); |
3816 DeleteArray(str); | 3817 DeleteArray(str); |
3817 return result; | 3818 return result; |
3818 } | 3819 } |
3819 | 3820 |
3820 | 3821 |
3821 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberToFixed) { | 3822 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberToFixed) { |
(...skipping 960 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4782 } | 4783 } |
4783 | 4784 |
4784 // Filter out name of hidden propeties object. | 4785 // Filter out name of hidden propeties object. |
4785 if (proto_with_hidden_properties > 0) { | 4786 if (proto_with_hidden_properties > 0) { |
4786 Handle<FixedArray> old_names = names; | 4787 Handle<FixedArray> old_names = names; |
4787 names = isolate->factory()->NewFixedArray( | 4788 names = isolate->factory()->NewFixedArray( |
4788 names->length() - proto_with_hidden_properties); | 4789 names->length() - proto_with_hidden_properties); |
4789 int dest_pos = 0; | 4790 int dest_pos = 0; |
4790 for (int i = 0; i < total_property_count; i++) { | 4791 for (int i = 0; i < total_property_count; i++) { |
4791 Object* name = old_names->get(i); | 4792 Object* name = old_names->get(i); |
4792 if (name == isolate->heap()->hidden_symbol()) { | 4793 if (name == isolate->heap()->hidden_string()) { |
4793 continue; | 4794 continue; |
4794 } | 4795 } |
4795 names->set(dest_pos++, name); | 4796 names->set(dest_pos++, name); |
4796 } | 4797 } |
4797 } | 4798 } |
4798 | 4799 |
4799 return *isolate->factory()->NewJSArrayWithElements(names); | 4800 return *isolate->factory()->NewJSArrayWithElements(names); |
4800 } | 4801 } |
4801 | 4802 |
4802 | 4803 |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4943 // Try to convert the string key into an array index. | 4944 // Try to convert the string key into an array index. |
4944 if (key->AsArrayIndex(&index)) { | 4945 if (key->AsArrayIndex(&index)) { |
4945 if (index < n) { | 4946 if (index < n) { |
4946 return frame->GetParameter(index); | 4947 return frame->GetParameter(index); |
4947 } else { | 4948 } else { |
4948 return isolate->initial_object_prototype()->GetElement(index); | 4949 return isolate->initial_object_prototype()->GetElement(index); |
4949 } | 4950 } |
4950 } | 4951 } |
4951 | 4952 |
4952 // Handle special arguments properties. | 4953 // Handle special arguments properties. |
4953 if (key->Equals(isolate->heap()->length_symbol())) return Smi::FromInt(n); | 4954 if (key->Equals(isolate->heap()->length_string())) return Smi::FromInt(n); |
4954 if (key->Equals(isolate->heap()->callee_symbol())) { | 4955 if (key->Equals(isolate->heap()->callee_string())) { |
4955 Object* function = frame->function(); | 4956 Object* function = frame->function(); |
4956 if (function->IsJSFunction() && | 4957 if (function->IsJSFunction() && |
4957 !JSFunction::cast(function)->shared()->is_classic_mode()) { | 4958 !JSFunction::cast(function)->shared()->is_classic_mode()) { |
4958 return isolate->Throw(*isolate->factory()->NewTypeError( | 4959 return isolate->Throw(*isolate->factory()->NewTypeError( |
4959 "strict_arguments_callee", HandleVector<Object>(NULL, 0))); | 4960 "strict_arguments_callee", HandleVector<Object>(NULL, 0))); |
4960 } | 4961 } |
4961 return function; | 4962 return function; |
4962 } | 4963 } |
4963 | 4964 |
4964 // Lookup in the initial Object.prototype object. | 4965 // Lookup in the initial Object.prototype object. |
(...skipping 17 matching lines...) Expand all Loading... |
4982 return args[0]->ToBoolean(); | 4983 return args[0]->ToBoolean(); |
4983 } | 4984 } |
4984 | 4985 |
4985 | 4986 |
4986 // Returns the type string of a value; see ECMA-262, 11.4.3 (p 47). | 4987 // Returns the type string of a value; see ECMA-262, 11.4.3 (p 47). |
4987 // Possible optimizations: put the type string into the oddballs. | 4988 // Possible optimizations: put the type string into the oddballs. |
4988 RUNTIME_FUNCTION(MaybeObject*, Runtime_Typeof) { | 4989 RUNTIME_FUNCTION(MaybeObject*, Runtime_Typeof) { |
4989 NoHandleAllocation ha; | 4990 NoHandleAllocation ha; |
4990 | 4991 |
4991 Object* obj = args[0]; | 4992 Object* obj = args[0]; |
4992 if (obj->IsNumber()) return isolate->heap()->number_symbol(); | 4993 if (obj->IsNumber()) return isolate->heap()->number_string(); |
4993 HeapObject* heap_obj = HeapObject::cast(obj); | 4994 HeapObject* heap_obj = HeapObject::cast(obj); |
4994 | 4995 |
4995 // typeof an undetectable object is 'undefined' | 4996 // typeof an undetectable object is 'undefined' |
4996 if (heap_obj->map()->is_undetectable()) { | 4997 if (heap_obj->map()->is_undetectable()) { |
4997 return isolate->heap()->undefined_symbol(); | 4998 return isolate->heap()->undefined_string(); |
4998 } | 4999 } |
4999 | 5000 |
5000 InstanceType instance_type = heap_obj->map()->instance_type(); | 5001 InstanceType instance_type = heap_obj->map()->instance_type(); |
5001 if (instance_type < FIRST_NONSTRING_TYPE) { | 5002 if (instance_type < FIRST_NONSTRING_TYPE) { |
5002 return isolate->heap()->string_symbol(); | 5003 return isolate->heap()->string_string(); |
5003 } | 5004 } |
5004 | 5005 |
5005 switch (instance_type) { | 5006 switch (instance_type) { |
5006 case ODDBALL_TYPE: | 5007 case ODDBALL_TYPE: |
5007 if (heap_obj->IsTrue() || heap_obj->IsFalse()) { | 5008 if (heap_obj->IsTrue() || heap_obj->IsFalse()) { |
5008 return isolate->heap()->boolean_symbol(); | 5009 return isolate->heap()->boolean_string(); |
5009 } | 5010 } |
5010 if (heap_obj->IsNull()) { | 5011 if (heap_obj->IsNull()) { |
5011 return FLAG_harmony_typeof | 5012 return FLAG_harmony_typeof |
5012 ? isolate->heap()->null_symbol() | 5013 ? isolate->heap()->null_string() |
5013 : isolate->heap()->object_symbol(); | 5014 : isolate->heap()->object_string(); |
5014 } | 5015 } |
5015 ASSERT(heap_obj->IsUndefined()); | 5016 ASSERT(heap_obj->IsUndefined()); |
5016 return isolate->heap()->undefined_symbol(); | 5017 return isolate->heap()->undefined_string(); |
5017 case JS_FUNCTION_TYPE: | 5018 case JS_FUNCTION_TYPE: |
5018 case JS_FUNCTION_PROXY_TYPE: | 5019 case JS_FUNCTION_PROXY_TYPE: |
5019 return isolate->heap()->function_symbol(); | 5020 return isolate->heap()->function_string(); |
5020 default: | 5021 default: |
5021 // For any kind of object not handled above, the spec rule for | 5022 // For any kind of object not handled above, the spec rule for |
5022 // host objects gives that it is okay to return "object" | 5023 // host objects gives that it is okay to return "object" |
5023 return isolate->heap()->object_symbol(); | 5024 return isolate->heap()->object_string(); |
5024 } | 5025 } |
5025 } | 5026 } |
5026 | 5027 |
5027 | 5028 |
5028 static bool AreDigits(const uint8_t*s, int from, int to) { | 5029 static bool AreDigits(const uint8_t*s, int from, int to) { |
5029 for (int i = from; i < to; i++) { | 5030 for (int i = from; i < to; i++) { |
5030 if (s[i] < '0' || s[i] > '9') return false; | 5031 if (s[i] < '0' || s[i] > '9') return false; |
5031 } | 5032 } |
5032 | 5033 |
5033 return true; | 5034 return true; |
(...skipping 1481 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6515 CONVERT_ARG_CHECKED(String, special, 2); | 6516 CONVERT_ARG_CHECKED(String, special, 2); |
6516 | 6517 |
6517 // This assumption is used by the slice encoding in one or two smis. | 6518 // This assumption is used by the slice encoding in one or two smis. |
6518 ASSERT(Smi::kMaxValue >= String::kMaxLength); | 6519 ASSERT(Smi::kMaxValue >= String::kMaxLength); |
6519 | 6520 |
6520 MaybeObject* maybe_result = array->EnsureCanContainHeapObjectElements(); | 6521 MaybeObject* maybe_result = array->EnsureCanContainHeapObjectElements(); |
6521 if (maybe_result->IsFailure()) return maybe_result; | 6522 if (maybe_result->IsFailure()) return maybe_result; |
6522 | 6523 |
6523 int special_length = special->length(); | 6524 int special_length = special->length(); |
6524 if (!array->HasFastObjectElements()) { | 6525 if (!array->HasFastObjectElements()) { |
6525 return isolate->Throw(isolate->heap()->illegal_argument_symbol()); | 6526 return isolate->Throw(isolate->heap()->illegal_argument_string()); |
6526 } | 6527 } |
6527 FixedArray* fixed_array = FixedArray::cast(array->elements()); | 6528 FixedArray* fixed_array = FixedArray::cast(array->elements()); |
6528 if (fixed_array->length() < array_length) { | 6529 if (fixed_array->length() < array_length) { |
6529 array_length = fixed_array->length(); | 6530 array_length = fixed_array->length(); |
6530 } | 6531 } |
6531 | 6532 |
6532 if (array_length == 0) { | 6533 if (array_length == 0) { |
6533 return isolate->heap()->empty_string(); | 6534 return isolate->heap()->empty_string(); |
6534 } else if (array_length == 1) { | 6535 } else if (array_length == 1) { |
6535 Object* first = fixed_array->get(0); | 6536 Object* first = fixed_array->get(0); |
(...skipping 13 matching lines...) Expand all Loading... |
6549 if (smi_value > 0) { | 6550 if (smi_value > 0) { |
6550 // Position and length encoded in one smi. | 6551 // Position and length encoded in one smi. |
6551 pos = StringBuilderSubstringPosition::decode(smi_value); | 6552 pos = StringBuilderSubstringPosition::decode(smi_value); |
6552 len = StringBuilderSubstringLength::decode(smi_value); | 6553 len = StringBuilderSubstringLength::decode(smi_value); |
6553 } else { | 6554 } else { |
6554 // Position and length encoded in two smis. | 6555 // Position and length encoded in two smis. |
6555 len = -smi_value; | 6556 len = -smi_value; |
6556 // Get the position and check that it is a positive smi. | 6557 // Get the position and check that it is a positive smi. |
6557 i++; | 6558 i++; |
6558 if (i >= array_length) { | 6559 if (i >= array_length) { |
6559 return isolate->Throw(isolate->heap()->illegal_argument_symbol()); | 6560 return isolate->Throw(isolate->heap()->illegal_argument_string()); |
6560 } | 6561 } |
6561 Object* next_smi = fixed_array->get(i); | 6562 Object* next_smi = fixed_array->get(i); |
6562 if (!next_smi->IsSmi()) { | 6563 if (!next_smi->IsSmi()) { |
6563 return isolate->Throw(isolate->heap()->illegal_argument_symbol()); | 6564 return isolate->Throw(isolate->heap()->illegal_argument_string()); |
6564 } | 6565 } |
6565 pos = Smi::cast(next_smi)->value(); | 6566 pos = Smi::cast(next_smi)->value(); |
6566 if (pos < 0) { | 6567 if (pos < 0) { |
6567 return isolate->Throw(isolate->heap()->illegal_argument_symbol()); | 6568 return isolate->Throw(isolate->heap()->illegal_argument_string()); |
6568 } | 6569 } |
6569 } | 6570 } |
6570 ASSERT(pos >= 0); | 6571 ASSERT(pos >= 0); |
6571 ASSERT(len >= 0); | 6572 ASSERT(len >= 0); |
6572 if (pos > special_length || len > special_length - pos) { | 6573 if (pos > special_length || len > special_length - pos) { |
6573 return isolate->Throw(isolate->heap()->illegal_argument_symbol()); | 6574 return isolate->Throw(isolate->heap()->illegal_argument_string()); |
6574 } | 6575 } |
6575 increment = len; | 6576 increment = len; |
6576 } else if (elt->IsString()) { | 6577 } else if (elt->IsString()) { |
6577 String* element = String::cast(elt); | 6578 String* element = String::cast(elt); |
6578 int element_length = element->length(); | 6579 int element_length = element->length(); |
6579 increment = element_length; | 6580 increment = element_length; |
6580 if (one_byte && !element->IsOneByteConvertible()) { | 6581 if (one_byte && !element->IsOneByteConvertible()) { |
6581 one_byte = false; | 6582 one_byte = false; |
6582 } | 6583 } |
6583 } else { | 6584 } else { |
6584 ASSERT(!elt->IsTheHole()); | 6585 ASSERT(!elt->IsTheHole()); |
6585 return isolate->Throw(isolate->heap()->illegal_argument_symbol()); | 6586 return isolate->Throw(isolate->heap()->illegal_argument_string()); |
6586 } | 6587 } |
6587 if (increment > String::kMaxLength - position) { | 6588 if (increment > String::kMaxLength - position) { |
6588 isolate->context()->mark_out_of_memory(); | 6589 isolate->context()->mark_out_of_memory(); |
6589 return Failure::OutOfMemoryException(0x15); | 6590 return Failure::OutOfMemoryException(0x15); |
6590 } | 6591 } |
6591 position += increment; | 6592 position += increment; |
6592 } | 6593 } |
6593 | 6594 |
6594 int length = position; | 6595 int length = position; |
6595 Object* object; | 6596 Object* object; |
(...skipping 29 matching lines...) Expand all Loading... |
6625 ASSERT(args.length() == 3); | 6626 ASSERT(args.length() == 3); |
6626 CONVERT_ARG_CHECKED(JSArray, array, 0); | 6627 CONVERT_ARG_CHECKED(JSArray, array, 0); |
6627 if (!args[1]->IsSmi()) { | 6628 if (!args[1]->IsSmi()) { |
6628 isolate->context()->mark_out_of_memory(); | 6629 isolate->context()->mark_out_of_memory(); |
6629 return Failure::OutOfMemoryException(0x16); | 6630 return Failure::OutOfMemoryException(0x16); |
6630 } | 6631 } |
6631 int array_length = args.smi_at(1); | 6632 int array_length = args.smi_at(1); |
6632 CONVERT_ARG_CHECKED(String, separator, 2); | 6633 CONVERT_ARG_CHECKED(String, separator, 2); |
6633 | 6634 |
6634 if (!array->HasFastObjectElements()) { | 6635 if (!array->HasFastObjectElements()) { |
6635 return isolate->Throw(isolate->heap()->illegal_argument_symbol()); | 6636 return isolate->Throw(isolate->heap()->illegal_argument_string()); |
6636 } | 6637 } |
6637 FixedArray* fixed_array = FixedArray::cast(array->elements()); | 6638 FixedArray* fixed_array = FixedArray::cast(array->elements()); |
6638 if (fixed_array->length() < array_length) { | 6639 if (fixed_array->length() < array_length) { |
6639 array_length = fixed_array->length(); | 6640 array_length = fixed_array->length(); |
6640 } | 6641 } |
6641 | 6642 |
6642 if (array_length == 0) { | 6643 if (array_length == 0) { |
6643 return isolate->heap()->empty_string(); | 6644 return isolate->heap()->empty_string(); |
6644 } else if (array_length == 1) { | 6645 } else if (array_length == 1) { |
6645 Object* first = fixed_array->get(0); | 6646 Object* first = fixed_array->get(0); |
6646 if (first->IsString()) return first; | 6647 if (first->IsString()) return first; |
6647 } | 6648 } |
6648 | 6649 |
6649 int separator_length = separator->length(); | 6650 int separator_length = separator->length(); |
6650 int max_nof_separators = | 6651 int max_nof_separators = |
6651 (String::kMaxLength + separator_length - 1) / separator_length; | 6652 (String::kMaxLength + separator_length - 1) / separator_length; |
6652 if (max_nof_separators < (array_length - 1)) { | 6653 if (max_nof_separators < (array_length - 1)) { |
6653 isolate->context()->mark_out_of_memory(); | 6654 isolate->context()->mark_out_of_memory(); |
6654 return Failure::OutOfMemoryException(0x17); | 6655 return Failure::OutOfMemoryException(0x17); |
6655 } | 6656 } |
6656 int length = (array_length - 1) * separator_length; | 6657 int length = (array_length - 1) * separator_length; |
6657 for (int i = 0; i < array_length; i++) { | 6658 for (int i = 0; i < array_length; i++) { |
6658 Object* element_obj = fixed_array->get(i); | 6659 Object* element_obj = fixed_array->get(i); |
6659 if (!element_obj->IsString()) { | 6660 if (!element_obj->IsString()) { |
6660 // TODO(1161): handle this case. | 6661 // TODO(1161): handle this case. |
6661 return isolate->Throw(isolate->heap()->illegal_argument_symbol()); | 6662 return isolate->Throw(isolate->heap()->illegal_argument_string()); |
6662 } | 6663 } |
6663 String* element = String::cast(element_obj); | 6664 String* element = String::cast(element_obj); |
6664 int increment = element->length(); | 6665 int increment = element->length(); |
6665 if (increment > String::kMaxLength - length) { | 6666 if (increment > String::kMaxLength - length) { |
6666 isolate->context()->mark_out_of_memory(); | 6667 isolate->context()->mark_out_of_memory(); |
6667 return Failure::OutOfMemoryException(0x18); | 6668 return Failure::OutOfMemoryException(0x18); |
6668 } | 6669 } |
6669 length += increment; | 6670 length += increment; |
6670 } | 6671 } |
6671 | 6672 |
(...skipping 984 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7656 } | 7657 } |
7657 // Copy arguments, skipping the first which is "this_arg". | 7658 // Copy arguments, skipping the first which is "this_arg". |
7658 for (int j = 0; j < argc; j++, i++) { | 7659 for (int j = 0; j < argc; j++, i++) { |
7659 new_bindings->set(i, *arguments[j + 1]); | 7660 new_bindings->set(i, *arguments[j + 1]); |
7660 } | 7661 } |
7661 new_bindings->set_map_no_write_barrier( | 7662 new_bindings->set_map_no_write_barrier( |
7662 isolate->heap()->fixed_cow_array_map()); | 7663 isolate->heap()->fixed_cow_array_map()); |
7663 bound_function->set_function_bindings(*new_bindings); | 7664 bound_function->set_function_bindings(*new_bindings); |
7664 | 7665 |
7665 // Update length. | 7666 // Update length. |
7666 Handle<String> length_symbol = isolate->factory()->length_symbol(); | 7667 Handle<String> length_string = isolate->factory()->length_string(); |
7667 Handle<Object> new_length(args.at<Object>(3)); | 7668 Handle<Object> new_length(args.at<Object>(3)); |
7668 PropertyAttributes attr = | 7669 PropertyAttributes attr = |
7669 static_cast<PropertyAttributes>(DONT_DELETE | DONT_ENUM | READ_ONLY); | 7670 static_cast<PropertyAttributes>(DONT_DELETE | DONT_ENUM | READ_ONLY); |
7670 ForceSetProperty(bound_function, length_symbol, new_length, attr); | 7671 ForceSetProperty(bound_function, length_string, new_length, attr); |
7671 return *bound_function; | 7672 return *bound_function; |
7672 } | 7673 } |
7673 | 7674 |
7674 | 7675 |
7675 RUNTIME_FUNCTION(MaybeObject*, Runtime_BoundFunctionGetBindings) { | 7676 RUNTIME_FUNCTION(MaybeObject*, Runtime_BoundFunctionGetBindings) { |
7676 HandleScope handles(isolate); | 7677 HandleScope handles(isolate); |
7677 ASSERT(args.length() == 1); | 7678 ASSERT(args.length() == 1); |
7678 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, callable, 0); | 7679 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, callable, 0); |
7679 if (callable->IsJSFunction()) { | 7680 if (callable->IsJSFunction()) { |
7680 Handle<JSFunction> function = Handle<JSFunction>::cast(callable); | 7681 Handle<JSFunction> function = Handle<JSFunction>::cast(callable); |
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7912 Compiler::RecompileParallel(args.at<JSFunction>(0)); | 7913 Compiler::RecompileParallel(args.at<JSFunction>(0)); |
7913 return isolate->heap()->undefined_value(); | 7914 return isolate->heap()->undefined_value(); |
7914 } | 7915 } |
7915 | 7916 |
7916 | 7917 |
7917 RUNTIME_FUNCTION(MaybeObject*, Runtime_ForceParallelRecompile) { | 7918 RUNTIME_FUNCTION(MaybeObject*, Runtime_ForceParallelRecompile) { |
7918 if (!V8::UseCrankshaft()) return isolate->heap()->undefined_value(); | 7919 if (!V8::UseCrankshaft()) return isolate->heap()->undefined_value(); |
7919 HandleScope handle_scope(isolate); | 7920 HandleScope handle_scope(isolate); |
7920 ASSERT(FLAG_parallel_recompilation && FLAG_manual_parallel_recompilation); | 7921 ASSERT(FLAG_parallel_recompilation && FLAG_manual_parallel_recompilation); |
7921 if (!isolate->optimizing_compiler_thread()->IsQueueAvailable()) { | 7922 if (!isolate->optimizing_compiler_thread()->IsQueueAvailable()) { |
7922 return isolate->Throw(*isolate->factory()->LookupOneByteSymbol( | 7923 return isolate->Throw(*isolate->factory()->InternalizeOneByteString( |
7923 STATIC_ASCII_VECTOR("Recompile queue is full."))); | 7924 STATIC_ASCII_VECTOR("Recompile queue is full."))); |
7924 } | 7925 } |
7925 CONVERT_ARG_HANDLE_CHECKED(JSFunction, fun, 0); | 7926 CONVERT_ARG_HANDLE_CHECKED(JSFunction, fun, 0); |
7926 fun->ReplaceCode(isolate->builtins()->builtin(Builtins::kParallelRecompile)); | 7927 fun->ReplaceCode(isolate->builtins()->builtin(Builtins::kParallelRecompile)); |
7927 Compiler::RecompileParallel(fun); | 7928 Compiler::RecompileParallel(fun); |
7928 return isolate->heap()->undefined_value(); | 7929 return isolate->heap()->undefined_value(); |
7929 } | 7930 } |
7930 | 7931 |
7931 | 7932 |
7932 RUNTIME_FUNCTION(MaybeObject*, Runtime_InstallRecompiledCode) { | 7933 RUNTIME_FUNCTION(MaybeObject*, Runtime_InstallRecompiledCode) { |
(...skipping 2430 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10363 } | 10364 } |
10364 | 10365 |
10365 | 10366 |
10366 RUNTIME_FUNCTION(MaybeObject*, Runtime_CheckExecutionState) { | 10367 RUNTIME_FUNCTION(MaybeObject*, Runtime_CheckExecutionState) { |
10367 ASSERT(args.length() >= 1); | 10368 ASSERT(args.length() >= 1); |
10368 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]); | 10369 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]); |
10369 // Check that the break id is valid. | 10370 // Check that the break id is valid. |
10370 if (isolate->debug()->break_id() == 0 || | 10371 if (isolate->debug()->break_id() == 0 || |
10371 break_id != isolate->debug()->break_id()) { | 10372 break_id != isolate->debug()->break_id()) { |
10372 return isolate->Throw( | 10373 return isolate->Throw( |
10373 isolate->heap()->illegal_execution_state_symbol()); | 10374 isolate->heap()->illegal_execution_state_string()); |
10374 } | 10375 } |
10375 | 10376 |
10376 return isolate->heap()->true_value(); | 10377 return isolate->heap()->true_value(); |
10377 } | 10378 } |
10378 | 10379 |
10379 | 10380 |
10380 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetFrameCount) { | 10381 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetFrameCount) { |
10381 HandleScope scope(isolate); | 10382 HandleScope scope(isolate); |
10382 ASSERT(args.length() == 1); | 10383 ASSERT(args.length() == 1); |
10383 | 10384 |
(...skipping 1528 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11912 RUNTIME_FUNCTION(MaybeObject*, Runtime_PrepareStep) { | 11913 RUNTIME_FUNCTION(MaybeObject*, Runtime_PrepareStep) { |
11913 HandleScope scope(isolate); | 11914 HandleScope scope(isolate); |
11914 ASSERT(args.length() == 3); | 11915 ASSERT(args.length() == 3); |
11915 // Check arguments. | 11916 // Check arguments. |
11916 Object* check; | 11917 Object* check; |
11917 { MaybeObject* maybe_check = Runtime_CheckExecutionState( | 11918 { MaybeObject* maybe_check = Runtime_CheckExecutionState( |
11918 RUNTIME_ARGUMENTS(isolate, args)); | 11919 RUNTIME_ARGUMENTS(isolate, args)); |
11919 if (!maybe_check->ToObject(&check)) return maybe_check; | 11920 if (!maybe_check->ToObject(&check)) return maybe_check; |
11920 } | 11921 } |
11921 if (!args[1]->IsNumber() || !args[2]->IsNumber()) { | 11922 if (!args[1]->IsNumber() || !args[2]->IsNumber()) { |
11922 return isolate->Throw(isolate->heap()->illegal_argument_symbol()); | 11923 return isolate->Throw(isolate->heap()->illegal_argument_string()); |
11923 } | 11924 } |
11924 | 11925 |
11925 // Get the step action and check validity. | 11926 // Get the step action and check validity. |
11926 StepAction step_action = static_cast<StepAction>(NumberToInt32(args[1])); | 11927 StepAction step_action = static_cast<StepAction>(NumberToInt32(args[1])); |
11927 if (step_action != StepIn && | 11928 if (step_action != StepIn && |
11928 step_action != StepNext && | 11929 step_action != StepNext && |
11929 step_action != StepOut && | 11930 step_action != StepOut && |
11930 step_action != StepInMin && | 11931 step_action != StepInMin && |
11931 step_action != StepMin) { | 11932 step_action != StepMin) { |
11932 return isolate->Throw(isolate->heap()->illegal_argument_symbol()); | 11933 return isolate->Throw(isolate->heap()->illegal_argument_string()); |
11933 } | 11934 } |
11934 | 11935 |
11935 // Get the number of steps. | 11936 // Get the number of steps. |
11936 int step_count = NumberToInt32(args[2]); | 11937 int step_count = NumberToInt32(args[2]); |
11937 if (step_count < 1) { | 11938 if (step_count < 1) { |
11938 return isolate->Throw(isolate->heap()->illegal_argument_symbol()); | 11939 return isolate->Throw(isolate->heap()->illegal_argument_string()); |
11939 } | 11940 } |
11940 | 11941 |
11941 // Clear all current stepping setup. | 11942 // Clear all current stepping setup. |
11942 isolate->debug()->ClearStepping(); | 11943 isolate->debug()->ClearStepping(); |
11943 | 11944 |
11944 // Prepare step. | 11945 // Prepare step. |
11945 isolate->debug()->PrepareStep(static_cast<StepAction>(step_action), | 11946 isolate->debug()->PrepareStep(static_cast<StepAction>(step_action), |
11946 step_count); | 11947 step_count); |
11947 return isolate->heap()->undefined_value(); | 11948 return isolate->heap()->undefined_value(); |
11948 } | 11949 } |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12026 static Handle<Object> GetArgumentsObject(Isolate* isolate, | 12027 static Handle<Object> GetArgumentsObject(Isolate* isolate, |
12027 JavaScriptFrame* frame, | 12028 JavaScriptFrame* frame, |
12028 FrameInspector* frame_inspector, | 12029 FrameInspector* frame_inspector, |
12029 Handle<ScopeInfo> scope_info, | 12030 Handle<ScopeInfo> scope_info, |
12030 Handle<Context> function_context) { | 12031 Handle<Context> function_context) { |
12031 // Try to find the value of 'arguments' to pass as parameter. If it is not | 12032 // Try to find the value of 'arguments' to pass as parameter. If it is not |
12032 // found (that is the debugged function does not reference 'arguments' and | 12033 // found (that is the debugged function does not reference 'arguments' and |
12033 // does not support eval) then create an 'arguments' object. | 12034 // does not support eval) then create an 'arguments' object. |
12034 int index; | 12035 int index; |
12035 if (scope_info->StackLocalCount() > 0) { | 12036 if (scope_info->StackLocalCount() > 0) { |
12036 index = scope_info->StackSlotIndex(isolate->heap()->arguments_symbol()); | 12037 index = scope_info->StackSlotIndex(isolate->heap()->arguments_string()); |
12037 if (index != -1) { | 12038 if (index != -1) { |
12038 return Handle<Object>(frame->GetExpression(index), isolate); | 12039 return Handle<Object>(frame->GetExpression(index), isolate); |
12039 } | 12040 } |
12040 } | 12041 } |
12041 | 12042 |
12042 if (scope_info->HasHeapAllocatedLocals()) { | 12043 if (scope_info->HasHeapAllocatedLocals()) { |
12043 VariableMode mode; | 12044 VariableMode mode; |
12044 InitializationFlag init_flag; | 12045 InitializationFlag init_flag; |
12045 index = scope_info->ContextSlotIndex( | 12046 index = scope_info->ContextSlotIndex( |
12046 isolate->heap()->arguments_symbol(), &mode, &init_flag); | 12047 isolate->heap()->arguments_string(), &mode, &init_flag); |
12047 if (index != -1) { | 12048 if (index != -1) { |
12048 return Handle<Object>(function_context->get(index), isolate); | 12049 return Handle<Object>(function_context->get(index), isolate); |
12049 } | 12050 } |
12050 } | 12051 } |
12051 | 12052 |
12052 Handle<JSFunction> function(JSFunction::cast(frame_inspector->GetFunction())); | 12053 Handle<JSFunction> function(JSFunction::cast(frame_inspector->GetFunction())); |
12053 int length = frame_inspector->GetParametersCount(); | 12054 int length = frame_inspector->GetParametersCount(); |
12054 Handle<JSObject> arguments = | 12055 Handle<JSObject> arguments = |
12055 isolate->factory()->NewArgumentsObject(function, length); | 12056 isolate->factory()->NewArgumentsObject(function, length); |
12056 Handle<FixedArray> array = isolate->factory()->NewFixedArray(length); | 12057 Handle<FixedArray> array = isolate->factory()->NewFixedArray(length); |
(...skipping 834 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12891 JavaScriptFrameIterator it(isolate, id); | 12892 JavaScriptFrameIterator it(isolate, id); |
12892 for (; !it.done(); it.Advance()) { | 12893 for (; !it.done(); it.Advance()) { |
12893 if (index < count + it.frame()->GetInlineCount()) break; | 12894 if (index < count + it.frame()->GetInlineCount()) break; |
12894 count += it.frame()->GetInlineCount(); | 12895 count += it.frame()->GetInlineCount(); |
12895 } | 12896 } |
12896 if (it.done()) return heap->undefined_value(); | 12897 if (it.done()) return heap->undefined_value(); |
12897 | 12898 |
12898 const char* error_message = | 12899 const char* error_message = |
12899 LiveEdit::RestartFrame(it.frame(), isolate->runtime_zone()); | 12900 LiveEdit::RestartFrame(it.frame(), isolate->runtime_zone()); |
12900 if (error_message) { | 12901 if (error_message) { |
12901 return *(isolate->factory()->LookupUtf8Symbol(error_message)); | 12902 return *(isolate->factory()->InternalizeUtf8String(error_message)); |
12902 } | 12903 } |
12903 return heap->true_value(); | 12904 return heap->true_value(); |
12904 } | 12905 } |
12905 | 12906 |
12906 | 12907 |
12907 // A testing entry. Returns statement position which is the closest to | 12908 // A testing entry. Returns statement position which is the closest to |
12908 // source_position. | 12909 // source_position. |
12909 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetFunctionCodePositionFromSource) { | 12910 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetFunctionCodePositionFromSource) { |
12910 CHECK(isolate->debugger()->live_edit_enabled()); | 12911 CHECK(isolate->debugger()->live_edit_enabled()); |
12911 ASSERT(args.length() == 2); | 12912 ASSERT(args.length() == 2); |
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13080 // Capture a simple stack trace for the stack property. | 13081 // Capture a simple stack trace for the stack property. |
13081 return *isolate->CaptureSimpleStackTrace(error_object, caller, limit); | 13082 return *isolate->CaptureSimpleStackTrace(error_object, caller, limit); |
13082 } | 13083 } |
13083 | 13084 |
13084 | 13085 |
13085 // Mark a function to recognize when called after GC to format the stack trace. | 13086 // Mark a function to recognize when called after GC to format the stack trace. |
13086 RUNTIME_FUNCTION(MaybeObject*, Runtime_MarkOneShotGetter) { | 13087 RUNTIME_FUNCTION(MaybeObject*, Runtime_MarkOneShotGetter) { |
13087 ASSERT_EQ(args.length(), 1); | 13088 ASSERT_EQ(args.length(), 1); |
13088 CONVERT_ARG_HANDLE_CHECKED(JSFunction, fun, 0); | 13089 CONVERT_ARG_HANDLE_CHECKED(JSFunction, fun, 0); |
13089 HandleScope scope(isolate); | 13090 HandleScope scope(isolate); |
13090 Handle<String> key = isolate->factory()->hidden_stack_trace_symbol(); | 13091 Handle<String> key = isolate->factory()->hidden_stack_trace_string(); |
13091 JSObject::SetHiddenProperty(fun, key, key); | 13092 JSObject::SetHiddenProperty(fun, key, key); |
13092 return *fun; | 13093 return *fun; |
13093 } | 13094 } |
13094 | 13095 |
13095 | 13096 |
13096 // Retrieve the stack trace. This could be the raw stack trace collected | 13097 // Retrieve the stack trace. This could be the raw stack trace collected |
13097 // on stack overflow or the already formatted stack trace string. | 13098 // on stack overflow or the already formatted stack trace string. |
13098 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetOverflowedStackTrace) { | 13099 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetOverflowedStackTrace) { |
13099 HandleScope scope(isolate); | 13100 HandleScope scope(isolate); |
13100 ASSERT_EQ(args.length(), 1); | 13101 ASSERT_EQ(args.length(), 1); |
13101 CONVERT_ARG_CHECKED(JSObject, error_object, 0); | 13102 CONVERT_ARG_CHECKED(JSObject, error_object, 0); |
13102 String* key = isolate->heap()->hidden_stack_trace_symbol(); | 13103 String* key = isolate->heap()->hidden_stack_trace_string(); |
13103 Object* result = error_object->GetHiddenProperty(key); | 13104 Object* result = error_object->GetHiddenProperty(key); |
13104 RUNTIME_ASSERT(result->IsJSArray() || | 13105 RUNTIME_ASSERT(result->IsJSArray() || |
13105 result->IsString() || | 13106 result->IsString() || |
13106 result->IsUndefined()); | 13107 result->IsUndefined()); |
13107 return result; | 13108 return result; |
13108 } | 13109 } |
13109 | 13110 |
13110 | 13111 |
13111 // Set or clear the stack trace attached to an stack overflow error object. | 13112 // Set or clear the stack trace attached to an stack overflow error object. |
13112 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetOverflowedStackTrace) { | 13113 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetOverflowedStackTrace) { |
13113 HandleScope scope(isolate); | 13114 HandleScope scope(isolate); |
13114 ASSERT_EQ(args.length(), 2); | 13115 ASSERT_EQ(args.length(), 2); |
13115 CONVERT_ARG_HANDLE_CHECKED(JSObject, error_object, 0); | 13116 CONVERT_ARG_HANDLE_CHECKED(JSObject, error_object, 0); |
13116 CONVERT_ARG_HANDLE_CHECKED(HeapObject, value, 1); | 13117 CONVERT_ARG_HANDLE_CHECKED(HeapObject, value, 1); |
13117 Handle<String> key = isolate->factory()->hidden_stack_trace_symbol(); | 13118 Handle<String> key = isolate->factory()->hidden_stack_trace_string(); |
13118 if (value->IsUndefined()) { | 13119 if (value->IsUndefined()) { |
13119 error_object->DeleteHiddenProperty(*key); | 13120 error_object->DeleteHiddenProperty(*key); |
13120 } else { | 13121 } else { |
13121 RUNTIME_ASSERT(value->IsString()); | 13122 RUNTIME_ASSERT(value->IsString()); |
13122 JSObject::SetHiddenProperty(error_object, key, value); | 13123 JSObject::SetHiddenProperty(error_object, key, value); |
13123 } | 13124 } |
13124 return *error_object; | 13125 return *error_object; |
13125 } | 13126 } |
13126 | 13127 |
13127 | 13128 |
(...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13466 INLINE_RUNTIME_FUNCTION_LIST(I) | 13467 INLINE_RUNTIME_FUNCTION_LIST(I) |
13467 }; | 13468 }; |
13468 | 13469 |
13469 | 13470 |
13470 MaybeObject* Runtime::InitializeIntrinsicFunctionNames(Heap* heap, | 13471 MaybeObject* Runtime::InitializeIntrinsicFunctionNames(Heap* heap, |
13471 Object* dictionary) { | 13472 Object* dictionary) { |
13472 ASSERT(Isolate::Current()->heap() == heap); | 13473 ASSERT(Isolate::Current()->heap() == heap); |
13473 ASSERT(dictionary != NULL); | 13474 ASSERT(dictionary != NULL); |
13474 ASSERT(StringDictionary::cast(dictionary)->NumberOfElements() == 0); | 13475 ASSERT(StringDictionary::cast(dictionary)->NumberOfElements() == 0); |
13475 for (int i = 0; i < kNumFunctions; ++i) { | 13476 for (int i = 0; i < kNumFunctions; ++i) { |
13476 Object* name_symbol; | 13477 Object* name_string; |
13477 { MaybeObject* maybe_name_symbol = | 13478 { MaybeObject* maybe_name_string = |
13478 heap->LookupUtf8Symbol(kIntrinsicFunctions[i].name); | 13479 heap->InternalizeUtf8String(kIntrinsicFunctions[i].name); |
13479 if (!maybe_name_symbol->ToObject(&name_symbol)) return maybe_name_symbol; | 13480 if (!maybe_name_string->ToObject(&name_string)) return maybe_name_string; |
13480 } | 13481 } |
13481 StringDictionary* string_dictionary = StringDictionary::cast(dictionary); | 13482 StringDictionary* string_dictionary = StringDictionary::cast(dictionary); |
13482 { MaybeObject* maybe_dictionary = string_dictionary->Add( | 13483 { MaybeObject* maybe_dictionary = string_dictionary->Add( |
13483 String::cast(name_symbol), | 13484 String::cast(name_string), |
13484 Smi::FromInt(i), | 13485 Smi::FromInt(i), |
13485 PropertyDetails(NONE, NORMAL)); | 13486 PropertyDetails(NONE, NORMAL)); |
13486 if (!maybe_dictionary->ToObject(&dictionary)) { | 13487 if (!maybe_dictionary->ToObject(&dictionary)) { |
13487 // Non-recoverable failure. Calling code must restart heap | 13488 // Non-recoverable failure. Calling code must restart heap |
13488 // initialization. | 13489 // initialization. |
13489 return maybe_dictionary; | 13490 return maybe_dictionary; |
13490 } | 13491 } |
13491 } | 13492 } |
13492 } | 13493 } |
13493 return dictionary; | 13494 return dictionary; |
13494 } | 13495 } |
13495 | 13496 |
13496 | 13497 |
13497 const Runtime::Function* Runtime::FunctionForSymbol(Handle<String> name) { | 13498 const Runtime::Function* Runtime::FunctionForName(Handle<String> name) { |
13498 Heap* heap = name->GetHeap(); | 13499 Heap* heap = name->GetHeap(); |
13499 int entry = heap->intrinsic_function_names()->FindEntry(*name); | 13500 int entry = heap->intrinsic_function_names()->FindEntry(*name); |
13500 if (entry != kNotFound) { | 13501 if (entry != kNotFound) { |
13501 Object* smi_index = heap->intrinsic_function_names()->ValueAt(entry); | 13502 Object* smi_index = heap->intrinsic_function_names()->ValueAt(entry); |
13502 int function_index = Smi::cast(smi_index)->value(); | 13503 int function_index = Smi::cast(smi_index)->value(); |
13503 return &(kIntrinsicFunctions[function_index]); | 13504 return &(kIntrinsicFunctions[function_index]); |
13504 } | 13505 } |
13505 return NULL; | 13506 return NULL; |
13506 } | 13507 } |
13507 | 13508 |
(...skipping 19 matching lines...) Expand all Loading... |
13527 // Handle last resort GC and make sure to allow future allocations | 13528 // Handle last resort GC and make sure to allow future allocations |
13528 // to grow the heap without causing GCs (if possible). | 13529 // to grow the heap without causing GCs (if possible). |
13529 isolate->counters()->gc_last_resort_from_js()->Increment(); | 13530 isolate->counters()->gc_last_resort_from_js()->Increment(); |
13530 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags, | 13531 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags, |
13531 "Runtime::PerformGC"); | 13532 "Runtime::PerformGC"); |
13532 } | 13533 } |
13533 } | 13534 } |
13534 | 13535 |
13535 | 13536 |
13536 } } // namespace v8::internal | 13537 } } // namespace v8::internal |
OLD | NEW |