OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/builtins.h" | 5 #include "src/builtins.h" |
6 | 6 |
7 #include "src/api.h" | 7 #include "src/api.h" |
8 #include "src/api-natives.h" | 8 #include "src/api-natives.h" |
9 #include "src/arguments.h" | 9 #include "src/arguments.h" |
10 #include "src/base/once.h" | 10 #include "src/base/once.h" |
(...skipping 1953 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1964 // ES6 section 19.2.1.1 Function ( p1, p2, ... , pn, body ) | 1964 // ES6 section 19.2.1.1 Function ( p1, p2, ... , pn, body ) |
1965 BUILTIN(FunctionConstructor) { | 1965 BUILTIN(FunctionConstructor) { |
1966 HandleScope scope(isolate); | 1966 HandleScope scope(isolate); |
1967 Handle<JSFunction> result; | 1967 Handle<JSFunction> result; |
1968 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 1968 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
1969 isolate, result, CreateDynamicFunction(isolate, args, "function")); | 1969 isolate, result, CreateDynamicFunction(isolate, args, "function")); |
1970 return *result; | 1970 return *result; |
1971 } | 1971 } |
1972 | 1972 |
1973 | 1973 |
1974 // ES6 section 19.2.3.2 Function.prototype.bind ( thisArg, ...args ) | |
1975 BUILTIN(FunctionPrototypeBind) { | |
1976 HandleScope scope(isolate); | |
1977 DCHECK_LE(1, args.length()); | |
1978 if (!args.receiver()->IsCallable()) { | |
1979 THROW_NEW_ERROR_RETURN_FAILURE( | |
1980 isolate, NewTypeError(MessageTemplate::kFunctionBind)); | |
1981 } | |
1982 | |
1983 // Allocate the bound function with the given {this_arg} and {args}. | |
1984 Handle<JSReceiver> target = args.at<JSReceiver>(0); | |
1985 Handle<Object> this_arg = isolate->factory()->undefined_value(); | |
1986 ScopedVector<Handle<Object>> argv(std::max(0, args.length() - 2)); | |
1987 if (args.length() > 1) { | |
1988 this_arg = args.at<Object>(1); | |
1989 for (int i = 2; i < args.length(); ++i) { | |
1990 argv[i - 2] = args.at<Object>(i); | |
1991 } | |
1992 } | |
1993 Handle<JSBoundFunction> function; | |
1994 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | |
1995 isolate, function, | |
1996 isolate->factory()->NewJSBoundFunction(target, this_arg, argv)); | |
1997 | |
1998 // TODO(bmeurer): Optimize the rest for the common cases where {target} is | |
1999 // a function with some initial map or even a bound function. | |
2000 // Setup the "length" property based on the "length" of the {target}. | |
2001 Handle<Object> length(Smi::FromInt(0), isolate); | |
2002 Maybe<bool> target_has_length = | |
2003 JSReceiver::HasOwnProperty(target, isolate->factory()->length_string()); | |
2004 if (!target_has_length.IsJust()) { | |
2005 return isolate->heap()->exception(); | |
2006 } else if (target_has_length.FromJust()) { | |
2007 Handle<Object> target_length; | |
2008 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | |
2009 isolate, target_length, | |
2010 JSReceiver::GetProperty(target, isolate->factory()->length_string())); | |
2011 if (target_length->IsNumber()) { | |
2012 length = isolate->factory()->NewNumber(std::max( | |
2013 0.0, DoubleToInteger(target_length->Number()) - argv.length())); | |
2014 } | |
2015 } | |
2016 function->set_length(*length); | |
2017 | |
2018 // Setup the "name" property based on the "name" of the {target}. | |
2019 Handle<Object> target_name; | |
2020 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | |
2021 isolate, target_name, | |
2022 JSReceiver::GetProperty(target, isolate->factory()->name_string())); | |
2023 Handle<String> name; | |
2024 if (!target_name->IsString()) { | |
2025 name = isolate->factory()->bound__string(); | |
2026 } else { | |
2027 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | |
2028 isolate, name, Name::ToFunctionName(Handle<String>::cast(target_name))); | |
2029 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | |
2030 isolate, name, isolate->factory()->NewConsString( | |
2031 isolate->factory()->bound__string(), name)); | |
2032 } | |
2033 function->set_name(*name); | |
2034 return *function; | |
2035 } | |
2036 | |
2037 | |
2038 // ES6 section 19.2.3.5 Function.prototype.toString ( ) | 1974 // ES6 section 19.2.3.5 Function.prototype.toString ( ) |
2039 BUILTIN(FunctionPrototypeToString) { | 1975 BUILTIN(FunctionPrototypeToString) { |
2040 HandleScope scope(isolate); | 1976 HandleScope scope(isolate); |
2041 Handle<Object> receiver = args.receiver(); | 1977 Handle<Object> receiver = args.receiver(); |
2042 | 1978 |
2043 if (receiver->IsJSBoundFunction()) { | 1979 if (receiver->IsJSFunction()) { |
2044 return *JSBoundFunction::ToString(Handle<JSBoundFunction>::cast(receiver)); | |
2045 } else if (receiver->IsJSFunction()) { | |
2046 return *JSFunction::ToString(Handle<JSFunction>::cast(receiver)); | 1980 return *JSFunction::ToString(Handle<JSFunction>::cast(receiver)); |
2047 } | 1981 } |
2048 THROW_NEW_ERROR_RETURN_FAILURE( | 1982 THROW_NEW_ERROR_RETURN_FAILURE( |
2049 isolate, NewTypeError(MessageTemplate::kNotGeneric, | 1983 isolate, NewTypeError(MessageTemplate::kNotGeneric, |
2050 isolate->factory()->NewStringFromAsciiChecked( | 1984 isolate->factory()->NewStringFromAsciiChecked( |
2051 "Function.prototype.toString"))); | 1985 "Function.prototype.toString"))); |
2052 } | 1986 } |
2053 | 1987 |
2054 | 1988 |
2055 // ES6 section 25.2.1.1 GeneratorFunction (p1, p2, ... , pn, body) | 1989 // ES6 section 25.2.1.1 GeneratorFunction (p1, p2, ... , pn, body) |
(...skipping 710 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2766 BUILTIN_LIST_C(DEFINE_BUILTIN_ACCESSOR_C) | 2700 BUILTIN_LIST_C(DEFINE_BUILTIN_ACCESSOR_C) |
2767 BUILTIN_LIST_A(DEFINE_BUILTIN_ACCESSOR_A) | 2701 BUILTIN_LIST_A(DEFINE_BUILTIN_ACCESSOR_A) |
2768 BUILTIN_LIST_H(DEFINE_BUILTIN_ACCESSOR_H) | 2702 BUILTIN_LIST_H(DEFINE_BUILTIN_ACCESSOR_H) |
2769 BUILTIN_LIST_DEBUG_A(DEFINE_BUILTIN_ACCESSOR_A) | 2703 BUILTIN_LIST_DEBUG_A(DEFINE_BUILTIN_ACCESSOR_A) |
2770 #undef DEFINE_BUILTIN_ACCESSOR_C | 2704 #undef DEFINE_BUILTIN_ACCESSOR_C |
2771 #undef DEFINE_BUILTIN_ACCESSOR_A | 2705 #undef DEFINE_BUILTIN_ACCESSOR_A |
2772 | 2706 |
2773 | 2707 |
2774 } // namespace internal | 2708 } // namespace internal |
2775 } // namespace v8 | 2709 } // namespace v8 |
OLD | NEW |