diff --git a/js/src/jsopcode.cpp b/js/src/jsopcode.cpp index be35b57f37..cfa47bda6f 100644 --- a/js/src/jsopcode.cpp +++ b/js/src/jsopcode.cpp @@ -1608,12 +1608,33 @@ ExpressionDecompiler::decompilePC(jsbytecode* pc) write("(...)"); case JSOP_NEWARRAY: return write("[]"); - case JSOP_REGEXP: - case JSOP_OBJECT: + case JSOP_REGEXP: { + RootedObject obj(cx, script->getRegExp(GET_UINT32_INDEX(pc))); + JSString* str = obj->as().toString(cx); + if (!str) + return false; + return write(str); + } case JSOP_NEWARRAY_COPYONWRITE: { - JSObject* obj = (op == JSOP_REGEXP) - ? script->getRegExp(GET_UINT32_INDEX(pc)) - : script->getObject(GET_UINT32_INDEX(pc)); + RootedObject obj(cx, script->getObject(GET_UINT32_INDEX(pc))); + Handle aobj = obj.as(); + if (!write("[")) + return false; + for (size_t i = 0; i < aobj->getDenseInitializedLength(); i++) { + if (i > 0 && !write(", ")) + return false; + + RootedValue v(cx, aobj->getDenseElement(i)); + MOZ_RELEASE_ASSERT(v.isPrimitive() && !v.isMagic()); + + JSString* str = ValueToSource(cx, v); + if (!str || !write(str)) + return false; + } + return write("]"); + } + case JSOP_OBJECT: { + JSObject* obj = script->getObject(GET_UINT32_INDEX(pc)); RootedValue objv(cx, ObjectValue(*obj)); JSString* str = ValueToSource(cx, objv); if (!str)