author | Jason Orendorff <jorendorff@mozilla.com> |
Fri, 30 Oct 2015 16:52:58 -0500 | |
changeset 272946 | b459ff7821b1b30a3cee11747b4bb3cf6fb0886c |
parent 272945 | 1a6bb31af78a743c5cc604d209ffaded142fb2e2 |
child 272947 | 8969b317c0462dddeb5b9557107c4c278bf0187d |
push id | 29688 |
push user | kwierso@gmail.com |
push date | Tue, 17 Nov 2015 21:10:09 +0000 |
treeherder | mozilla-central@eed903a7e4e7 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | efaust |
bugs | 1221285 |
milestone | 45.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/js/src/shell/js.cpp +++ b/js/src/shell/js.cpp @@ -1816,16 +1816,35 @@ AssertEq(JSContext* cx, unsigned argc, V args.rval().setUndefined(); return true; } static JSScript* ValueToScript(JSContext* cx, Value vArg, JSFunction** funp = nullptr) { RootedValue v(cx, vArg); + + if (v.isString()) { + // To convert a string to a script, compile it. Parse it as an ES6 Program. + RootedLinearString linearStr(cx, StringToLinearString(cx, v.toString())); + if (!linearStr) + return nullptr; + size_t len = GetLinearStringLength(linearStr); + AutoStableStringChars linearChars(cx); + if (!linearChars.initTwoByte(cx, linearStr)) + return nullptr; + const char16_t* chars = linearChars.twoByteRange().start().get(); + + RootedScript script(cx); + CompileOptions options(cx); + if (!JS::Compile(cx, options, chars, len, &script)) + return nullptr; + return script; + } + RootedFunction fun(cx, JS_ValueToFunction(cx, v)); if (!fun) return nullptr; // Unwrap bound functions. while (fun->isBoundFunction()) { JSObject* target = fun->getBoundFunctionTarget(); if (target && target->is<JSFunction>()) @@ -2133,18 +2152,18 @@ BlockNotes(JSContext* cx, HandleScript s else Sprint(sp, "%8u ", note->parent); Sprint(sp, "%8u %8u\n", note->start, note->start + note->length); } return true; } static bool -DisassembleScript(JSContext* cx, HandleScript script, HandleFunction fun, bool lines, - bool recursive, Sprinter* sp) +DisassembleScript(JSContext* cx, HandleScript script, HandleFunction fun, + bool lines, bool recursive, bool sourceNotes, Sprinter* sp) { if (fun) { Sprint(sp, "flags:"); if (fun->isLambda()) Sprint(sp, " LAMBDA"); if (fun->needsCallObject()) Sprint(sp, " NEEDS_CALLOBJECT"); if (fun->isConstructor()) @@ -2157,62 +2176,68 @@ DisassembleScript(JSContext* cx, HandleS Sprint(sp, " SELF_HOSTED"); if (fun->isArrow()) Sprint(sp, " ARROW"); Sprint(sp, "\n"); } if (!Disassemble(cx, script, lines, sp)) return false; - SrcNotes(cx, script, sp); + if (sourceNotes) + SrcNotes(cx, script, sp); TryNotes(cx, script, sp); BlockNotes(cx, script, sp); if (recursive && script->hasObjects()) { ObjectArray* objects = script->objects(); for (unsigned i = 0; i != objects->length; ++i) { JSObject* obj = objects->vector[i]; if (obj->is<JSFunction>()) { Sprint(sp, "\n"); RootedFunction fun(cx, &obj->as<JSFunction>()); if (fun->isInterpreted()) { RootedScript script(cx, fun->getOrCreateScript(cx)); - if (!script || !DisassembleScript(cx, script, fun, lines, recursive, sp)) - return false; + if (script) { + if (!DisassembleScript(cx, script, fun, lines, recursive, sourceNotes, sp)) + return false; + } } else { Sprint(sp, "[native code]\n"); } } } } return true; } namespace { struct DisassembleOptionParser { - unsigned argc; - Value* argv; - bool lines; - bool recursive; + unsigned argc; + Value* argv; + bool lines; + bool recursive; + bool sourceNotes; DisassembleOptionParser(unsigned argc, Value* argv) - : argc(argc), argv(argv), lines(false), recursive(false) {} + : argc(argc), argv(argv), lines(false), recursive(false), sourceNotes(true) {} bool parse(JSContext* cx) { /* Read options off early arguments */ while (argc > 0 && argv[0].isString()) { JSString* str = argv[0].toString(); JSFlatString* flatStr = JS_FlattenString(cx, str); if (!flatStr) return false; if (JS_FlatStringEqualsAscii(flatStr, "-l")) lines = true; else if (JS_FlatStringEqualsAscii(flatStr, "-r")) recursive = true; + else if (JS_FlatStringEqualsAscii(flatStr, "-S")) + sourceNotes = false; else break; argv++, argc--; } return true; } }; @@ -2243,17 +2268,17 @@ DisassembleToSprinter(JSContext* cx, uns RootedScript script(cx); RootedValue value(cx, p.argv[i]); if (value.isObject() && value.toObject().is<ModuleObject>()) script = value.toObject().as<ModuleObject>().script(); else script = ValueToScript(cx, value, fun.address()); if (!script) return false; - if (!DisassembleScript(cx, script, fun, p.lines, p.recursive, sprinter)) + if (!DisassembleScript(cx, script, fun, p.lines, p.recursive, p.sourceNotes, sprinter)) return false; } } return !sprinter->hadOutOfMemory(); } static bool @@ -2322,17 +2347,17 @@ DisassFile(JSContext* cx, unsigned argc, if (!JS::Compile(cx, options, filename.ptr(), &script)) return false; } Sprinter sprinter(cx); if (!sprinter.init()) return false; - bool ok = DisassembleScript(cx, script, nullptr, p.lines, p.recursive, &sprinter); + bool ok = DisassembleScript(cx, script, nullptr, p.lines, p.recursive, p.sourceNotes, &sprinter); if (ok) fprintf(stdout, "%s\n", sprinter.string()); if (!ok) return false; args.rval().setUndefined(); return true; } @@ -4833,32 +4858,33 @@ static const JSFunctionSpecWithHelp shel " Stop accounting time to mutator vs GC and dump the results."), JS_FN_HELP("throwError", ThrowError, 0, 0, "throwError()", " Throw an error from JS_ReportError."), #ifdef DEBUG JS_FN_HELP("disassemble", DisassembleToString, 1, 0, -"disassemble([fun])", -" Return the disassembly for the given function."), +"disassemble([fun/code])", +" Return the disassembly for the given function or code.\n" +" All disassembly functions take these options as leading string arguments:\n" +" \"-r\" (disassemble recursively)\n" +" \"-l\" (show line numbers)\n" +" \"-S\" (omit source notes)"), JS_FN_HELP("dis", Disassemble, 1, 0, -"dis([fun])", +"dis([fun/code])", " Disassemble functions into bytecodes."), JS_FN_HELP("disfile", DisassFile, 1, 0, "disfile('foo.js')", -" Disassemble script file into bytecodes.\n" -" dis and disfile take these options as preceeding string arguments:\n" -" \"-r\" (disassemble recursively)\n" -" \"-l\" (show line numbers)"), +" Disassemble script file into bytecodes.\n"), JS_FN_HELP("dissrc", DisassWithSrc, 1, 0, -"dissrc([fun])", +"dissrc([fun/code])", " Disassemble functions with source lines."), JS_FN_HELP("notes", Notes, 1, 0, "notes([fun])", " Show source notes for functions."), JS_FN_HELP("stackDump", StackDump, 3, 0, "stackDump(showArgs, showLocals, showThisProps)",