JavaScript 簡易実行
値:
この部分は iframe 対応のブラウザで見てください。
function mkWrapper(tracer, name) { var f = function __wrapper__() { tracer.console.write('<a href="#" onclick="opener.toggle(this); return false;">'); tracer.console.write('<b style="color:green;">',tracer.depth++,'> ',name,'('); for (var i=0; i<arguments.length; i++) { tracer.console.write(normal(arguments[i])); if (i+1<arguments.length) tracer.console.write(', '); } tracer.console.write(')</b></a>'); tracer.console.write('<div class="item" style="height:2ex;color:gray;display:none;">…</div>'); tracer.console.write('<div class="item">'); var r = tracer.env[name].orig.apply(tracer.env, arguments); tracer.console.writeln('</div><b style="color:maroon;">',--tracer.depth,'< return ',normal(r),'</b><br>'); return r; }; f.orig = eval(name); return f; } Tracer = { env: window, targets: {}, depth: 0, console: new Console("TracerConsole"), open: function () { with (this.console) { open(); writeln('<title>Tracer Output</title>'); writeln('<style type="text/css"><!--'); writeln('.item {margin-left:0.25em;padding-left:0.75em;border-left:solid gray 1px;}'); writeln('--></style>'); } }, start: function (targets) { if (this.console.closed()) this.open(); if (targets.constructor!=Array) targets = [ targets ]; var wrapper; for (var i=0; i<targets.length; i++) { if (targets[i].name!="__wrapper__") { this.targets[targets[i].name] = true; wrapper = mkWrapper(this, targets[i].name); this.env[targets[i].name] = wrapper; } } }, stop: function (targets) { if (targets.constructor!=Array) targets = [ targets ]; for (var i=0; i<targets.length; i++) { if (targets[i].name=="__wrapper__") this.env[targets[i].orig.name] = targets[i].orig; } }, end: function () { this.console.close(); for (var fn in this.targets) if (this.env[fn].name=="__wrapper__") this.env[fn] = this.env[fn].orig; }, clear: function () { this.console.close(); this.open(); } };