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 1893 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1904 VALUE_INDEX, | 1904 VALUE_INDEX, |
1905 GETTER_INDEX, | 1905 GETTER_INDEX, |
1906 SETTER_INDEX, | 1906 SETTER_INDEX, |
1907 WRITABLE_INDEX, | 1907 WRITABLE_INDEX, |
1908 ENUMERABLE_INDEX, | 1908 ENUMERABLE_INDEX, |
1909 CONFIGURABLE_INDEX, | 1909 CONFIGURABLE_INDEX, |
1910 DESCRIPTOR_SIZE | 1910 DESCRIPTOR_SIZE |
1911 }; | 1911 }; |
1912 | 1912 |
1913 | 1913 |
1914 MUST_USE_RESULT static MaybeHandle<Object> GetOwnProperty( | 1914 MUST_USE_RESULT static MaybeHandle<Object> GetOwnProperty(Isolate* isolate, |
1915 Isolate* isolate, | 1915 Handle<JSObject> obj, |
1916 Handle<JSObject> obj, | 1916 Handle<Name> name) { |
1917 Handle<Name> name) { | |
1918 Heap* heap = isolate->heap(); | 1917 Heap* heap = isolate->heap(); |
1919 Factory* factory = isolate->factory(); | 1918 Factory* factory = isolate->factory(); |
1920 // Due to some WebKit tests, we want to make sure that we do not log | 1919 // Due to some WebKit tests, we want to make sure that we do not log |
1921 // more than one access failure here. | 1920 // more than one access failure here. |
1922 AccessCheckResult access_check_result = | 1921 AccessCheckResult access_check_result = |
1923 CheckPropertyAccess(obj, name, v8::ACCESS_HAS); | 1922 CheckPropertyAccess(obj, name, v8::ACCESS_HAS); |
1924 RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object); | 1923 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); |
1925 switch (access_check_result) { | 1924 switch (access_check_result) { |
1926 case ACCESS_FORBIDDEN: return factory->false_value(); | 1925 case ACCESS_FORBIDDEN: return factory->false_value(); |
1927 case ACCESS_ALLOWED: break; | 1926 case ACCESS_ALLOWED: break; |
1928 case ACCESS_ABSENT: return factory->undefined_value(); | 1927 case ACCESS_ABSENT: return factory->undefined_value(); |
1929 } | 1928 } |
1930 | 1929 |
1931 PropertyAttributes attrs = JSReceiver::GetLocalPropertyAttribute(obj, name); | 1930 PropertyAttributes attrs = JSReceiver::GetLocalPropertyAttribute(obj, name); |
1932 if (attrs == ABSENT) { | 1931 if (attrs == ABSENT) { |
1933 RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object); | 1932 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); |
1934 return factory->undefined_value(); | 1933 return factory->undefined_value(); |
1935 } | 1934 } |
1936 ASSERT(!isolate->has_scheduled_exception()); | 1935 ASSERT(!isolate->has_scheduled_exception()); |
1937 Handle<AccessorPair> accessors; | 1936 Handle<AccessorPair> accessors; |
1938 bool has_accessors = | 1937 bool has_accessors = |
1939 JSObject::GetLocalPropertyAccessorPair(obj, name).ToHandle(&accessors); | 1938 JSObject::GetLocalPropertyAccessorPair(obj, name).ToHandle(&accessors); |
1940 Handle<FixedArray> elms = isolate->factory()->NewFixedArray(DESCRIPTOR_SIZE); | 1939 Handle<FixedArray> elms = isolate->factory()->NewFixedArray(DESCRIPTOR_SIZE); |
1941 elms->set(ENUMERABLE_INDEX, heap->ToBoolean((attrs & DONT_ENUM) == 0)); | 1940 elms->set(ENUMERABLE_INDEX, heap->ToBoolean((attrs & DONT_ENUM) == 0)); |
1942 elms->set(CONFIGURABLE_INDEX, heap->ToBoolean((attrs & DONT_DELETE) == 0)); | 1941 elms->set(CONFIGURABLE_INDEX, heap->ToBoolean((attrs & DONT_DELETE) == 0)); |
1943 elms->set(IS_ACCESSOR_INDEX, heap->ToBoolean(has_accessors)); | 1942 elms->set(IS_ACCESSOR_INDEX, heap->ToBoolean(has_accessors)); |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2047 } | 2046 } |
2048 | 2047 |
2049 | 2048 |
2050 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetTemplateField) { | 2049 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetTemplateField) { |
2051 SealHandleScope shs(isolate); | 2050 SealHandleScope shs(isolate); |
2052 ASSERT(args.length() == 2); | 2051 ASSERT(args.length() == 2); |
2053 CONVERT_ARG_CHECKED(HeapObject, templ, 0); | 2052 CONVERT_ARG_CHECKED(HeapObject, templ, 0); |
2054 CONVERT_SMI_ARG_CHECKED(index, 1) | 2053 CONVERT_SMI_ARG_CHECKED(index, 1) |
2055 int offset = index * kPointerSize + HeapObject::kHeaderSize; | 2054 int offset = index * kPointerSize + HeapObject::kHeaderSize; |
2056 InstanceType type = templ->map()->instance_type(); | 2055 InstanceType type = templ->map()->instance_type(); |
2057 RUNTIME_ASSERT(type == FUNCTION_TEMPLATE_INFO_TYPE || | 2056 RUNTIME_ASSERT(type == FUNCTION_TEMPLATE_INFO_TYPE || |
2058 type == OBJECT_TEMPLATE_INFO_TYPE); | 2057 type == OBJECT_TEMPLATE_INFO_TYPE); |
2059 RUNTIME_ASSERT(offset > 0); | 2058 RUNTIME_ASSERT(offset > 0); |
2060 if (type == FUNCTION_TEMPLATE_INFO_TYPE) { | 2059 if (type == FUNCTION_TEMPLATE_INFO_TYPE) { |
2061 RUNTIME_ASSERT(offset < FunctionTemplateInfo::kSize); | 2060 RUNTIME_ASSERT(offset < FunctionTemplateInfo::kSize); |
2062 } else { | 2061 } else { |
2063 RUNTIME_ASSERT(offset < ObjectTemplateInfo::kSize); | 2062 RUNTIME_ASSERT(offset < ObjectTemplateInfo::kSize); |
2064 } | 2063 } |
2065 return *HeapObject::RawField(templ, offset); | 2064 return *HeapObject::RawField(templ, offset); |
2066 } | 2065 } |
2067 | 2066 |
2068 | 2067 |
(...skipping 664 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2733 return *holder; | 2732 return *holder; |
2734 } | 2733 } |
2735 | 2734 |
2736 | 2735 |
2737 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsSloppyModeFunction) { | 2736 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsSloppyModeFunction) { |
2738 SealHandleScope shs(isolate); | 2737 SealHandleScope shs(isolate); |
2739 ASSERT(args.length() == 1); | 2738 ASSERT(args.length() == 1); |
2740 CONVERT_ARG_CHECKED(JSReceiver, callable, 0); | 2739 CONVERT_ARG_CHECKED(JSReceiver, callable, 0); |
2741 if (!callable->IsJSFunction()) { | 2740 if (!callable->IsJSFunction()) { |
2742 HandleScope scope(isolate); | 2741 HandleScope scope(isolate); |
2743 bool threw = false; | 2742 Handle<Object> delegate; |
2744 Handle<Object> delegate = Execution::TryGetFunctionDelegate( | 2743 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
2745 isolate, Handle<JSReceiver>(callable), &threw); | 2744 isolate, delegate, |
2746 if (threw) return Failure::Exception(); | 2745 Execution::TryGetFunctionDelegate( |
| 2746 isolate, Handle<JSReceiver>(callable))); |
2747 callable = JSFunction::cast(*delegate); | 2747 callable = JSFunction::cast(*delegate); |
2748 } | 2748 } |
2749 JSFunction* function = JSFunction::cast(callable); | 2749 JSFunction* function = JSFunction::cast(callable); |
2750 SharedFunctionInfo* shared = function->shared(); | 2750 SharedFunctionInfo* shared = function->shared(); |
2751 return isolate->heap()->ToBoolean(shared->strict_mode() == SLOPPY); | 2751 return isolate->heap()->ToBoolean(shared->strict_mode() == SLOPPY); |
2752 } | 2752 } |
2753 | 2753 |
2754 | 2754 |
2755 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetDefaultReceiver) { | 2755 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetDefaultReceiver) { |
2756 SealHandleScope shs(isolate); | 2756 SealHandleScope shs(isolate); |
2757 ASSERT(args.length() == 1); | 2757 ASSERT(args.length() == 1); |
2758 CONVERT_ARG_CHECKED(JSReceiver, callable, 0); | 2758 CONVERT_ARG_CHECKED(JSReceiver, callable, 0); |
2759 | 2759 |
2760 if (!callable->IsJSFunction()) { | 2760 if (!callable->IsJSFunction()) { |
2761 HandleScope scope(isolate); | 2761 HandleScope scope(isolate); |
2762 bool threw = false; | 2762 Handle<Object> delegate; |
2763 Handle<Object> delegate = Execution::TryGetFunctionDelegate( | 2763 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
2764 isolate, Handle<JSReceiver>(callable), &threw); | 2764 isolate, delegate, |
2765 if (threw) return Failure::Exception(); | 2765 Execution::TryGetFunctionDelegate( |
| 2766 isolate, Handle<JSReceiver>(callable))); |
2766 callable = JSFunction::cast(*delegate); | 2767 callable = JSFunction::cast(*delegate); |
2767 } | 2768 } |
2768 JSFunction* function = JSFunction::cast(callable); | 2769 JSFunction* function = JSFunction::cast(callable); |
2769 | 2770 |
2770 SharedFunctionInfo* shared = function->shared(); | 2771 SharedFunctionInfo* shared = function->shared(); |
2771 if (shared->native() || shared->strict_mode() == STRICT) { | 2772 if (shared->native() || shared->strict_mode() == STRICT) { |
2772 return isolate->heap()->undefined_value(); | 2773 return isolate->heap()->undefined_value(); |
2773 } | 2774 } |
2774 // Returns undefined for strict or native functions, or | 2775 // Returns undefined for strict or native functions, or |
2775 // the associated global receiver for "normal" functions. | 2776 // the associated global receiver for "normal" functions. |
(...skipping 14 matching lines...) Expand all Loading... |
2790 | 2791 |
2791 // Get the RegExp function from the context in the literals array. | 2792 // Get the RegExp function from the context in the literals array. |
2792 // This is the RegExp function from the context in which the | 2793 // This is the RegExp function from the context in which the |
2793 // function was created. We do not use the RegExp function from the | 2794 // function was created. We do not use the RegExp function from the |
2794 // current native context because this might be the RegExp function | 2795 // current native context because this might be the RegExp function |
2795 // from another context which we should not have access to. | 2796 // from another context which we should not have access to. |
2796 Handle<JSFunction> constructor = | 2797 Handle<JSFunction> constructor = |
2797 Handle<JSFunction>( | 2798 Handle<JSFunction>( |
2798 JSFunction::NativeContextFromLiterals(*literals)->regexp_function()); | 2799 JSFunction::NativeContextFromLiterals(*literals)->regexp_function()); |
2799 // Compute the regular expression literal. | 2800 // Compute the regular expression literal. |
2800 bool has_pending_exception; | 2801 Handle<Object> regexp; |
2801 Handle<Object> regexp = | 2802 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
2802 RegExpImpl::CreateRegExpLiteral(constructor, pattern, flags, | 2803 isolate, regexp, |
2803 &has_pending_exception); | 2804 RegExpImpl::CreateRegExpLiteral(constructor, pattern, flags)); |
2804 if (has_pending_exception) { | |
2805 ASSERT(isolate->has_pending_exception()); | |
2806 return Failure::Exception(); | |
2807 } | |
2808 literals->set(index, *regexp); | 2805 literals->set(index, *regexp); |
2809 return *regexp; | 2806 return *regexp; |
2810 } | 2807 } |
2811 | 2808 |
2812 | 2809 |
2813 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionGetName) { | 2810 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionGetName) { |
2814 SealHandleScope shs(isolate); | 2811 SealHandleScope shs(isolate); |
2815 ASSERT(args.length() == 1); | 2812 ASSERT(args.length() == 1); |
2816 | 2813 |
2817 CONVERT_ARG_CHECKED(JSFunction, f, 0); | 2814 CONVERT_ARG_CHECKED(JSFunction, f, 0); |
(...skipping 2090 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4908 Handle<Object> result; | 4905 Handle<Object> result; |
4909 if (object->IsString() || object->IsNumber() || object->IsBoolean()) { | 4906 if (object->IsString() || object->IsNumber() || object->IsBoolean()) { |
4910 Handle<Object> proto(object->GetPrototype(isolate), isolate); | 4907 Handle<Object> proto(object->GetPrototype(isolate), isolate); |
4911 return Object::GetElement(isolate, proto, index); | 4908 return Object::GetElement(isolate, proto, index); |
4912 } else { | 4909 } else { |
4913 return Object::GetElement(isolate, object, index); | 4910 return Object::GetElement(isolate, object, index); |
4914 } | 4911 } |
4915 } | 4912 } |
4916 | 4913 |
4917 | 4914 |
4918 static Handle<Name> ToName(Isolate* isolate, Handle<Object> key) { | 4915 MUST_USE_RESULT |
| 4916 static MaybeHandle<Name> ToName(Isolate* isolate, Handle<Object> key) { |
4919 if (key->IsName()) { | 4917 if (key->IsName()) { |
4920 return Handle<Name>::cast(key); | 4918 return Handle<Name>::cast(key); |
4921 } else { | 4919 } else { |
4922 bool has_pending_exception = false; | 4920 Handle<Object> converted; |
4923 Handle<Object> converted = | 4921 ASSIGN_RETURN_ON_EXCEPTION( |
4924 Execution::ToString(isolate, key, &has_pending_exception); | 4922 isolate, converted, Execution::ToString(isolate, key), Name); |
4925 if (has_pending_exception) return Handle<Name>(); | |
4926 return Handle<Name>::cast(converted); | 4923 return Handle<Name>::cast(converted); |
4927 } | 4924 } |
4928 } | 4925 } |
4929 | 4926 |
4930 | 4927 |
4931 MaybeHandle<Object> Runtime::HasObjectProperty(Isolate* isolate, | 4928 MaybeHandle<Object> Runtime::HasObjectProperty(Isolate* isolate, |
4932 Handle<JSReceiver> object, | 4929 Handle<JSReceiver> object, |
4933 Handle<Object> key) { | 4930 Handle<Object> key) { |
4934 // Check if the given key is an array index. | 4931 // Check if the given key is an array index. |
4935 uint32_t index; | 4932 uint32_t index; |
4936 if (key->ToArrayIndex(&index)) { | 4933 if (key->ToArrayIndex(&index)) { |
4937 return isolate->factory()->ToBoolean(JSReceiver::HasElement(object, index)); | 4934 return isolate->factory()->ToBoolean(JSReceiver::HasElement(object, index)); |
4938 } | 4935 } |
4939 | 4936 |
4940 // Convert the key to a name - possibly by calling back into JavaScript. | 4937 // Convert the key to a name - possibly by calling back into JavaScript. |
4941 Handle<Name> name = ToName(isolate, key); | 4938 Handle<Name> name; |
4942 RETURN_IF_EMPTY_HANDLE_VALUE(isolate, name, MaybeHandle<Object>()); | 4939 ASSIGN_RETURN_ON_EXCEPTION(isolate, name, ToName(isolate, key), Object); |
4943 | 4940 |
4944 return isolate->factory()->ToBoolean(JSReceiver::HasProperty(object, name)); | 4941 return isolate->factory()->ToBoolean(JSReceiver::HasProperty(object, name)); |
4945 } | 4942 } |
4946 | 4943 |
4947 | 4944 |
4948 MaybeHandle<Object> Runtime::GetObjectProperty(Isolate* isolate, | 4945 MaybeHandle<Object> Runtime::GetObjectProperty(Isolate* isolate, |
4949 Handle<Object> object, | 4946 Handle<Object> object, |
4950 Handle<Object> key) { | 4947 Handle<Object> key) { |
4951 if (object->IsUndefined() || object->IsNull()) { | 4948 if (object->IsUndefined() || object->IsNull()) { |
4952 Handle<Object> args[2] = { key, object }; | 4949 Handle<Object> args[2] = { key, object }; |
4953 isolate->Throw(*isolate->factory()->NewTypeError("non_object_property_load", | 4950 return isolate->Throw<Object>( |
4954 HandleVector(args, 2))); | 4951 isolate->factory()->NewTypeError("non_object_property_load", |
4955 return Handle<Object>(); | 4952 HandleVector(args, 2))); |
4956 } | 4953 } |
4957 | 4954 |
4958 // Check if the given key is an array index. | 4955 // Check if the given key is an array index. |
4959 uint32_t index; | 4956 uint32_t index; |
4960 if (key->ToArrayIndex(&index)) { | 4957 if (key->ToArrayIndex(&index)) { |
4961 return GetElementOrCharAt(isolate, object, index); | 4958 return GetElementOrCharAt(isolate, object, index); |
4962 } | 4959 } |
4963 | 4960 |
4964 // Convert the key to a name - possibly by calling back into JavaScript. | 4961 // Convert the key to a name - possibly by calling back into JavaScript. |
4965 Handle<Name> name = ToName(isolate, key); | 4962 Handle<Name> name; |
4966 RETURN_IF_EMPTY_HANDLE_VALUE(isolate, name, Handle<Object>()); | 4963 ASSIGN_RETURN_ON_EXCEPTION(isolate, name, ToName(isolate, key), Object); |
4967 | 4964 |
4968 // Check if the name is trivially convertible to an index and get | 4965 // Check if the name is trivially convertible to an index and get |
4969 // the element if so. | 4966 // the element if so. |
4970 if (name->AsArrayIndex(&index)) { | 4967 if (name->AsArrayIndex(&index)) { |
4971 return GetElementOrCharAt(isolate, object, index); | 4968 return GetElementOrCharAt(isolate, object, index); |
4972 } else { | 4969 } else { |
4973 return Object::GetProperty(object, name); | 4970 return Object::GetProperty(object, name); |
4974 } | 4971 } |
4975 } | 4972 } |
4976 | 4973 |
(...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5248 if (object->IsUndefined() || object->IsNull()) { | 5245 if (object->IsUndefined() || object->IsNull()) { |
5249 Handle<Object> args[2] = { key, object }; | 5246 Handle<Object> args[2] = { key, object }; |
5250 Handle<Object> error = | 5247 Handle<Object> error = |
5251 isolate->factory()->NewTypeError("non_object_property_store", | 5248 isolate->factory()->NewTypeError("non_object_property_store", |
5252 HandleVector(args, 2)); | 5249 HandleVector(args, 2)); |
5253 isolate->Throw(*error); | 5250 isolate->Throw(*error); |
5254 return Handle<Object>(); | 5251 return Handle<Object>(); |
5255 } | 5252 } |
5256 | 5253 |
5257 if (object->IsJSProxy()) { | 5254 if (object->IsJSProxy()) { |
5258 bool has_pending_exception = false; | 5255 Handle<Object> name_object; |
5259 Handle<Object> name_object = key->IsSymbol() | 5256 if (key->IsSymbol()) { |
5260 ? key : Execution::ToString(isolate, key, &has_pending_exception); | 5257 name_object = key; |
5261 if (has_pending_exception) return MaybeHandle<Object>(); // exception | 5258 } else { |
| 5259 ASSIGN_RETURN_ON_EXCEPTION( |
| 5260 isolate, name_object, Execution::ToString(isolate, key), Object); |
| 5261 } |
5262 Handle<Name> name = Handle<Name>::cast(name_object); | 5262 Handle<Name> name = Handle<Name>::cast(name_object); |
5263 return JSReceiver::SetProperty(Handle<JSProxy>::cast(object), name, value, | 5263 return JSReceiver::SetProperty(Handle<JSProxy>::cast(object), name, value, |
5264 attr, | 5264 attr, |
5265 strict_mode); | 5265 strict_mode); |
5266 } | 5266 } |
5267 | 5267 |
5268 // If the object isn't a JavaScript object, we ignore the store. | 5268 // If the object isn't a JavaScript object, we ignore the store. |
5269 if (!object->IsJSObject()) return value; | 5269 if (!object->IsJSObject()) return value; |
5270 | 5270 |
5271 Handle<JSObject> js_object = Handle<JSObject>::cast(object); | 5271 Handle<JSObject> js_object = Handle<JSObject>::cast(object); |
5272 | 5272 |
5273 // Check if the given key is an array index. | 5273 // Check if the given key is an array index. |
5274 uint32_t index; | 5274 uint32_t index; |
5275 if (key->ToArrayIndex(&index)) { | 5275 if (key->ToArrayIndex(&index)) { |
5276 // In Firefox/SpiderMonkey, Safari and Opera you can access the characters | 5276 // In Firefox/SpiderMonkey, Safari and Opera you can access the characters |
5277 // of a string using [] notation. We need to support this too in | 5277 // of a string using [] notation. We need to support this too in |
5278 // JavaScript. | 5278 // JavaScript. |
5279 // In the case of a String object we just need to redirect the assignment to | 5279 // In the case of a String object we just need to redirect the assignment to |
5280 // the underlying string if the index is in range. Since the underlying | 5280 // the underlying string if the index is in range. Since the underlying |
5281 // string does nothing with the assignment then we can ignore such | 5281 // string does nothing with the assignment then we can ignore such |
5282 // assignments. | 5282 // assignments. |
5283 if (js_object->IsStringObjectWithCharacterAt(index)) { | 5283 if (js_object->IsStringObjectWithCharacterAt(index)) { |
5284 return value; | 5284 return value; |
5285 } | 5285 } |
5286 | 5286 |
5287 JSObject::ValidateElements(js_object); | 5287 JSObject::ValidateElements(js_object); |
5288 if (js_object->HasExternalArrayElements() || | 5288 if (js_object->HasExternalArrayElements() || |
5289 js_object->HasFixedTypedArrayElements()) { | 5289 js_object->HasFixedTypedArrayElements()) { |
5290 if (!value->IsNumber() && !value->IsUndefined()) { | 5290 if (!value->IsNumber() && !value->IsUndefined()) { |
5291 bool has_exception; | 5291 ASSIGN_RETURN_ON_EXCEPTION( |
5292 Handle<Object> number = | 5292 isolate, value, Execution::ToNumber(isolate, value), Object); |
5293 Execution::ToNumber(isolate, value, &has_exception); | |
5294 if (has_exception) return MaybeHandle<Object>(); // exception | |
5295 value = number; | |
5296 } | 5293 } |
5297 } | 5294 } |
5298 | 5295 |
5299 MaybeHandle<Object> result = JSObject::SetElement( | 5296 MaybeHandle<Object> result = JSObject::SetElement( |
5300 js_object, index, value, attr, strict_mode, true, set_mode); | 5297 js_object, index, value, attr, strict_mode, true, set_mode); |
5301 JSObject::ValidateElements(js_object); | 5298 JSObject::ValidateElements(js_object); |
5302 | 5299 |
5303 return result.is_null() ? result : value; | 5300 return result.is_null() ? result : value; |
5304 } | 5301 } |
5305 | 5302 |
5306 if (key->IsName()) { | 5303 if (key->IsName()) { |
5307 Handle<Name> name = Handle<Name>::cast(key); | 5304 Handle<Name> name = Handle<Name>::cast(key); |
5308 if (name->AsArrayIndex(&index)) { | 5305 if (name->AsArrayIndex(&index)) { |
5309 if (js_object->HasExternalArrayElements()) { | 5306 if (js_object->HasExternalArrayElements()) { |
5310 if (!value->IsNumber() && !value->IsUndefined()) { | 5307 if (!value->IsNumber() && !value->IsUndefined()) { |
5311 bool has_exception; | 5308 ASSIGN_RETURN_ON_EXCEPTION( |
5312 Handle<Object> number = | 5309 isolate, value, Execution::ToNumber(isolate, value), Object); |
5313 Execution::ToNumber(isolate, value, &has_exception); | |
5314 if (has_exception) return MaybeHandle<Object>(); // exception | |
5315 value = number; | |
5316 } | 5310 } |
5317 } | 5311 } |
5318 return JSObject::SetElement(js_object, index, value, attr, | 5312 return JSObject::SetElement(js_object, index, value, attr, |
5319 strict_mode, true, set_mode); | 5313 strict_mode, true, set_mode); |
5320 } else { | 5314 } else { |
5321 if (name->IsString()) name = String::Flatten(Handle<String>::cast(name)); | 5315 if (name->IsString()) name = String::Flatten(Handle<String>::cast(name)); |
5322 return JSReceiver::SetProperty(js_object, name, value, attr, strict_mode); | 5316 return JSReceiver::SetProperty(js_object, name, value, attr, strict_mode); |
5323 } | 5317 } |
5324 } | 5318 } |
5325 | 5319 |
5326 // Call-back into JavaScript to convert the key to a string. | 5320 // Call-back into JavaScript to convert the key to a string. |
5327 bool has_pending_exception = false; | 5321 Handle<Object> converted; |
5328 Handle<Object> converted = | 5322 ASSIGN_RETURN_ON_EXCEPTION( |
5329 Execution::ToString(isolate, key, &has_pending_exception); | 5323 isolate, converted, Execution::ToString(isolate, key), Object); |
5330 if (has_pending_exception) return MaybeHandle<Object>(); // exception | |
5331 Handle<String> name = Handle<String>::cast(converted); | 5324 Handle<String> name = Handle<String>::cast(converted); |
5332 | 5325 |
5333 if (name->AsArrayIndex(&index)) { | 5326 if (name->AsArrayIndex(&index)) { |
5334 return JSObject::SetElement(js_object, index, value, attr, | 5327 return JSObject::SetElement(js_object, index, value, attr, |
5335 strict_mode, true, set_mode); | 5328 strict_mode, true, set_mode); |
5336 } else { | 5329 } else { |
5337 return JSReceiver::SetProperty(js_object, name, value, attr, strict_mode); | 5330 return JSReceiver::SetProperty(js_object, name, value, attr, strict_mode); |
5338 } | 5331 } |
5339 } | 5332 } |
5340 | 5333 |
(...skipping 27 matching lines...) Expand all Loading... |
5368 return JSObject::SetElement(js_object, index, value, attr, | 5361 return JSObject::SetElement(js_object, index, value, attr, |
5369 SLOPPY, false, DEFINE_PROPERTY); | 5362 SLOPPY, false, DEFINE_PROPERTY); |
5370 } else { | 5363 } else { |
5371 if (name->IsString()) name = String::Flatten(Handle<String>::cast(name)); | 5364 if (name->IsString()) name = String::Flatten(Handle<String>::cast(name)); |
5372 return JSObject::SetLocalPropertyIgnoreAttributes( | 5365 return JSObject::SetLocalPropertyIgnoreAttributes( |
5373 js_object, name, value, attr); | 5366 js_object, name, value, attr); |
5374 } | 5367 } |
5375 } | 5368 } |
5376 | 5369 |
5377 // Call-back into JavaScript to convert the key to a string. | 5370 // Call-back into JavaScript to convert the key to a string. |
5378 bool has_pending_exception = false; | 5371 Handle<Object> converted; |
5379 Handle<Object> converted = | 5372 ASSIGN_RETURN_ON_EXCEPTION( |
5380 Execution::ToString(isolate, key, &has_pending_exception); | 5373 isolate, converted, Execution::ToString(isolate, key), Object); |
5381 if (has_pending_exception) return MaybeHandle<Object>(); // exception | |
5382 Handle<String> name = Handle<String>::cast(converted); | 5374 Handle<String> name = Handle<String>::cast(converted); |
5383 | 5375 |
5384 if (name->AsArrayIndex(&index)) { | 5376 if (name->AsArrayIndex(&index)) { |
5385 return JSObject::SetElement(js_object, index, value, attr, | 5377 return JSObject::SetElement(js_object, index, value, attr, |
5386 SLOPPY, false, DEFINE_PROPERTY); | 5378 SLOPPY, false, DEFINE_PROPERTY); |
5387 } else { | 5379 } else { |
5388 return JSObject::SetLocalPropertyIgnoreAttributes(js_object, name, value, | 5380 return JSObject::SetLocalPropertyIgnoreAttributes(js_object, name, value, |
5389 attr); | 5381 attr); |
5390 } | 5382 } |
5391 } | 5383 } |
(...skipping 17 matching lines...) Expand all Loading... |
5409 } | 5401 } |
5410 | 5402 |
5411 return JSReceiver::DeleteElement(receiver, index, mode); | 5403 return JSReceiver::DeleteElement(receiver, index, mode); |
5412 } | 5404 } |
5413 | 5405 |
5414 Handle<Name> name; | 5406 Handle<Name> name; |
5415 if (key->IsName()) { | 5407 if (key->IsName()) { |
5416 name = Handle<Name>::cast(key); | 5408 name = Handle<Name>::cast(key); |
5417 } else { | 5409 } else { |
5418 // Call-back into JavaScript to convert the key to a string. | 5410 // Call-back into JavaScript to convert the key to a string. |
5419 bool has_pending_exception = false; | 5411 Handle<Object> converted; |
5420 Handle<Object> converted = Execution::ToString( | 5412 ASSIGN_RETURN_ON_EXCEPTION( |
5421 isolate, key, &has_pending_exception); | 5413 isolate, converted, Execution::ToString(isolate, key), Object); |
5422 if (has_pending_exception) return MaybeHandle<Object>(); | |
5423 name = Handle<String>::cast(converted); | 5414 name = Handle<String>::cast(converted); |
5424 } | 5415 } |
5425 | 5416 |
5426 if (name->IsString()) name = String::Flatten(Handle<String>::cast(name)); | 5417 if (name->IsString()) name = String::Flatten(Handle<String>::cast(name)); |
5427 return JSReceiver::DeleteProperty(receiver, name, mode); | 5418 return JSReceiver::DeleteProperty(receiver, name, mode); |
5428 } | 5419 } |
5429 | 5420 |
5430 | 5421 |
5431 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetHiddenProperty) { | 5422 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetHiddenProperty) { |
5432 HandleScope scope(isolate); | 5423 HandleScope scope(isolate); |
(...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5751 ASSERT(!isolate->has_scheduled_exception()); | 5742 ASSERT(!isolate->has_scheduled_exception()); |
5752 return isolate->heap()->true_value(); | 5743 return isolate->heap()->true_value(); |
5753 } | 5744 } |
5754 | 5745 |
5755 | 5746 |
5756 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetPropertyNames) { | 5747 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetPropertyNames) { |
5757 HandleScope scope(isolate); | 5748 HandleScope scope(isolate); |
5758 ASSERT(args.length() == 1); | 5749 ASSERT(args.length() == 1); |
5759 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, object, 0); | 5750 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, object, 0); |
5760 Handle<JSArray> result; | 5751 Handle<JSArray> result; |
5761 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, GetKeysFor(object)); | 5752 |
5762 return *result; | 5753 isolate->counters()->for_in()->Increment(); |
| 5754 Handle<FixedArray> elements; |
| 5755 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| 5756 isolate, elements, GetKeysInFixedArrayFor(object, INCLUDE_PROTOS)); |
| 5757 return *isolate->factory()->NewJSArrayWithElements(elements); |
5763 } | 5758 } |
5764 | 5759 |
5765 | 5760 |
5766 // Returns either a FixedArray as Runtime_GetPropertyNames, | 5761 // Returns either a FixedArray as Runtime_GetPropertyNames, |
5767 // or, if the given object has an enum cache that contains | 5762 // or, if the given object has an enum cache that contains |
5768 // all enumerable properties of the object and its prototypes | 5763 // all enumerable properties of the object and its prototypes |
5769 // have none, the map of the object. This is used to speed up | 5764 // have none, the map of the object. This is used to speed up |
5770 // the check for deletions during a for-in. | 5765 // the check for deletions during a for-in. |
5771 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetPropertyNamesFast) { | 5766 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetPropertyNamesFast) { |
5772 SealHandleScope shs(isolate); | 5767 SealHandleScope shs(isolate); |
(...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6057 HandleScope scope(isolate); | 6052 HandleScope scope(isolate); |
6058 if (args[0]->IsSymbol()) { | 6053 if (args[0]->IsSymbol()) { |
6059 // Lookup in the initial Object.prototype object. | 6054 // Lookup in the initial Object.prototype object. |
6060 Handle<Object> result = Object::GetProperty( | 6055 Handle<Object> result = Object::GetProperty( |
6061 isolate->initial_object_prototype(), args.at<Symbol>(0)); | 6056 isolate->initial_object_prototype(), args.at<Symbol>(0)); |
6062 RETURN_IF_EMPTY_HANDLE(isolate, result); | 6057 RETURN_IF_EMPTY_HANDLE(isolate, result); |
6063 return *result; | 6058 return *result; |
6064 } | 6059 } |
6065 | 6060 |
6066 // Convert the key to a string. | 6061 // Convert the key to a string. |
6067 bool exception = false; | 6062 Handle<Object> converted; |
6068 Handle<Object> converted = | 6063 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
6069 Execution::ToString(isolate, args.at<Object>(0), &exception); | 6064 isolate, converted, Execution::ToString(isolate, args.at<Object>(0))); |
6070 if (exception) return Failure::Exception(); | |
6071 Handle<String> key = Handle<String>::cast(converted); | 6065 Handle<String> key = Handle<String>::cast(converted); |
6072 | 6066 |
6073 // Try to convert the string key into an array index. | 6067 // Try to convert the string key into an array index. |
6074 if (key->AsArrayIndex(&index)) { | 6068 if (key->AsArrayIndex(&index)) { |
6075 if (index < n) { | 6069 if (index < n) { |
6076 return frame->GetParameter(index); | 6070 return frame->GetParameter(index); |
6077 } else { | 6071 } else { |
6078 Handle<Object> initial_prototype(isolate->initial_object_prototype()); | 6072 Handle<Object> initial_prototype(isolate->initial_object_prototype()); |
6079 Handle<Object> result; | 6073 Handle<Object> result; |
6080 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 6074 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
(...skipping 2192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8273 | 8267 |
8274 int total_argc = 0; | 8268 int total_argc = 0; |
8275 SmartArrayPointer<Handle<Object> > param_data = | 8269 SmartArrayPointer<Handle<Object> > param_data = |
8276 GetCallerArguments(isolate, bound_argc, &total_argc); | 8270 GetCallerArguments(isolate, bound_argc, &total_argc); |
8277 for (int i = 0; i < bound_argc; i++) { | 8271 for (int i = 0; i < bound_argc; i++) { |
8278 param_data[i] = Handle<Object>(bound_args->get( | 8272 param_data[i] = Handle<Object>(bound_args->get( |
8279 JSFunction::kBoundArgumentsStartIndex + i), isolate); | 8273 JSFunction::kBoundArgumentsStartIndex + i), isolate); |
8280 } | 8274 } |
8281 | 8275 |
8282 if (!bound_function->IsJSFunction()) { | 8276 if (!bound_function->IsJSFunction()) { |
8283 bool exception_thrown; | 8277 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
8284 bound_function = Execution::TryGetConstructorDelegate(isolate, | 8278 isolate, bound_function, |
8285 bound_function, | 8279 Execution::TryGetConstructorDelegate(isolate, bound_function)); |
8286 &exception_thrown); | |
8287 if (exception_thrown) return Failure::Exception(); | |
8288 } | 8280 } |
8289 ASSERT(bound_function->IsJSFunction()); | 8281 ASSERT(bound_function->IsJSFunction()); |
8290 | 8282 |
8291 bool exception = false; | 8283 Handle<Object> result; |
8292 Handle<Object> result = | 8284 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| 8285 isolate, result, |
8293 Execution::New(Handle<JSFunction>::cast(bound_function), | 8286 Execution::New(Handle<JSFunction>::cast(bound_function), |
8294 total_argc, param_data.get(), &exception); | 8287 total_argc, param_data.get())); |
8295 if (exception) { | |
8296 return Failure::Exception(); | |
8297 } | |
8298 ASSERT(!result.is_null()); | |
8299 return *result; | 8288 return *result; |
8300 } | 8289 } |
8301 | 8290 |
8302 | 8291 |
8303 static MaybeObject* Runtime_NewObjectHelper(Isolate* isolate, | 8292 static MaybeObject* Runtime_NewObjectHelper(Isolate* isolate, |
8304 Handle<Object> constructor, | 8293 Handle<Object> constructor, |
8305 Handle<AllocationSite> site) { | 8294 Handle<AllocationSite> site) { |
8306 // If the constructor isn't a proper function we throw a type error. | 8295 // If the constructor isn't a proper function we throw a type error. |
8307 if (!constructor->IsJSFunction()) { | 8296 if (!constructor->IsJSFunction()) { |
8308 Vector< Handle<Object> > arguments = HandleVector(&constructor, 1); | 8297 Vector< Handle<Object> > arguments = HandleVector(&constructor, 1); |
(...skipping 589 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8898 argv_large_buffer = SmartArrayPointer<Handle<Object> >(argv); | 8887 argv_large_buffer = SmartArrayPointer<Handle<Object> >(argv); |
8899 } | 8888 } |
8900 | 8889 |
8901 for (int i = 0; i < argc; ++i) { | 8890 for (int i = 0; i < argc; ++i) { |
8902 MaybeObject* maybe = args[1 + i]; | 8891 MaybeObject* maybe = args[1 + i]; |
8903 Object* object; | 8892 Object* object; |
8904 if (!maybe->To<Object>(&object)) return maybe; | 8893 if (!maybe->To<Object>(&object)) return maybe; |
8905 argv[i] = Handle<Object>(object, isolate); | 8894 argv[i] = Handle<Object>(object, isolate); |
8906 } | 8895 } |
8907 | 8896 |
8908 bool threw; | |
8909 Handle<JSReceiver> hfun(fun); | 8897 Handle<JSReceiver> hfun(fun); |
8910 Handle<Object> hreceiver(receiver, isolate); | 8898 Handle<Object> hreceiver(receiver, isolate); |
8911 Handle<Object> result = Execution::Call( | 8899 Handle<Object> result; |
8912 isolate, hfun, hreceiver, argc, argv, &threw, true); | 8900 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
8913 | 8901 isolate, result, |
8914 if (threw) return Failure::Exception(); | 8902 Execution::Call(isolate, hfun, hreceiver, argc, argv, true)); |
8915 return *result; | 8903 return *result; |
8916 } | 8904 } |
8917 | 8905 |
8918 | 8906 |
8919 RUNTIME_FUNCTION(MaybeObject*, Runtime_Apply) { | 8907 RUNTIME_FUNCTION(MaybeObject*, Runtime_Apply) { |
8920 HandleScope scope(isolate); | 8908 HandleScope scope(isolate); |
8921 ASSERT(args.length() == 5); | 8909 ASSERT(args.length() == 5); |
8922 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, fun, 0); | 8910 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, fun, 0); |
8923 Handle<Object> receiver = args.at<Object>(1); | 8911 Handle<Object> receiver = args.at<Object>(1); |
8924 CONVERT_ARG_HANDLE_CHECKED(JSObject, arguments, 2); | 8912 CONVERT_ARG_HANDLE_CHECKED(JSObject, arguments, 2); |
(...skipping 12 matching lines...) Expand all Loading... |
8937 if (argv == NULL) return isolate->StackOverflow(); | 8925 if (argv == NULL) return isolate->StackOverflow(); |
8938 argv_large_buffer = SmartArrayPointer<Handle<Object> >(argv); | 8926 argv_large_buffer = SmartArrayPointer<Handle<Object> >(argv); |
8939 } | 8927 } |
8940 | 8928 |
8941 for (int i = 0; i < argc; ++i) { | 8929 for (int i = 0; i < argc; ++i) { |
8942 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 8930 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
8943 isolate, argv[i], | 8931 isolate, argv[i], |
8944 Object::GetElement(isolate, arguments, offset + i)); | 8932 Object::GetElement(isolate, arguments, offset + i)); |
8945 } | 8933 } |
8946 | 8934 |
8947 bool threw; | 8935 Handle<Object> result; |
8948 Handle<Object> result = Execution::Call( | 8936 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
8949 isolate, fun, receiver, argc, argv, &threw, true); | 8937 isolate, result, |
8950 | 8938 Execution::Call(isolate, fun, receiver, argc, argv, true)); |
8951 if (threw) return Failure::Exception(); | |
8952 return *result; | 8939 return *result; |
8953 } | 8940 } |
8954 | 8941 |
8955 | 8942 |
8956 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetFunctionDelegate) { | 8943 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetFunctionDelegate) { |
8957 HandleScope scope(isolate); | 8944 HandleScope scope(isolate); |
8958 ASSERT(args.length() == 1); | 8945 ASSERT(args.length() == 1); |
8959 RUNTIME_ASSERT(!args[0]->IsJSFunction()); | 8946 RUNTIME_ASSERT(!args[0]->IsJSFunction()); |
8960 return *Execution::GetFunctionDelegate(isolate, args.at<Object>(0)); | 8947 return *Execution::GetFunctionDelegate(isolate, args.at<Object>(0)); |
8961 } | 8948 } |
(...skipping 3921 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12883 } | 12870 } |
12884 | 12871 |
12885 Handle<JSFunction> eval_fun = | 12872 Handle<JSFunction> eval_fun = |
12886 Compiler::GetFunctionFromEval(source, | 12873 Compiler::GetFunctionFromEval(source, |
12887 context, | 12874 context, |
12888 SLOPPY, | 12875 SLOPPY, |
12889 NO_PARSE_RESTRICTION, | 12876 NO_PARSE_RESTRICTION, |
12890 RelocInfo::kNoPosition); | 12877 RelocInfo::kNoPosition); |
12891 RETURN_IF_EMPTY_HANDLE(isolate, eval_fun); | 12878 RETURN_IF_EMPTY_HANDLE(isolate, eval_fun); |
12892 | 12879 |
12893 bool pending_exception; | 12880 Handle<Object> result; |
12894 Handle<Object> result = Execution::Call( | 12881 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
12895 isolate, eval_fun, receiver, 0, NULL, &pending_exception); | 12882 isolate, result, |
12896 | 12883 Execution::Call(isolate, eval_fun, receiver, 0, NULL)); |
12897 if (pending_exception) return Failure::Exception(); | |
12898 | 12884 |
12899 // Skip the global proxy as it has no properties and always delegates to the | 12885 // Skip the global proxy as it has no properties and always delegates to the |
12900 // real global object. | 12886 // real global object. |
12901 if (result->IsJSGlobalProxy()) { | 12887 if (result->IsJSGlobalProxy()) { |
12902 result = Handle<JSObject>(JSObject::cast(result->GetPrototype(isolate))); | 12888 result = Handle<JSObject>(JSObject::cast(result->GetPrototype(isolate))); |
12903 } | 12889 } |
12904 | 12890 |
12905 // Clear the oneshot breakpoints so that the debugger does not step further. | 12891 // Clear the oneshot breakpoints so that the debugger does not step further. |
12906 isolate->debug()->ClearStepping(); | 12892 isolate->debug()->ClearStepping(); |
12907 return *result; | 12893 return *result; |
(...skipping 739 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13647 | 13633 |
13648 // Calls specified function with or without entering the debugger. | 13634 // Calls specified function with or without entering the debugger. |
13649 // This is used in unit tests to run code as if debugger is entered or simply | 13635 // This is used in unit tests to run code as if debugger is entered or simply |
13650 // to have a stack with C++ frame in the middle. | 13636 // to have a stack with C++ frame in the middle. |
13651 RUNTIME_FUNCTION(MaybeObject*, Runtime_ExecuteInDebugContext) { | 13637 RUNTIME_FUNCTION(MaybeObject*, Runtime_ExecuteInDebugContext) { |
13652 HandleScope scope(isolate); | 13638 HandleScope scope(isolate); |
13653 ASSERT(args.length() == 2); | 13639 ASSERT(args.length() == 2); |
13654 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); | 13640 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); |
13655 CONVERT_BOOLEAN_ARG_CHECKED(without_debugger, 1); | 13641 CONVERT_BOOLEAN_ARG_CHECKED(without_debugger, 1); |
13656 | 13642 |
| 13643 MaybeHandle<Object> maybe_result; |
| 13644 if (without_debugger) { |
| 13645 maybe_result = Execution::Call(isolate, |
| 13646 function, |
| 13647 isolate->global_object(), |
| 13648 0, |
| 13649 NULL); |
| 13650 } else { |
| 13651 EnterDebugger enter_debugger(isolate); |
| 13652 maybe_result = Execution::Call(isolate, |
| 13653 function, |
| 13654 isolate->global_object(), |
| 13655 0, |
| 13656 NULL); |
| 13657 } |
13657 Handle<Object> result; | 13658 Handle<Object> result; |
13658 bool pending_exception; | 13659 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, maybe_result); |
13659 { | 13660 return *result; |
13660 if (without_debugger) { | |
13661 result = Execution::Call(isolate, | |
13662 function, | |
13663 isolate->global_object(), | |
13664 0, | |
13665 NULL, | |
13666 &pending_exception); | |
13667 } else { | |
13668 EnterDebugger enter_debugger(isolate); | |
13669 result = Execution::Call(isolate, | |
13670 function, | |
13671 isolate->global_object(), | |
13672 0, | |
13673 NULL, | |
13674 &pending_exception); | |
13675 } | |
13676 } | |
13677 if (!pending_exception) { | |
13678 return *result; | |
13679 } else { | |
13680 return Failure::Exception(); | |
13681 } | |
13682 } | 13661 } |
13683 | 13662 |
13684 | 13663 |
13685 // Sets a v8 flag. | 13664 // Sets a v8 flag. |
13686 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetFlags) { | 13665 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetFlags) { |
13687 SealHandleScope shs(isolate); | 13666 SealHandleScope shs(isolate); |
13688 CONVERT_ARG_CHECKED(String, arg, 0); | 13667 CONVERT_ARG_CHECKED(String, arg, 0); |
13689 SmartArrayPointer<char> flags = | 13668 SmartArrayPointer<char> flags = |
13690 arg->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL); | 13669 arg->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL); |
13691 FlagList::SetFlagsFromString(flags.get(), StrLength(flags.get())); | 13670 FlagList::SetFlagsFromString(flags.get(), StrLength(flags.get())); |
(...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13996 ASSERT(args.length() == 3); | 13975 ASSERT(args.length() == 3); |
13997 | 13976 |
13998 CONVERT_ARG_HANDLE_CHECKED(String, locale, 0); | 13977 CONVERT_ARG_HANDLE_CHECKED(String, locale, 0); |
13999 CONVERT_ARG_HANDLE_CHECKED(JSObject, options, 1); | 13978 CONVERT_ARG_HANDLE_CHECKED(JSObject, options, 1); |
14000 CONVERT_ARG_HANDLE_CHECKED(JSObject, resolved, 2); | 13979 CONVERT_ARG_HANDLE_CHECKED(JSObject, resolved, 2); |
14001 | 13980 |
14002 Handle<ObjectTemplateInfo> date_format_template = | 13981 Handle<ObjectTemplateInfo> date_format_template = |
14003 I18N::GetTemplate(isolate); | 13982 I18N::GetTemplate(isolate); |
14004 | 13983 |
14005 // Create an empty object wrapper. | 13984 // Create an empty object wrapper. |
14006 bool has_pending_exception = false; | 13985 Handle<JSObject> local_object; |
14007 Handle<JSObject> local_object = Execution::InstantiateObject( | 13986 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
14008 date_format_template, &has_pending_exception); | 13987 isolate, local_object, |
14009 if (has_pending_exception) { | 13988 Execution::InstantiateObject(date_format_template)); |
14010 ASSERT(isolate->has_pending_exception()); | |
14011 return Failure::Exception(); | |
14012 } | |
14013 | 13989 |
14014 // Set date time formatter as internal field of the resulting JS object. | 13990 // Set date time formatter as internal field of the resulting JS object. |
14015 icu::SimpleDateFormat* date_format = DateFormat::InitializeDateTimeFormat( | 13991 icu::SimpleDateFormat* date_format = DateFormat::InitializeDateTimeFormat( |
14016 isolate, locale, options, resolved); | 13992 isolate, locale, options, resolved); |
14017 | 13993 |
14018 if (!date_format) return isolate->ThrowIllegalOperation(); | 13994 if (!date_format) return isolate->ThrowIllegalOperation(); |
14019 | 13995 |
14020 local_object->SetInternalField(0, reinterpret_cast<Smi*>(date_format)); | 13996 local_object->SetInternalField(0, reinterpret_cast<Smi*>(date_format)); |
14021 | 13997 |
14022 RETURN_IF_EMPTY_HANDLE(isolate, | 13998 RETURN_IF_EMPTY_HANDLE(isolate, |
(...skipping 13 matching lines...) Expand all Loading... |
14036 | 14012 |
14037 | 14013 |
14038 RUNTIME_FUNCTION(MaybeObject*, Runtime_InternalDateFormat) { | 14014 RUNTIME_FUNCTION(MaybeObject*, Runtime_InternalDateFormat) { |
14039 HandleScope scope(isolate); | 14015 HandleScope scope(isolate); |
14040 | 14016 |
14041 ASSERT(args.length() == 2); | 14017 ASSERT(args.length() == 2); |
14042 | 14018 |
14043 CONVERT_ARG_HANDLE_CHECKED(JSObject, date_format_holder, 0); | 14019 CONVERT_ARG_HANDLE_CHECKED(JSObject, date_format_holder, 0); |
14044 CONVERT_ARG_HANDLE_CHECKED(JSDate, date, 1); | 14020 CONVERT_ARG_HANDLE_CHECKED(JSDate, date, 1); |
14045 | 14021 |
14046 bool has_pending_exception = false; | 14022 Handle<Object> value; |
14047 Handle<Object> value = | 14023 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
14048 Execution::ToNumber(isolate, date, &has_pending_exception); | 14024 isolate, value, Execution::ToNumber(isolate, date)); |
14049 if (has_pending_exception) { | |
14050 ASSERT(isolate->has_pending_exception()); | |
14051 return Failure::Exception(); | |
14052 } | |
14053 | 14025 |
14054 icu::SimpleDateFormat* date_format = | 14026 icu::SimpleDateFormat* date_format = |
14055 DateFormat::UnpackDateFormat(isolate, date_format_holder); | 14027 DateFormat::UnpackDateFormat(isolate, date_format_holder); |
14056 if (!date_format) return isolate->ThrowIllegalOperation(); | 14028 if (!date_format) return isolate->ThrowIllegalOperation(); |
14057 | 14029 |
14058 icu::UnicodeString result; | 14030 icu::UnicodeString result; |
14059 date_format->format(value->Number(), result); | 14031 date_format->format(value->Number(), result); |
14060 | 14032 |
14061 return *isolate->factory()->NewStringFromTwoByte( | 14033 return *isolate->factory()->NewStringFromTwoByte( |
14062 Vector<const uint16_t>( | 14034 Vector<const uint16_t>( |
(...skipping 13 matching lines...) Expand all Loading... |
14076 v8::String::Utf8Value utf8_date(v8::Utils::ToLocal(date_string)); | 14048 v8::String::Utf8Value utf8_date(v8::Utils::ToLocal(date_string)); |
14077 icu::UnicodeString u_date(icu::UnicodeString::fromUTF8(*utf8_date)); | 14049 icu::UnicodeString u_date(icu::UnicodeString::fromUTF8(*utf8_date)); |
14078 icu::SimpleDateFormat* date_format = | 14050 icu::SimpleDateFormat* date_format = |
14079 DateFormat::UnpackDateFormat(isolate, date_format_holder); | 14051 DateFormat::UnpackDateFormat(isolate, date_format_holder); |
14080 if (!date_format) return isolate->ThrowIllegalOperation(); | 14052 if (!date_format) return isolate->ThrowIllegalOperation(); |
14081 | 14053 |
14082 UErrorCode status = U_ZERO_ERROR; | 14054 UErrorCode status = U_ZERO_ERROR; |
14083 UDate date = date_format->parse(u_date, status); | 14055 UDate date = date_format->parse(u_date, status); |
14084 if (U_FAILURE(status)) return isolate->heap()->undefined_value(); | 14056 if (U_FAILURE(status)) return isolate->heap()->undefined_value(); |
14085 | 14057 |
14086 bool has_pending_exception = false; | 14058 Handle<Object> result; |
14087 Handle<JSDate> result = Handle<JSDate>::cast( | 14059 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
14088 Execution::NewDate( | 14060 isolate, result, |
14089 isolate, static_cast<double>(date), &has_pending_exception)); | 14061 Execution::NewDate(isolate, static_cast<double>(date))); |
14090 if (has_pending_exception) { | 14062 ASSERT(result->IsJSDate()); |
14091 ASSERT(isolate->has_pending_exception()); | |
14092 return Failure::Exception(); | |
14093 } | |
14094 return *result; | 14063 return *result; |
14095 } | 14064 } |
14096 | 14065 |
14097 | 14066 |
14098 RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateNumberFormat) { | 14067 RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateNumberFormat) { |
14099 HandleScope scope(isolate); | 14068 HandleScope scope(isolate); |
14100 | 14069 |
14101 ASSERT(args.length() == 3); | 14070 ASSERT(args.length() == 3); |
14102 | 14071 |
14103 CONVERT_ARG_HANDLE_CHECKED(String, locale, 0); | 14072 CONVERT_ARG_HANDLE_CHECKED(String, locale, 0); |
14104 CONVERT_ARG_HANDLE_CHECKED(JSObject, options, 1); | 14073 CONVERT_ARG_HANDLE_CHECKED(JSObject, options, 1); |
14105 CONVERT_ARG_HANDLE_CHECKED(JSObject, resolved, 2); | 14074 CONVERT_ARG_HANDLE_CHECKED(JSObject, resolved, 2); |
14106 | 14075 |
14107 Handle<ObjectTemplateInfo> number_format_template = | 14076 Handle<ObjectTemplateInfo> number_format_template = |
14108 I18N::GetTemplate(isolate); | 14077 I18N::GetTemplate(isolate); |
14109 | 14078 |
14110 // Create an empty object wrapper. | 14079 // Create an empty object wrapper. |
14111 bool has_pending_exception = false; | 14080 Handle<JSObject> local_object; |
14112 Handle<JSObject> local_object = Execution::InstantiateObject( | 14081 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
14113 number_format_template, &has_pending_exception); | 14082 isolate, local_object, |
14114 if (has_pending_exception) { | 14083 Execution::InstantiateObject(number_format_template)); |
14115 ASSERT(isolate->has_pending_exception()); | |
14116 return Failure::Exception(); | |
14117 } | |
14118 | 14084 |
14119 // Set number formatter as internal field of the resulting JS object. | 14085 // Set number formatter as internal field of the resulting JS object. |
14120 icu::DecimalFormat* number_format = NumberFormat::InitializeNumberFormat( | 14086 icu::DecimalFormat* number_format = NumberFormat::InitializeNumberFormat( |
14121 isolate, locale, options, resolved); | 14087 isolate, locale, options, resolved); |
14122 | 14088 |
14123 if (!number_format) return isolate->ThrowIllegalOperation(); | 14089 if (!number_format) return isolate->ThrowIllegalOperation(); |
14124 | 14090 |
14125 local_object->SetInternalField(0, reinterpret_cast<Smi*>(number_format)); | 14091 local_object->SetInternalField(0, reinterpret_cast<Smi*>(number_format)); |
14126 | 14092 |
14127 RETURN_IF_EMPTY_HANDLE(isolate, | 14093 RETURN_IF_EMPTY_HANDLE(isolate, |
(...skipping 12 matching lines...) Expand all Loading... |
14140 | 14106 |
14141 | 14107 |
14142 RUNTIME_FUNCTION(MaybeObject*, Runtime_InternalNumberFormat) { | 14108 RUNTIME_FUNCTION(MaybeObject*, Runtime_InternalNumberFormat) { |
14143 HandleScope scope(isolate); | 14109 HandleScope scope(isolate); |
14144 | 14110 |
14145 ASSERT(args.length() == 2); | 14111 ASSERT(args.length() == 2); |
14146 | 14112 |
14147 CONVERT_ARG_HANDLE_CHECKED(JSObject, number_format_holder, 0); | 14113 CONVERT_ARG_HANDLE_CHECKED(JSObject, number_format_holder, 0); |
14148 CONVERT_ARG_HANDLE_CHECKED(Object, number, 1); | 14114 CONVERT_ARG_HANDLE_CHECKED(Object, number, 1); |
14149 | 14115 |
14150 bool has_pending_exception = false; | 14116 Handle<Object> value; |
14151 Handle<Object> value = Execution::ToNumber( | 14117 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
14152 isolate, number, &has_pending_exception); | 14118 isolate, value, Execution::ToNumber(isolate, number)); |
14153 if (has_pending_exception) { | |
14154 ASSERT(isolate->has_pending_exception()); | |
14155 return Failure::Exception(); | |
14156 } | |
14157 | 14119 |
14158 icu::DecimalFormat* number_format = | 14120 icu::DecimalFormat* number_format = |
14159 NumberFormat::UnpackNumberFormat(isolate, number_format_holder); | 14121 NumberFormat::UnpackNumberFormat(isolate, number_format_holder); |
14160 if (!number_format) return isolate->ThrowIllegalOperation(); | 14122 if (!number_format) return isolate->ThrowIllegalOperation(); |
14161 | 14123 |
14162 icu::UnicodeString result; | 14124 icu::UnicodeString result; |
14163 number_format->format(value->Number(), result); | 14125 number_format->format(value->Number(), result); |
14164 | 14126 |
14165 return *isolate->factory()->NewStringFromTwoByte( | 14127 return *isolate->factory()->NewStringFromTwoByte( |
14166 Vector<const uint16_t>( | 14128 Vector<const uint16_t>( |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14213 | 14175 |
14214 ASSERT(args.length() == 3); | 14176 ASSERT(args.length() == 3); |
14215 | 14177 |
14216 CONVERT_ARG_HANDLE_CHECKED(String, locale, 0); | 14178 CONVERT_ARG_HANDLE_CHECKED(String, locale, 0); |
14217 CONVERT_ARG_HANDLE_CHECKED(JSObject, options, 1); | 14179 CONVERT_ARG_HANDLE_CHECKED(JSObject, options, 1); |
14218 CONVERT_ARG_HANDLE_CHECKED(JSObject, resolved, 2); | 14180 CONVERT_ARG_HANDLE_CHECKED(JSObject, resolved, 2); |
14219 | 14181 |
14220 Handle<ObjectTemplateInfo> collator_template = I18N::GetTemplate(isolate); | 14182 Handle<ObjectTemplateInfo> collator_template = I18N::GetTemplate(isolate); |
14221 | 14183 |
14222 // Create an empty object wrapper. | 14184 // Create an empty object wrapper. |
14223 bool has_pending_exception = false; | 14185 Handle<JSObject> local_object; |
14224 Handle<JSObject> local_object = Execution::InstantiateObject( | 14186 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
14225 collator_template, &has_pending_exception); | 14187 isolate, local_object, Execution::InstantiateObject(collator_template)); |
14226 if (has_pending_exception) { | |
14227 ASSERT(isolate->has_pending_exception()); | |
14228 return Failure::Exception(); | |
14229 } | |
14230 | 14188 |
14231 // Set collator as internal field of the resulting JS object. | 14189 // Set collator as internal field of the resulting JS object. |
14232 icu::Collator* collator = Collator::InitializeCollator( | 14190 icu::Collator* collator = Collator::InitializeCollator( |
14233 isolate, locale, options, resolved); | 14191 isolate, locale, options, resolved); |
14234 | 14192 |
14235 if (!collator) return isolate->ThrowIllegalOperation(); | 14193 if (!collator) return isolate->ThrowIllegalOperation(); |
14236 | 14194 |
14237 local_object->SetInternalField(0, reinterpret_cast<Smi*>(collator)); | 14195 local_object->SetInternalField(0, reinterpret_cast<Smi*>(collator)); |
14238 | 14196 |
14239 RETURN_IF_EMPTY_HANDLE(isolate, | 14197 RETURN_IF_EMPTY_HANDLE(isolate, |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14314 ASSERT(args.length() == 3); | 14272 ASSERT(args.length() == 3); |
14315 | 14273 |
14316 CONVERT_ARG_HANDLE_CHECKED(String, locale, 0); | 14274 CONVERT_ARG_HANDLE_CHECKED(String, locale, 0); |
14317 CONVERT_ARG_HANDLE_CHECKED(JSObject, options, 1); | 14275 CONVERT_ARG_HANDLE_CHECKED(JSObject, options, 1); |
14318 CONVERT_ARG_HANDLE_CHECKED(JSObject, resolved, 2); | 14276 CONVERT_ARG_HANDLE_CHECKED(JSObject, resolved, 2); |
14319 | 14277 |
14320 Handle<ObjectTemplateInfo> break_iterator_template = | 14278 Handle<ObjectTemplateInfo> break_iterator_template = |
14321 I18N::GetTemplate2(isolate); | 14279 I18N::GetTemplate2(isolate); |
14322 | 14280 |
14323 // Create an empty object wrapper. | 14281 // Create an empty object wrapper. |
14324 bool has_pending_exception = false; | 14282 Handle<JSObject> local_object; |
14325 Handle<JSObject> local_object = Execution::InstantiateObject( | 14283 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
14326 break_iterator_template, &has_pending_exception); | 14284 isolate, local_object, |
14327 if (has_pending_exception) { | 14285 Execution::InstantiateObject(break_iterator_template)); |
14328 ASSERT(isolate->has_pending_exception()); | |
14329 return Failure::Exception(); | |
14330 } | |
14331 | 14286 |
14332 // Set break iterator as internal field of the resulting JS object. | 14287 // Set break iterator as internal field of the resulting JS object. |
14333 icu::BreakIterator* break_iterator = BreakIterator::InitializeBreakIterator( | 14288 icu::BreakIterator* break_iterator = BreakIterator::InitializeBreakIterator( |
14334 isolate, locale, options, resolved); | 14289 isolate, locale, options, resolved); |
14335 | 14290 |
14336 if (!break_iterator) return isolate->ThrowIllegalOperation(); | 14291 if (!break_iterator) return isolate->ThrowIllegalOperation(); |
14337 | 14292 |
14338 local_object->SetInternalField(0, reinterpret_cast<Smi*>(break_iterator)); | 14293 local_object->SetInternalField(0, reinterpret_cast<Smi*>(break_iterator)); |
14339 // Make sure that the pointer to adopted text is NULL. | 14294 // Make sure that the pointer to adopted text is NULL. |
14340 local_object->SetInternalField(1, reinterpret_cast<Smi*>(NULL)); | 14295 local_object->SetInternalField(1, reinterpret_cast<Smi*>(NULL)); |
(...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14671 Handle<Object> key_handle(key, isolate); | 14626 Handle<Object> key_handle(key, isolate); |
14672 Handle<Object> value; | 14627 Handle<Object> value; |
14673 { | 14628 { |
14674 Handle<JSFunction> factory(JSFunction::cast( | 14629 Handle<JSFunction> factory(JSFunction::cast( |
14675 cache_handle->get(JSFunctionResultCache::kFactoryIndex))); | 14630 cache_handle->get(JSFunctionResultCache::kFactoryIndex))); |
14676 // TODO(antonm): consider passing a receiver when constructing a cache. | 14631 // TODO(antonm): consider passing a receiver when constructing a cache. |
14677 Handle<Object> receiver(isolate->native_context()->global_object(), | 14632 Handle<Object> receiver(isolate->native_context()->global_object(), |
14678 isolate); | 14633 isolate); |
14679 // This handle is nor shared, nor used later, so it's safe. | 14634 // This handle is nor shared, nor used later, so it's safe. |
14680 Handle<Object> argv[] = { key_handle }; | 14635 Handle<Object> argv[] = { key_handle }; |
14681 bool pending_exception; | 14636 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
14682 value = Execution::Call(isolate, | 14637 isolate, value, |
14683 factory, | 14638 Execution::Call(isolate, factory, receiver, ARRAY_SIZE(argv), argv)); |
14684 receiver, | |
14685 ARRAY_SIZE(argv), | |
14686 argv, | |
14687 &pending_exception); | |
14688 if (pending_exception) return Failure::Exception(); | |
14689 } | 14639 } |
14690 | 14640 |
14691 #ifdef VERIFY_HEAP | 14641 #ifdef VERIFY_HEAP |
14692 if (FLAG_verify_heap) { | 14642 if (FLAG_verify_heap) { |
14693 cache_handle->JSFunctionResultCacheVerify(); | 14643 cache_handle->JSFunctionResultCacheVerify(); |
14694 } | 14644 } |
14695 #endif | 14645 #endif |
14696 | 14646 |
14697 // Function invocation may have cleared the cache. Reread all the data. | 14647 // Function invocation may have cleared the cache. Reread all the data. |
14698 finger_index = cache_handle->finger_index(); | 14648 finger_index = cache_handle->finger_index(); |
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14910 CONVERT_BOOLEAN_ARG_CHECKED(new_state, 0); | 14860 CONVERT_BOOLEAN_ARG_CHECKED(new_state, 0); |
14911 bool old_state = isolate->microtask_pending(); | 14861 bool old_state = isolate->microtask_pending(); |
14912 isolate->set_microtask_pending(new_state); | 14862 isolate->set_microtask_pending(new_state); |
14913 return isolate->heap()->ToBoolean(old_state); | 14863 return isolate->heap()->ToBoolean(old_state); |
14914 } | 14864 } |
14915 | 14865 |
14916 | 14866 |
14917 RUNTIME_FUNCTION(MaybeObject*, Runtime_RunMicrotasks) { | 14867 RUNTIME_FUNCTION(MaybeObject*, Runtime_RunMicrotasks) { |
14918 HandleScope scope(isolate); | 14868 HandleScope scope(isolate); |
14919 ASSERT(args.length() == 0); | 14869 ASSERT(args.length() == 0); |
14920 if (isolate->microtask_pending()) | 14870 if (isolate->microtask_pending()) Execution::RunMicrotasks(isolate); |
14921 Execution::RunMicrotasks(isolate); | |
14922 return isolate->heap()->undefined_value(); | 14871 return isolate->heap()->undefined_value(); |
14923 } | 14872 } |
14924 | 14873 |
14925 | 14874 |
14926 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetMicrotaskState) { | 14875 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetMicrotaskState) { |
14927 SealHandleScope shs(isolate); | 14876 SealHandleScope shs(isolate); |
14928 ASSERT(args.length() == 0); | 14877 ASSERT(args.length() == 0); |
14929 return isolate->heap()->microtask_state(); | 14878 return isolate->heap()->microtask_state(); |
14930 } | 14879 } |
14931 | 14880 |
(...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
15238 } | 15187 } |
15239 } | 15188 } |
15240 | 15189 |
15241 | 15190 |
15242 void Runtime::OutOfMemory() { | 15191 void Runtime::OutOfMemory() { |
15243 Heap::FatalProcessOutOfMemory("CALL_AND_RETRY_LAST", true); | 15192 Heap::FatalProcessOutOfMemory("CALL_AND_RETRY_LAST", true); |
15244 UNREACHABLE(); | 15193 UNREACHABLE(); |
15245 } | 15194 } |
15246 | 15195 |
15247 } } // namespace v8::internal | 15196 } } // namespace v8::internal |
OLD | NEW |