SET_STR(&ss->sprinter, rval);
DecompileSwitch(SprintStack *ss, TableEntry *table, uintN tableLength,		jsbytecode *pc, ptrdiff_t switchLength,		ptrdiff_t defaultOffset, JSBool isCondSwitch){    JSContext *cx;    JSPrinter *jp;    char *lval, *rval;    uintN i;    ptrdiff_t diff, off, off2, caseExprOff;    jsval key;    JSString *str;    cx = ss->sprinter.context;    jp = ss->printer;    lval = OFF2STR(&ss->sprinter, PopOff(ss, JSOP_NOP));    js_printf(jp, "\tswitch (%s) {\n", lval);    if (tableLength) {	diff = table[0].offset - defaultOffset;	if (diff > 0) {	    jp->indent += 2;	    js_printf(jp, "\tdefault:\n");	    jp->indent += 2;	    if (!Decompile(ss, pc + defaultOffset, diff))		return JS_FALSE;	    jp->indent -= 4;	}	caseExprOff = isCondSwitch                      ? (ptrdiff_t) js_CodeSpec[JSOP_CONDSWITCH].length                      : 0;	for (i = 0; i < tableLength; i++) {	    off = table[i].offset;	    if (i + 1 < tableLength)		off2 = table[i + 1].offset;	    else		off2 = switchLength;	    key = table[i].key;	    if (isCondSwitch) {		ptrdiff_t nextCaseExprOff;		/*		 * key encodes the JSOP_CASE bytecode's offset from switchtop.		 * The next case expression follows immediately, unless we are		 * at the last case.		 */		nextCaseExprOff = (ptrdiff_t)JSVAL_TO_INT(key);                nextCaseExprOff += js_CodeSpec[pc[nextCaseExprOff]].length;		jp->indent += 2;		if (!Decompile(ss, pc + caseExprOff,			       nextCaseExprOff - caseExprOff)) {		    return JS_FALSE;		}		caseExprOff = nextCaseExprOff;	   } else {		/*		 * key comes from an atom, not the decompiler, so we need to		 * quote it if it's a string literal.		 */		str = js_ValueToString(cx, key);		if (!str)		    return JS_FALSE;		jp->indent += 2;		if (JSVAL_IS_STRING(key)) {		    rval = QuoteString(&ss->sprinter, str, (jschar)'"');		    if (!rval)			return JS_FALSE;		} else {		    rval = JS_GetStringBytes(str);		}		js_printf(jp, "\tcase %s:\n", rval);	    }	    jp->indent += 2;	    if (off <= defaultOffset && defaultOffset < off2) {		diff = defaultOffset - off;		if (diff != 0) {		    if (!Decompile(ss, pc + off, diff))			return JS_FALSE;		    off = defaultOffset;		}		jp->indent -= 2;		js_printf(jp, "\tdefault:\n");		jp->indent += 2;	    }	    if (!Decompile(ss, pc + off, off2 - off))		return JS_FALSE;	    jp->indent -= 4;	}    }    if (defaultOffset == switchLength) {	jp->indent += 2;	js_printf(jp, "\tdefault:\n");	jp->indent -= 2;    }    js_printf(jp, "\t}\n");    return JS_TRUE;}