| // Copyright 2016 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "src/builtins/builtins-utils-inl.h" |
| #include "src/builtins/builtins.h" |
| #include "src/codegen/code-factory.h" |
| #include "src/codegen/compiler.h" |
| #include "src/logging/counters.h" |
| #include "src/objects/objects-inl.h" |
| #include "src/strings/uri.h" |
| |
| namespace v8 { |
| namespace internal { |
| |
| // ES6 section 18.2.6.2 decodeURI (encodedURI) |
| BUILTIN(GlobalDecodeURI) { |
| HandleScope scope(isolate); |
| Handle<String> encoded_uri; |
| ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| isolate, encoded_uri, |
| Object::ToString(isolate, args.atOrUndefined(isolate, 1))); |
| |
| RETURN_RESULT_OR_FAILURE(isolate, Uri::DecodeUri(isolate, encoded_uri)); |
| } |
| |
| // ES6 section 18.2.6.3 decodeURIComponent (encodedURIComponent) |
| BUILTIN(GlobalDecodeURIComponent) { |
| HandleScope scope(isolate); |
| Handle<String> encoded_uri_component; |
| ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| isolate, encoded_uri_component, |
| Object::ToString(isolate, args.atOrUndefined(isolate, 1))); |
| |
| RETURN_RESULT_OR_FAILURE( |
| isolate, Uri::DecodeUriComponent(isolate, encoded_uri_component)); |
| } |
| |
| // ES6 section 18.2.6.4 encodeURI (uri) |
| BUILTIN(GlobalEncodeURI) { |
| HandleScope scope(isolate); |
| Handle<String> uri; |
| ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| isolate, uri, Object::ToString(isolate, args.atOrUndefined(isolate, 1))); |
| |
| RETURN_RESULT_OR_FAILURE(isolate, Uri::EncodeUri(isolate, uri)); |
| } |
| |
| // ES6 section 18.2.6.5 encodeURIComponenet (uriComponent) |
| BUILTIN(GlobalEncodeURIComponent) { |
| HandleScope scope(isolate); |
| Handle<String> uri_component; |
| ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| isolate, uri_component, |
| Object::ToString(isolate, args.atOrUndefined(isolate, 1))); |
| |
| RETURN_RESULT_OR_FAILURE(isolate, |
| Uri::EncodeUriComponent(isolate, uri_component)); |
| } |
| |
| // ES6 section B.2.1.1 escape (string) |
| BUILTIN(GlobalEscape) { |
| HandleScope scope(isolate); |
| Handle<String> string; |
| ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| isolate, string, |
| Object::ToString(isolate, args.atOrUndefined(isolate, 1))); |
| |
| RETURN_RESULT_OR_FAILURE(isolate, Uri::Escape(isolate, string)); |
| } |
| |
| // ES6 section B.2.1.2 unescape (string) |
| BUILTIN(GlobalUnescape) { |
| HandleScope scope(isolate); |
| Handle<String> string; |
| ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| isolate, string, |
| Object::ToString(isolate, args.atOrUndefined(isolate, 1))); |
| |
| RETURN_RESULT_OR_FAILURE(isolate, Uri::Unescape(isolate, string)); |
| } |
| |
| // ES6 section 18.2.1 eval (x) |
| BUILTIN(GlobalEval) { |
| HandleScope scope(isolate); |
| Handle<Object> x = args.atOrUndefined(isolate, 1); |
| Handle<JSFunction> target = args.target(); |
| Handle<JSObject> target_global_proxy(target->global_proxy(), isolate); |
| if (!Builtins::AllowDynamicFunction(isolate, target, target_global_proxy)) { |
| isolate->CountUsage(v8::Isolate::kFunctionConstructorReturnedUndefined); |
| return ReadOnlyRoots(isolate).undefined_value(); |
| } |
| |
| // Run embedder pre-checks before executing eval. If the argument is a |
| // non-String (or other object the embedder doesn't know to handle), then |
| // return it directly. |
| MaybeHandle<String> source; |
| bool unhandled_object; |
| std::tie(source, unhandled_object) = |
| Compiler::ValidateDynamicCompilationSource( |
| isolate, handle(target->native_context(), isolate), x); |
| if (unhandled_object) return *x; |
| |
| Handle<JSFunction> function; |
| ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| isolate, function, |
| Compiler::GetFunctionFromValidatedString( |
| handle(target->native_context(), isolate), source, |
| NO_PARSE_RESTRICTION, kNoSourcePosition)); |
| RETURN_RESULT_OR_FAILURE( |
| isolate, |
| Execution::Call(isolate, function, target_global_proxy, 0, nullptr)); |
| } |
| |
| } // namespace internal |
| } // namespace v8 |