<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[283527] trunk/Source/JavaScriptCore</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/283527">283527</a></dd>
<dt>Author</dt> <dd>sbarati@apple.com</dd>
<dt>Date</dt> <dd>2021-10-04 17:33:56 -0700 (Mon, 04 Oct 2021)</dd>
</dl>

<h3>Log Message</h3>
<pre>Display return values in nicer way in the jsc REPL and add a prettyPrint function
https://bugs.webkit.org/show_bug.cgi?id=230931
<rdar://problem/83698777>

Reviewed by Tadeu Zagallo.

Currently, print(1), print("1"), and print([1]) all print to stdout
simply as "1" (without the quotes). Same for values when running the
REPL. This isn't super helpful. Let's print quotes for strings, and
brackets for arrays. This patch adds a prettyPrint function to do
that, since we have a lot of tests that depend on the old print behavior.

This patch also makes values printed in the REPL the new pretty style.

* jsc.cpp:
(toCString):
(printInternal):
(JSC_DEFINE_HOST_FUNCTION):
(runInteractive):
(cStringFromViewWithString): Deleted.
* runtime/JSCJSValue.cpp:
(JSC::JSValue::toWTFStringForConsole const):
* runtime/JSCJSValue.h:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCorejsccpp">trunk/Source/JavaScriptCore/jsc.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSCJSValuecpp">trunk/Source/JavaScriptCore/runtime/JSCJSValue.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSCJSValueh">trunk/Source/JavaScriptCore/runtime/JSCJSValue.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (283526 => 283527)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog    2021-10-04 23:50:37 UTC (rev 283526)
+++ trunk/Source/JavaScriptCore/ChangeLog       2021-10-05 00:33:56 UTC (rev 283527)
</span><span class="lines">@@ -1,5 +1,32 @@
</span><span class="cx"> 2021-10-04  Saam Barati  <sbarati@apple.com>
</span><span class="cx"> 
</span><ins>+        Display return values in nicer way in the jsc REPL and add a prettyPrint function
+        https://bugs.webkit.org/show_bug.cgi?id=230931
+        <rdar://problem/83698777>
+
+        Reviewed by Tadeu Zagallo.
+
+        Currently, print(1), print("1"), and print([1]) all print to stdout
+        simply as "1" (without the quotes). Same for values when running the
+        REPL. This isn't super helpful. Let's print quotes for strings, and
+        brackets for arrays. This patch adds a prettyPrint function to do
+        that, since we have a lot of tests that depend on the old print behavior.
+        
+        This patch also makes values printed in the REPL the new pretty style.
+
+
+        * jsc.cpp:
+        (toCString):
+        (printInternal):
+        (JSC_DEFINE_HOST_FUNCTION):
+        (runInteractive):
+        (cStringFromViewWithString): Deleted.
+        * runtime/JSCJSValue.cpp:
+        (JSC::JSValue::toWTFStringForConsole const):
+        * runtime/JSCJSValue.h:
+
+2021-10-04  Saam Barati  <sbarati@apple.com>
+
</ins><span class="cx">         IntrinsicGetterAccessCase implementation of __proto__ needs to handle get_by_id_with_this
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=229951
</span><span class="cx">         <rdar://problem/82787527>
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorejsccpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jsc.cpp (283526 => 283527)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jsc.cpp      2021-10-04 23:50:37 UTC (rev 283526)
+++ trunk/Source/JavaScriptCore/jsc.cpp 2021-10-05 00:33:56 UTC (rev 283527)
</span><span class="lines">@@ -278,6 +278,7 @@
</span><span class="cx"> 
</span><span class="cx"> static JSC_DECLARE_HOST_FUNCTION(functionPrintStdOut);
</span><span class="cx"> static JSC_DECLARE_HOST_FUNCTION(functionPrintStdErr);
</span><ins>+static JSC_DECLARE_HOST_FUNCTION(functionPrettyPrint);
</ins><span class="cx"> static JSC_DECLARE_HOST_FUNCTION(functionDebug);
</span><span class="cx"> static JSC_DECLARE_HOST_FUNCTION(functionDescribe);
</span><span class="cx"> static JSC_DECLARE_HOST_FUNCTION(functionDescribeArray);
</span><span class="lines">@@ -527,6 +528,7 @@
</span><span class="cx">         addFunction(vm, "describeArray", functionDescribeArray, 1);
</span><span class="cx">         addFunction(vm, "print", functionPrintStdOut, 1);
</span><span class="cx">         addFunction(vm, "printErr", functionPrintStdErr, 1);
</span><ins>+        addFunction(vm, "prettyPrint", functionPrettyPrint, 1);
</ins><span class="cx">         addFunction(vm, "quit", functionQuit, 0);
</span><span class="cx">         addFunction(vm, "gc", functionGCAndSweep, 0);
</span><span class="cx">         addFunction(vm, "fullGC", functionFullGC, 0);
</span><span class="lines">@@ -1238,9 +1240,10 @@
</span><span class="cx">     return metaProperties;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static CString cStringFromViewWithString(JSGlobalObject* globalObject, ThrowScope& scope, StringViewWithUnderlyingString& viewWithString)
</del><ins>+template <typename T>
+static CString toCString(JSGlobalObject* globalObject, ThrowScope& scope, T& string)
</ins><span class="cx"> {
</span><del>-    Expected<CString, UTF8ConversionError> expectedString = viewWithString.view.tryGetUtf8();
</del><ins>+    Expected<CString, UTF8ConversionError> expectedString = string.tryGetUtf8();
</ins><span class="cx">     if (expectedString)
</span><span class="cx">         return expectedString.value();
</span><span class="cx">     switch (expectedString.error()) {
</span><span class="lines">@@ -1259,7 +1262,7 @@
</span><span class="cx">     return { };
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static EncodedJSValue printInternal(JSGlobalObject* globalObject, CallFrame* callFrame, FILE* out)
</del><ins>+static EncodedJSValue printInternal(JSGlobalObject* globalObject, CallFrame* callFrame, FILE* out, bool pretty)
</ins><span class="cx"> {
</span><span class="cx">     VM& vm = globalObject->vm();
</span><span class="cx">     auto scope = DECLARE_THROW_SCOPE(vm);
</span><span class="lines">@@ -1277,13 +1280,11 @@
</span><span class="cx">             if (EOF == fputc(' ', out))
</span><span class="cx">                 goto fail;
</span><span class="cx"> 
</span><del>-        auto* jsString = callFrame->uncheckedArgument(i).toString(globalObject);
</del><ins>+        String string = pretty ? callFrame->uncheckedArgument(i).toWTFStringForConsole(globalObject) : callFrame->uncheckedArgument(i).toWTFString(globalObject);
</ins><span class="cx">         RETURN_IF_EXCEPTION(scope, { });
</span><del>-        auto viewWithString = jsString->viewWithUnderlyingString(globalObject);
</del><ins>+        auto cString = toCString(globalObject, scope, string);
</ins><span class="cx">         RETURN_IF_EXCEPTION(scope, { });
</span><del>-        auto string = cStringFromViewWithString(globalObject, scope, viewWithString);
-        RETURN_IF_EXCEPTION(scope, { });
-        fwrite(string.data(), sizeof(char), string.length(), out);
</del><ins>+        fwrite(cString.data(), sizeof(char), cString.length(), out);
</ins><span class="cx">         if (ferror(out))
</span><span class="cx">             goto fail;
</span><span class="cx">     }
</span><span class="lines">@@ -1296,14 +1297,19 @@
</span><span class="cx"> 
</span><span class="cx"> JSC_DEFINE_HOST_FUNCTION(functionPrintStdOut, (JSGlobalObject* globalObject, CallFrame* callFrame))
</span><span class="cx"> {
</span><del>-    return printInternal(globalObject, callFrame, stdout);
</del><ins>+    return printInternal(globalObject, callFrame, stdout, false);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> JSC_DEFINE_HOST_FUNCTION(functionPrintStdErr, (JSGlobalObject* globalObject, CallFrame* callFrame))
</span><span class="cx"> {
</span><del>-    return printInternal(globalObject, callFrame, stderr);
</del><ins>+    return printInternal(globalObject, callFrame, stderr, false);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+JSC_DEFINE_HOST_FUNCTION(functionPrettyPrint, (JSGlobalObject* globalObject, CallFrame* callFrame))
+{
+    return printInternal(globalObject, callFrame, stdout, true);
+}
+
</ins><span class="cx"> JSC_DEFINE_HOST_FUNCTION(functionDebug, (JSGlobalObject* globalObject, CallFrame* callFrame))
</span><span class="cx"> {
</span><span class="cx">     VM& vm = globalObject->vm();
</span><span class="lines">@@ -1312,7 +1318,7 @@
</span><span class="cx">     RETURN_IF_EXCEPTION(scope, { });
</span><span class="cx">     auto viewWithString = jsString->viewWithUnderlyingString(globalObject);
</span><span class="cx">     RETURN_IF_EXCEPTION(scope, { });
</span><del>-    auto string = cStringFromViewWithString(globalObject, scope, viewWithString);
</del><ins>+    auto string = toCString(globalObject, scope, viewWithString.view);
</ins><span class="cx">     RETURN_IF_EXCEPTION(scope, { });
</span><span class="cx">     fputs("--> ", stderr);
</span><span class="cx">     fwrite(string.data(), sizeof(char), string.length(), stderr);
</span><span class="lines">@@ -3271,7 +3277,7 @@
</span><span class="cx">             fputs("Exception: ", stdout);
</span><span class="cx">             utf8 = evaluationException->value().toWTFString(globalObject).tryGetUtf8();
</span><span class="cx">         } else
</span><del>-            utf8 = returnValue.toWTFString(globalObject).tryGetUtf8();
</del><ins>+            utf8 = returnValue.toWTFStringForConsole(globalObject).tryGetUtf8();
</ins><span class="cx"> 
</span><span class="cx">         CString result;
</span><span class="cx">         if (utf8)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSCJSValuecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSCJSValue.cpp (283526 => 283527)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSCJSValue.cpp       2021-10-04 23:50:37 UTC (rev 283526)
+++ trunk/Source/JavaScriptCore/runtime/JSCJSValue.cpp  2021-10-05 00:33:56 UTC (rev 283527)
</span><span class="lines">@@ -471,4 +471,19 @@
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+WTF::String JSValue::toWTFStringForConsole(JSGlobalObject* globalObject) const
+{
+    VM& vm = globalObject->vm();
+    auto scope = DECLARE_THROW_SCOPE(vm);
+    JSString* string = toString(globalObject);
+    RETURN_IF_EXCEPTION(scope, { });
+    String result = string->value(globalObject);
+    RETURN_IF_EXCEPTION(scope, { });
+    if (isString())
+        return makeString("\"", result, "\"");
+    if (jsDynamicCast<JSArray*>(vm, *this))
+        return makeString("[", result, "]");
+    return result;
+}
+
</ins><span class="cx"> } // namespace JSC
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSCJSValueh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSCJSValue.h (283526 => 283527)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSCJSValue.h 2021-10-04 23:50:37 UTC (rev 283526)
+++ trunk/Source/JavaScriptCore/runtime/JSCJSValue.h    2021-10-05 00:33:56 UTC (rev 283527)
</span><span class="lines">@@ -289,6 +289,7 @@
</span><span class="cx">     Identifier toPropertyKey(JSGlobalObject*) const;
</span><span class="cx">     JSValue toPropertyKeyValue(JSGlobalObject*) const;
</span><span class="cx">     WTF::String toWTFString(JSGlobalObject*) const;
</span><ins>+    JS_EXPORT_PRIVATE WTF::String toWTFStringForConsole(JSGlobalObject*) const;
</ins><span class="cx">     JSObject* toObject(JSGlobalObject*) const;
</span><span class="cx"> 
</span><span class="cx">     // Integer conversions.
</span></span></pre>
</div>
</div>

</body>
</html>