// 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 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 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 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 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; 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; 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 x = args.atOrUndefined(isolate, 1); Handle target = args.target(); Handle 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 source; bool unhandled_object; std::tie(source, unhandled_object) = Compiler::ValidateDynamicCompilationSource( isolate, handle(target->native_context(), isolate), x); if (unhandled_object) return *x; Handle 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