summaryrefslogtreecommitdiff
path: root/deps/v8/src/d8-js.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/d8-js.cc')
-rw-r--r--deps/v8/src/d8-js.cc101
1 files changed, 101 insertions, 0 deletions
diff --git a/deps/v8/src/d8-js.cc b/deps/v8/src/d8-js.cc
new file mode 100644
index 0000000000..c1dac77075
--- /dev/null
+++ b/deps/v8/src/d8-js.cc
@@ -0,0 +1,101 @@
+// Copyright 2008 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/d8.h"
+
+const char* v8::Shell::stringify_source_ = R"D8(
+(function() {
+"use strict";
+
+// A more universal stringify that supports more types than JSON.
+// Used by the d8 shell to output results.
+var stringifyDepthLimit = 4; // To avoid crashing on cyclic objects
+
+// Hacky solution to circumvent forcing --allow-natives-syntax for d8
+function isProxy(o) { return false };
+function JSProxyGetTarget(proxy) { };
+function JSProxyGetHandler(proxy) { };
+
+try {
+ isProxy = Function(['object'], 'return %IsJSProxy(object)');
+ JSProxyGetTarget = Function(['proxy'],
+ 'return %JSProxyGetTarget(proxy)');
+ JSProxyGetHandler = Function(['proxy'],
+ 'return %JSProxyGetHandler(proxy)');
+} catch(e) {};
+
+
+function Stringify(x, depth) {
+ if (depth === undefined)
+ depth = stringifyDepthLimit;
+ else if (depth === 0)
+ return "...";
+ if (isProxy(x)) {
+ return StringifyProxy(x, depth);
+ }
+ switch (typeof x) {
+ case "undefined":
+ return "undefined";
+ case "boolean":
+ case "number":
+ case "function":
+ case "symbol":
+ return x.toString();
+ case "string":
+ return "\"" + x.toString() + "\"";
+ case "bigint":
+ return x.toString() + "n";
+ case "object":
+ if (x === null) return "null";
+ if (x.constructor && x.constructor.name === "Array") {
+ var elems = [];
+ for (var i = 0; i < x.length; ++i) {
+ elems.push(
+ {}.hasOwnProperty.call(x, i) ? Stringify(x[i], depth - 1) : "");
+ }
+ return "[" + elems.join(", ") + "]";
+ }
+ try {
+ var string = String(x);
+ if (string && string !== "[object Object]") return string;
+ } catch(e) {}
+ var props = [];
+ var names = Object.getOwnPropertyNames(x);
+ names = names.concat(Object.getOwnPropertySymbols(x));
+ for (var i in names) {
+ var name = names[i];
+ var desc = Object.getOwnPropertyDescriptor(x, name);
+ if (desc === (void 0)) continue;
+ if (typeof name === 'symbol') name = "[" + Stringify(name) + "]";
+ if ("value" in desc) {
+ props.push(name + ": " + Stringify(desc.value, depth - 1));
+ }
+ if (desc.get) {
+ var getter = Stringify(desc.get);
+ props.push("get " + name + getter.slice(getter.indexOf('(')));
+ }
+ if (desc.set) {
+ var setter = Stringify(desc.set);
+ props.push("set " + name + setter.slice(setter.indexOf('(')));
+ }
+ }
+ return "{" + props.join(", ") + "}";
+ default:
+ return "[crazy non-standard value]";
+ }
+}
+
+function StringifyProxy(proxy, depth) {
+ var proxy_type = typeof proxy;
+ var info_object = {
+ target: JSProxyGetTarget(proxy),
+ handler: JSProxyGetHandler(proxy)
+ }
+ return '[' + proxy_type + ' Proxy ' + Stringify(info_object, depth-1) + ']';
+}
+
+return Stringify;
+})();
+
+)D8";