Skip to content
This repository was archived by the owner on Jun 27, 2018. It is now read-only.

Commit e8a768b

Browse files
committed
Merge pull request #191 from respeccing/turn_on_backtrace_when_Debug
UI option to turn on backtrace (RUST_BACKTRACE=1) --- off by default; (and also embed it in shared urls)
2 parents 9a7e75c + 20ca18c commit e8a768b

File tree

3 files changed

+75
-31
lines changed

3 files changed

+75
-31
lines changed

static/web.html

+6
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,12 @@
7373
<option>att</option>
7474
<option>intel</option>
7575
</select>
76+
<p><label for=backtrace title="Whether to set the shell environment var RUST_BACKTRACE and thus show the backtrace in the output! eg. to quickly test this run: fn main() { panic!() }">Backtrace:</label>
77+
<select name=backtrace id=backtrace>
78+
<option title="RUST_BACKTRACE is not set" value="0">off</option>
79+
<option title="export RUST_BACKTRACE=1" value="1">on</option>
80+
<option title="'auto' means turn this on only when Mode: Debug but not when Mode: Release" value="2">auto</option>
81+
</select>
7682
</div
7783
></div>
7884
</form>

static/web.js

+36-14
Original file line numberDiff line numberDiff line change
@@ -133,8 +133,8 @@
133133
result.parentNode.style.visibility = "";
134134
}
135135

136-
function evaluate(result, code, version, optimize, button, test) {
137-
send("evaluate.json", {code: code, version: version, optimize: optimize, test: !!test, separate_output: true, color: true},
136+
function evaluate(result, code, version, optimize, button, test, backtrace) {
137+
send("evaluate.json", {code: code, version: version, optimize: optimize, test: !!test, separate_output: true, color: true, backtrace: backtrace },
138138
function(object) {
139139
var samp, pre;
140140
set_result(result);
@@ -174,10 +174,10 @@
174174
}, button, test ? "Running tests…" : "Running…", result);
175175
}
176176

177-
function compile(emit, result, code, version, optimize, button) {
177+
function compile(emit, result, code, version, optimize, button, backtrace) {
178178
var syntax = document.getElementById('asm-flavor').value;
179179
send("compile.json", {emit: emit, code: code, version: version, optimize: optimize,
180-
color: true, highlight: true, syntax: syntax}, function(object) {
180+
color: true, highlight: true, syntax: syntax, backtrace: backtrace}, function(object) {
181181
if ("error" in object) {
182182
set_result(result, "<pre class=\"rustc-output rustc-errors\"><samp></samp></pre>");
183183
result.firstChild.firstChild.innerHTML = formatCompilerOutput(object.error);
@@ -233,10 +233,11 @@
233233
result.parentNode.style.visibility = "";
234234
}
235235

236-
function shareGist(result, version, code, button) {
236+
function shareGist(result, version, code, button, backtraceval) {
237237
// only needed for the "shrinking" animation
238238
var full_url = "https://play.rust-lang.org/?code=" + encodeURIComponent(code) +
239-
"&version=" + encodeURIComponent(version);
239+
"&version=" + encodeURIComponent(version) +
240+
"&backtrace=" + encodeURIComponent(backtraceval);
240241
var url = "https://api.github.com/gists";
241242
button.disabled = true;
242243

@@ -275,7 +276,8 @@
275276

276277
var play_url = "https://play.rust-lang.org/?gist=" +
277278
encodeURIComponent(gist_id) + "&version=" +
278-
encodeURIComponent(version);
279+
encodeURIComponent(version) +
280+
"&backtrace=" + encodeURIComponent(backtraceval);
279281

280282

281283
var link = result.firstChild.firstElementChild;
@@ -301,9 +303,10 @@
301303
);
302304
}
303305

304-
function share(result, version, code, button) {
306+
function share(result, version, code, button, backtraceval) {
305307
var playurl = "https://play.rust-lang.org/?code=" + encodeURIComponent(code);
306308
playurl += "&version=" + encodeURIComponent(version);
309+
playurl += "&backtrace=" + encodeURIComponent(backtraceval);
307310
if (playurl.length > 5000) {
308311
set_result(result, "<p class=error>Sorry, your code is too long to share this way." +
309312
"<p class=error-explanation>At present, sharing produces a link containing the" +
@@ -482,6 +485,7 @@
482485
var mode;
483486
var query;
484487
var asm_flavor;
488+
var backtrace;
485489

486490
function updateEvaluateAction(code) {
487491
// A very simple pair of heuristics; there’s no point in doing more, IMO.
@@ -503,7 +507,8 @@
503507
}
504508
evaluate(result, session.getValue(), getRadioValue("version"),
505509
getRadioValue("optimize"), evaluateButton,
506-
evaluateAction === "test");
510+
evaluateAction === "test",
511+
backtrace.value);
507512
}
508513

509514
var COLOR_CODES = ['black', 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white'];
@@ -552,6 +557,7 @@
552557
clearResultButton = document.getElementById("clear-result");
553558
keyboard = document.getElementById("keyboard");
554559
asm_flavor = document.getElementById("asm-flavor");
560+
backtrace = document.getElementById("backtrace");
555561
themes = document.getElementById("themes");
556562
editor = ace.edit("editor");
557563
set_result.editor = editor;
@@ -589,6 +595,11 @@
589595
asm_flavor.value = flavor;
590596
}
591597

598+
var vbacktrace = optionalLocalStorageGetItem("backtrace");
599+
if (vbacktrace !== null) {
600+
backtrace.value = vbacktrace;
601+
}
602+
592603
query = getQueryParameters();
593604
if ("code" in query) {
594605
session.setValue(query.code);
@@ -610,6 +621,12 @@
610621
}
611622
}
612623

624+
if ("backtrace" in query) {
625+
if (backtrace !== null) {
626+
backtrace.value = query.backtrace;
627+
}
628+
}
629+
613630
if (query.run === "1") {
614631
doEvaluate();
615632
} else {
@@ -637,6 +654,11 @@
637654
optionalLocalStorageSetItem("asm_flavor", flavor);
638655
};
639656

657+
backtrace.onkeyup = backtrace.onchange = function() {
658+
var vbacktrace = backtrace.options[backtrace.selectedIndex].value;
659+
optionalLocalStorageSetItem("backtrace", vbacktrace);
660+
};
661+
640662
evaluateButton.onclick = function() {
641663
doEvaluate(true);
642664
};
@@ -656,30 +678,30 @@
656678

657679
asmButton.onclick = function() {
658680
compile("asm", result, session.getValue(), getRadioValue("version"),
659-
getRadioValue("optimize"), asmButton);
681+
getRadioValue("optimize"), asmButton, backtrace.value);
660682
};
661683

662684
irButton.onclick = function() {
663685
compile("llvm-ir", result, session.getValue(), getRadioValue("version"),
664-
getRadioValue("optimize"), irButton);
686+
getRadioValue("optimize"), irButton, backtrace.value);
665687
};
666688

667689
mirButton.onclick = function() {
668690
document.getElementById("version-nightly").checked = true;
669691
compile("mir", result, session.getValue(), getRadioValue("version"),
670-
getRadioValue("optimize"), mirButton);
692+
getRadioValue("optimize"), mirButton, backtrace.value);
671693
};
672694

673695
formatButton.onclick = function() {
674696
format(result, session, getRadioValue("version"), formatButton);
675697
};
676698

677699
shareButton.onclick = function() {
678-
share(result, getRadioValue("version"), session.getValue(), shareButton);
700+
share(result, getRadioValue("version"), session.getValue(), shareButton, backtrace.value);
679701
};
680702

681703
gistButton.onclick = function() {
682-
shareGist(result, getRadioValue("version"), session.getValue(), gistButton);
704+
shareGist(result, getRadioValue("version"), session.getValue(), gistButton, backtrace.value);
683705
};
684706

685707
configureEditorButton.onclick = function() {

web.py

+33-17
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import functools
44
import os
55
import sys
6+
import shlex #for shlex.quote() needed only when backtrace is on, to escape args
67

78
from bottle import get, request, response, route, run, static_file
89
from pygments import highlight
@@ -32,7 +33,13 @@ def serve_static(path):
3233
return static_file(path, root="static")
3334

3435
@functools.lru_cache(maxsize=256)
35-
def execute(version, command, arguments, code):
36+
def execute(version, command, arguments, code, show_backtrace):
37+
if show_backtrace:
38+
escapedargs=""
39+
for arg in arguments:
40+
escapedargs += " " + shlex.quote(arg)
41+
arguments = ("-c", "export RUST_BACKTRACE=1; " + command + escapedargs)
42+
command = "/usr/bin/dash"
3643
print("running:", version, command, arguments, file=sys.stderr, flush=True)
3744
return playpen.execute(version, command, arguments, code)
3845

@@ -57,22 +64,31 @@ def wrapper(*args, **kwargs):
5764
return wrapper
5865
return decorator
5966

67+
def init_args_get_bt(optimize, color, backtrace_str):
68+
args = ["-C", "opt-level=" + optimize]
69+
if "1" == backtrace_str or ( "2" == backtrace_str and "0" == optimize ):
70+
show_backtrace = True
71+
else:
72+
show_backtrace = False
73+
if "0" == optimize:
74+
args.append("-g")
75+
if color:
76+
args.append("--color=always")
77+
return (args, show_backtrace)
78+
6079
@route("/evaluate.json", method=["POST", "OPTIONS"])
6180
@enable_post_cors
81+
@extractor("backtrace", "0", ("0", "1", "2"))
6282
@extractor("color", False, (True, False))
6383
@extractor("test", False, (True, False))
6484
@extractor("version", "stable", ("stable", "beta", "nightly"))
6585
@extractor("optimize", "2", ("0", "1", "2", "3"))
66-
def evaluate(optimize, version, test, color):
67-
args = ["-C", "opt-level=" + optimize]
68-
if optimize == "0":
69-
args.append("-g")
70-
if color:
71-
args.append("--color=always")
86+
def evaluate(optimize, version, test, color, backtrace_str):
87+
args, show_backtrace = init_args_get_bt(optimize, color, backtrace_str)
7288
if test:
7389
args.append("--test")
7490

75-
out, _ = execute(version, "/usr/local/bin/evaluate.sh", tuple(args), request.json["code"])
91+
out, _ = execute(version, "/usr/local/bin/evaluate.sh", tuple(args), request.json["code"], show_backtrace)
7692

7793
if request.json.get("separate_output") is True:
7894
split = out.split(b"\xff", 1)
@@ -87,27 +103,27 @@ def evaluate(optimize, version, test, color):
87103

88104
@route("/format.json", method=["POST", "OPTIONS"])
89105
@enable_post_cors
106+
@extractor("optimize", "2", ("0", "1", "2", "3"))
107+
@extractor("backtrace", "0", ("0", "1", "2"))
90108
@extractor("version", "stable", ("stable", "beta", "nightly"))
91-
def format(version):
92-
out, rc = execute(version, "/usr/bin/rustfmt", (), request.json["code"])
109+
def format(version, backtrace_str, optimize):
110+
_, show_backtrace = init_args_get_bt(optimize, None, backtrace_str)
111+
out, rc = execute(version, "/usr/bin/rustfmt", (), request.json["code"], show_backtrace)
93112
if rc:
94113
return {"error": out.decode()}
95114
else:
96115
return {"result": out.decode()}
97116

98117
@route("/compile.json", method=["POST", "OPTIONS"])
99118
@enable_post_cors
119+
@extractor("backtrace", "0", ("0", "1", "2"))
100120
@extractor("syntax", "att", ("att", "intel"))
101121
@extractor("color", False, (True, False))
102122
@extractor("version", "stable", ("stable", "beta", "nightly"))
103123
@extractor("optimize", "2", ("0", "1", "2", "3"))
104124
@extractor("emit", "asm", ("asm", "llvm-ir", "mir"))
105-
def compile(emit, optimize, version, color, syntax):
106-
args = ["-C", "opt-level=" + optimize]
107-
if optimize == "0":
108-
args.append("-g")
109-
if color:
110-
args.append("--color=always")
125+
def compile(emit, optimize, version, color, syntax, backtrace_str):
126+
args, show_backtrace = init_args_get_bt(optimize, color, backtrace_str)
111127
if syntax:
112128
args.append("-C")
113129
args.append("llvm-args=-x86-asm-syntax=%s" % syntax)
@@ -116,7 +132,7 @@ def compile(emit, optimize, version, color, syntax):
116132
args.append("--unpretty=mir")
117133
else:
118134
args.append("--emit=" + emit)
119-
out, _ = execute(version, "/usr/local/bin/compile.sh", tuple(args), request.json["code"])
135+
out, _ = execute(version, "/usr/local/bin/compile.sh", tuple(args), request.json["code"], show_backtrace)
120136
split = out.split(b"\xff", 1)
121137
if len(split) == 2:
122138
rustc_output = split[0].decode()

0 commit comments

Comments
 (0)