Package: release.debian.org Severity: normal User: release.debian....@packages.debian.org Usertags: unblock
Please unblock package mozjs mozjs is currently non-functional on ia64, which in turn e.g. breaks gnome-shell on that architecture. Stephan Schreiber has been debugging this issue and provided two patches which seemingly fix those issues. I was able to build mozjs on merulo and successfully run the js command line interpreter, which simply segfaulted before without those patches. We also have a confirmation from the original bug reporter that he could successfully run gnome-shell on ia64. I was actually suprised we had users running gnome-shell on ia64 :-) The patches have been reviewed by Chris Coulson. Full debdiff is attached. Cheers, Michael unblock mozjs/1.8.5-1.0.0+dfsg-4 -- System Information: Debian Release: wheezy/sid APT prefers unstable APT policy: (500, 'unstable'), (200, 'experimental') Architecture: amd64 (x86_64) Foreign Architectures: i386 Kernel: Linux 3.2.0-4-amd64 (SMP w/4 CPU cores) Locale: LANG=de_DE.utf8, LC_CTYPE=de_DE.utf8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/dash
diff -Nru mozjs-1.8.5-1.0.0+dfsg/debian/changelog mozjs-1.8.5-1.0.0+dfsg/debian/changelog --- mozjs-1.8.5-1.0.0+dfsg/debian/changelog 2012-07-25 15:50:09.000000000 +0200 +++ mozjs-1.8.5-1.0.0+dfsg/debian/changelog 2012-10-25 21:51:10.000000000 +0200 @@ -1,11 +1,20 @@ -mozjs (1.8.5-1.0.0+dfsg-3.1) unstable; urgency=low +mozjs (1.8.5-1.0.0+dfsg-4) unstable; urgency=low - * Non-maintainer upload. + [ Stephan Schreiber ] + * Fix MapPages() to work on ia64 + - add debian/patches/fix-map-pages-on-ia64.patch + - update debian/patches/series + * Disable JS static strings on ia64 + - add debian/patches/disable-static-strings-on-ia64.patch + - update debian/patches/series + * Closes: #659186 + + [ gregor herrmann ] * Fix "libmozjs185-dev depends on libffi-dev": add libffi-dev to Depends in libmozjs185-dev binary package. Thanks Nicolas Boulenguez. (Closes: #678859) - -- gregor herrmann <gre...@debian.org> Wed, 25 Jul 2012 15:48:48 +0200 + -- Chris Coulson <chrisccoul...@ubuntu.com> Thu, 25 Oct 2012 20:10:45 +0100 mozjs (1.8.5-1.0.0+dfsg-3) unstable; urgency=low diff -Nru mozjs-1.8.5-1.0.0+dfsg/debian/patches/disable-static-strings-on-ia64.patch mozjs-1.8.5-1.0.0+dfsg/debian/patches/disable-static-strings-on-ia64.patch --- mozjs-1.8.5-1.0.0+dfsg/debian/patches/disable-static-strings-on-ia64.patch 1970-01-01 01:00:00.000000000 +0100 +++ mozjs-1.8.5-1.0.0+dfsg/debian/patches/disable-static-strings-on-ia64.patch 2012-10-25 21:51:11.000000000 +0200 @@ -0,0 +1,603 @@ +From: Stephan Schreiber <i...@fs-driver.org> +Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=659186 +Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=589735 +Description: Turn off JS static strings on ia64 + +diff -rp -u8 mozjs-old2/js/src/jsatom.cpp mozjs-1.8.5-1.0.0+dfsg/js/src/jsatom.cpp +--- mozjs-old2/js/src/jsatom.cpp 2012-10-05 19:03:00.000000000 +0200 ++++ mozjs-1.8.5-1.0.0+dfsg/js/src/jsatom.cpp 2012-10-05 19:17:27.000000000 +0200 +@@ -598,21 +598,23 @@ js_AtomizeChars(JSContext *cx, const jsc + } + + JSAtom * + js_GetExistingStringAtom(JSContext *cx, const jschar *chars, size_t length) + { + JSString str, *str2; + JSAtomState *state; + ++#ifdef JS_HAS_STATIC_STRINGS + if (length == 1) { + jschar c = *chars; + if (c < UNIT_STRING_LIMIT) + return STRING_TO_ATOM(JSString::unitString(c)); + } ++#endif + + str.initFlatNotTerminated((jschar *)chars, length); + state = &cx->runtime->atomState; + + JS_LOCK(cx, &state->lock); + AtomSet::Ptr p = state->atoms.lookup(str.assertIsFlat()); + str2 = p ? AtomEntryToKey(*p) : NULL; + JS_UNLOCK(cx, &state->lock); +diff -rp -u8 mozjs-old2/js/src/jsiter.cpp mozjs-1.8.5-1.0.0+dfsg/js/src/jsiter.cpp +--- mozjs-old2/js/src/jsiter.cpp 2012-10-05 19:03:00.000000000 +0200 ++++ mozjs-1.8.5-1.0.0+dfsg/js/src/jsiter.cpp 2012-10-05 19:24:40.000000000 +0200 +@@ -997,19 +997,22 @@ js_IteratorNext(JSContext *cx, JSObject + *rval = IdToValue(*ni->current()); + ni->incCursor(); + + if (rval->isString()) + return true; + + JSString *str; + jsint i; ++#ifdef JS_HAS_STATIC_STRINGS + if (rval->isInt32() && (jsuint(i = rval->toInt32()) < INT_STRING_LIMIT)) { + str = JSString::intString(i); +- } else { ++ } else ++#endif ++ { + str = js_ValueToString(cx, *rval); + if (!str) + return false; + } + + rval->setString(str); + return true; + } +diff -rp -u8 mozjs-old2/js/src/jsnum.cpp mozjs-1.8.5-1.0.0+dfsg/js/src/jsnum.cpp +--- mozjs-old2/js/src/jsnum.cpp 2012-10-05 19:03:00.000000000 +0200 ++++ mozjs-1.8.5-1.0.0+dfsg/js/src/jsnum.cpp 2012-10-05 19:29:19.000000000 +0200 +@@ -600,18 +600,20 @@ ToCStringBuf::~ToCStringBuf() + js_free(dbuf); + } + + JSString * JS_FASTCALL + js_IntToString(JSContext *cx, int32 si) + { + uint32 ui; + if (si >= 0) { ++#ifdef JS_HAS_STATIC_STRINGS + if (si < INT_STRING_LIMIT) + return JSString::intString(si); ++#endif + ui = si; + } else { + ui = uint32(-si); + JS_ASSERT_IF(si == INT32_MIN, ui == uint32(INT32_MAX) + 1); + } + + JSCompartment *c = cx->compartment; + if (JSString *str = c->dtoaCache.lookup(10, si)) +@@ -1164,23 +1166,25 @@ js_NumberToStringWithBase(JSContext *cx, + */ + if (base < 2 || base > 36) + return NULL; + + JSCompartment *c = cx->compartment; + + int32_t i; + if (JSDOUBLE_IS_INT32(d, &i)) { ++#ifdef JS_HAS_STATIC_STRINGS + if (base == 10 && jsuint(i) < INT_STRING_LIMIT) + return JSString::intString(i); + if (jsuint(i) < jsuint(base)) { + if (i < 10) + return JSString::intString(i); + return JSString::unitString(jschar('a' + i - 10)); + } ++#endif + + if (JSString *str = c->dtoaCache.lookup(base, d)) + return str; + + numStr = IntToCString(&cbuf, i, base); + JS_ASSERT(!cbuf.dbuf && numStr >= cbuf.sbuf && numStr < cbuf.sbuf + cbuf.sbufSize); + } else { + if (JSString *str = c->dtoaCache.lookup(base, d)) +diff -rp -u8 mozjs-old2/js/src/jsstr.cpp mozjs-1.8.5-1.0.0+dfsg/js/src/jsstr.cpp +--- mozjs-old2/js/src/jsstr.cpp 2012-10-05 19:03:00.000000000 +0200 ++++ mozjs-1.8.5-1.0.0+dfsg/js/src/jsstr.cpp 2012-10-18 16:27:04.000000000 +0200 +@@ -3116,16 +3116,18 @@ static JSFunctionSpec string_methods[] = + JS_FN("blink", str_blink, 0,0), + JS_FN("sup", str_sup, 0,0), + JS_FN("sub", str_sub, 0,0), + #endif + + JS_FS_END + }; + ++#ifdef JS_HAS_STATIC_STRINGS ++ + /* + * Set up some tools to make it easier to generate large tables. After constant + * folding, for each n, Rn(0) is the comma-separated list R(0), R(1), ..., R(2^n-1). + * Similary, Rn(k) (for any k and n) generates the list R(k), R(k+1), ..., R(k+2^n-1). + * To use this, define R appropriately, then use Rn(0) (for some value of n), then + * undefine R. + */ + #define R2(n) R(n), R((n) + (1 << 0)), R((n) + (2 << 0)), R((n) + (3 << 0)) +@@ -3286,16 +3288,18 @@ const JSString *const JSString::intStrin + #undef R6 + #undef R8 + #undef R10 + #undef R12 + + #undef R3 + #undef R7 + ++#endif /* defined(JS_HAS_STATIC_STRINGS) */ ++ + JSBool + js_String(JSContext *cx, uintN argc, Value *vp) + { + Value *argv = vp + 2; + + JSString *str; + if (argc > 0) { + str = js_ValueToString(cx, argv[0]); +@@ -3326,23 +3330,25 @@ str_fromCharCode(JSContext *cx, uintN ar + JSString *str; + + argv = vp + 2; + JS_ASSERT(argc <= JS_ARGS_LENGTH_MAX); + if (argc == 1) { + uint16_t code; + if (!ValueToUint16(cx, argv[0], &code)) + return JS_FALSE; ++#ifdef JS_HAS_STATIC_STRINGS + if (code < UNIT_STRING_LIMIT) { + str = JSString::unitString(code); + if (!str) + return JS_FALSE; + vp->setString(str); + return JS_TRUE; + } ++#endif + argv[0].setInt32(code); + } + chars = (jschar *) cx->malloc((argc + 1) * sizeof(jschar)); + if (!chars) + return JS_FALSE; + for (i = 0; i < argc; i++) { + uint16_t code; + if (!ValueToUint16(cx, argv[i], &code)) { +@@ -3362,18 +3368,20 @@ str_fromCharCode(JSContext *cx, uintN ar + } + + #ifdef JS_TRACER + static JSString* FASTCALL + String_fromCharCode(JSContext* cx, int32 i) + { + JS_ASSERT(JS_ON_TRACE(cx)); + jschar c = (jschar)i; ++#ifdef JS_HAS_STATIC_STRINGS + if (c < UNIT_STRING_LIMIT) + return JSString::unitString(c); ++#endif + return js_NewStringCopyN(cx, &c, 1); + } + #endif + + JS_DEFINE_TRCINFO_1(str_fromCharCode, + (2, (static, STRING_RETRY, String_fromCharCode, CONTEXT, INT32, 1, nanojit::ACCSET_NONE))) + + static JSFunctionSpec string_static_methods[] = { +diff -rp -u8 mozjs-old2/js/src/jsstr.h mozjs-1.8.5-1.0.0+dfsg/js/src/jsstr.h +--- mozjs-old2/js/src/jsstr.h 2012-10-05 19:03:00.000000000 +0200 ++++ mozjs-1.8.5-1.0.0+dfsg/js/src/jsstr.h 2012-10-19 20:45:45.000000000 +0200 +@@ -52,23 +52,33 @@ + #include "jsapi.h" + #include "jsprvtd.h" + #include "jshashtable.h" + #include "jslock.h" + #include "jsobj.h" + #include "jsvalue.h" + #include "jscell.h" + ++#if !defined(__ia64__) ++/* ++ * Don't use static strings on ia64 since the compiler may put the static ++ * memory out of the acceptable 47-bit jsval pointer range. ++ */ ++# define JS_HAS_STATIC_STRINGS ++#endif ++ ++#ifdef JS_HAS_STATIC_STRINGS + enum { + UNIT_STRING_LIMIT = 256U, + SMALL_CHAR_LIMIT = 128U, /* Bigger chars cannot be in a length-2 string. */ + NUM_SMALL_CHARS = 64U, + INT_STRING_LIMIT = 256U, + NUM_HUNDRED_STRINGS = 156U + }; ++#endif + + extern jschar * + js_GetDependentStringChars(JSString *str); + + extern JSString * JS_FASTCALL + js_ConcatStrings(JSContext *cx, JSString *left, JSString *right); + + JS_STATIC_ASSERT(JS_BITS_PER_WORD >= 32); +@@ -375,72 +385,90 @@ struct JSString + JSLinearString *assertIsLinear() { + JS_ASSERT(isLinear()); + return reinterpret_cast<JSLinearString *>(this); + } + + typedef uint8 SmallChar; + + static inline bool fitsInSmallChar(jschar c) { ++#ifdef JS_HAS_STATIC_STRINGS + return c < SMALL_CHAR_LIMIT && toSmallChar[c] != INVALID_SMALL_CHAR; ++#else ++ return false; ++#endif + } + + static inline bool isUnitString(void *ptr) { ++#ifdef JS_HAS_STATIC_STRINGS + jsuword delta = reinterpret_cast<jsuword>(ptr) - + reinterpret_cast<jsuword>(unitStringTable); + if (delta >= UNIT_STRING_LIMIT * sizeof(JSString)) + return false; + + /* If ptr points inside the static array, it must be well-aligned. */ + JS_ASSERT(delta % sizeof(JSString) == 0); + return true; ++#else ++ return false; ++#endif + } + + static inline bool isLength2String(void *ptr) { ++#ifdef JS_HAS_STATIC_STRINGS + jsuword delta = reinterpret_cast<jsuword>(ptr) - + reinterpret_cast<jsuword>(length2StringTable); + if (delta >= NUM_SMALL_CHARS * NUM_SMALL_CHARS * sizeof(JSString)) + return false; + + /* If ptr points inside the static array, it must be well-aligned. */ + JS_ASSERT(delta % sizeof(JSString) == 0); + return true; ++#else ++ return false; ++#endif + } + + static inline bool isHundredString(void *ptr) { ++#ifdef JS_HAS_STATIC_STRINGS + jsuword delta = reinterpret_cast<jsuword>(ptr) - + reinterpret_cast<jsuword>(hundredStringTable); + if (delta >= NUM_HUNDRED_STRINGS * sizeof(JSString)) + return false; + + /* If ptr points inside the static array, it must be well-aligned. */ + JS_ASSERT(delta % sizeof(JSString) == 0); + return true; ++#else ++ return false; ++#endif + } + + static inline bool isStatic(void *ptr) { + return isUnitString(ptr) || isLength2String(ptr) || isHundredString(ptr); + } + + #ifdef __SUNPRO_CC + #pragma align 8 (__1cIJSStringPunitStringTable_, __1cIJSStringSlength2StringTable_, __1cIJSStringShundredStringTable_) + #endif + ++#ifdef JS_HAS_STATIC_STRINGS + static const SmallChar INVALID_SMALL_CHAR = -1; + + static const jschar fromSmallChar[]; + static const SmallChar toSmallChar[]; + static const JSString unitStringTable[]; + static const JSString length2StringTable[]; + static const JSString hundredStringTable[]; + /* + * Since int strings can be unit strings, length-2 strings, or hundred + * strings, we keep a table to map from integer to the correct string. + */ + static const JSString *const intStringTable[]; ++#endif + + static JSFlatString *unitString(jschar c); + static JSLinearString *getUnitString(JSContext *cx, JSString *str, size_t index); + static JSFlatString *length2String(jschar c1, jschar c2); + static JSFlatString *length2String(uint32 i); + static JSFlatString *intString(jsint i); + + static JSFlatString *lookupStaticString(const jschar *chars, size_t length); +diff -rp -u8 mozjs-old2/js/src/jsstrinlines.h mozjs-1.8.5-1.0.0+dfsg/js/src/jsstrinlines.h +--- mozjs-old2/js/src/jsstrinlines.h 2012-10-05 19:03:00.000000000 +0200 ++++ mozjs-1.8.5-1.0.0+dfsg/js/src/jsstrinlines.h 2012-10-18 16:27:27.000000000 +0200 +@@ -210,62 +210,85 @@ StringBuffer::checkLength(size_t length) + return CheckStringLength(context(), length); + } + + } /* namespace js */ + + inline JSFlatString * + JSString::unitString(jschar c) + { ++#ifdef JS_HAS_STATIC_STRINGS + JS_ASSERT(c < UNIT_STRING_LIMIT); + return const_cast<JSString *>(&unitStringTable[c])->assertIsFlat(); ++#else ++ JS_NOT_REACHED("no static strings"); ++ return NULL; ++#endif + } + + inline JSLinearString * + JSString::getUnitString(JSContext *cx, JSString *str, size_t index) + { + JS_ASSERT(index < str->length()); ++#ifdef JS_HAS_STATIC_STRINGS + const jschar *chars = str->getChars(cx); + if (!chars) + return NULL; + jschar c = chars[index]; + if (c < UNIT_STRING_LIMIT) + return unitString(c); ++#endif + return js_NewDependentString(cx, str, index, 1); + } + + inline JSFlatString * + JSString::length2String(jschar c1, jschar c2) + { ++#ifdef JS_HAS_STATIC_STRINGS + JS_ASSERT(fitsInSmallChar(c1)); + JS_ASSERT(fitsInSmallChar(c2)); + return const_cast<JSString *> ( + &length2StringTable[(((size_t)toSmallChar[c1]) << 6) + toSmallChar[c2]] + )->assertIsFlat(); ++#else ++ JS_NOT_REACHED("no static strings"); ++ return NULL; ++#endif + } + + inline JSFlatString * + JSString::length2String(uint32 i) + { ++#ifdef JS_HAS_STATIC_STRINGS + JS_ASSERT(i < 100); + return length2String('0' + i / 10, '0' + i % 10); ++#else ++ JS_NOT_REACHED("no static strings"); ++ return NULL; ++#endif + } + + inline JSFlatString * + JSString::intString(jsint i) + { ++#ifdef JS_HAS_STATIC_STRINGS + jsuint u = jsuint(i); + JS_ASSERT(u < INT_STRING_LIMIT); + return const_cast<JSString *>(JSString::intStringTable[u])->assertIsFlat(); ++#else ++ JS_NOT_REACHED("no static strings"); ++ return NULL; ++#endif + } + + /* Get a static atomized string for chars if possible. */ + inline JSFlatString * + JSString::lookupStaticString(const jschar *chars, size_t length) + { ++#ifdef JS_HAS_STATIC_STRINGS + if (length == 1) { + if (chars[0] < UNIT_STRING_LIMIT) + return unitString(chars[0]); + } + + if (length == 2) { + if (fitsInSmallChar(chars[0]) && fitsInSmallChar(chars[1])) + return length2String(chars[0], chars[1]); +@@ -285,16 +308,17 @@ JSString::lookupStaticString(const jscha + jsint i = (chars[0] - '0') * 100 + + (chars[1] - '0') * 10 + + (chars[2] - '0'); + + if (jsuint(i) < INT_STRING_LIMIT) + return intString(i); + } + } ++#endif + + return NULL; + } + + inline void + JSString::finalize(JSContext *cx) { + JS_ASSERT(!JSString::isStatic(this)); + JS_RUNTIME_UNMETER(cx->runtime, liveStrings); +diff -rp -u8 mozjs-old2/js/src/jstracer.cpp mozjs-1.8.5-1.0.0+dfsg/js/src/jstracer.cpp +--- mozjs-old2/js/src/jstracer.cpp 2012-10-05 19:03:00.000000000 +0200 ++++ mozjs-1.8.5-1.0.0+dfsg/js/src/jstracer.cpp 2012-10-19 20:47:46.000000000 +0200 +@@ -11500,30 +11500,33 @@ TraceRecorder::callNative(uintN argc, JS + LIns* abs_ins = w.name(w.cmovi(isNeg_ins, neg_ins, a), "abs"); + set(&vp[0], w.i2d(abs_ins)); + pendingSpecializedNative = IGNORE_NATIVE_CALL_COMPLETE_CALLBACK; + return RECORD_CONTINUE; + } + } + if (vp[1].isString()) { + JSString *str = vp[1].toString(); ++#ifdef JS_HAS_STATIC_STRINGS + if (native == js_str_charAt) { + jsdouble i = vp[2].toNumber(); + if (JSDOUBLE_IS_NaN(i)) + i = 0; + if (i < 0 || i >= str->length()) + RETURN_STOP("charAt out of bounds"); + LIns* str_ins = get(&vp[1]); + LIns* idx_ins = get(&vp[2]); + LIns* char_ins; + CHECK_STATUS(getCharAt(str, str_ins, idx_ins, mode, &char_ins)); + set(&vp[0], char_ins); + pendingSpecializedNative = IGNORE_NATIVE_CALL_COMPLETE_CALLBACK; + return RECORD_CONTINUE; +- } else if (native == js_str_charCodeAt) { ++ } else ++#endif ++ if (native == js_str_charCodeAt) { + jsdouble i = vp[2].toNumber(); + if (JSDOUBLE_IS_NaN(i)) + i = 0; + if (i < 0 || i >= str->length()) + RETURN_STOP("charCodeAt out of bounds"); + LIns* str_ins = get(&vp[1]); + LIns* idx_ins = get(&vp[2]); + LIns* charCode_ins; +@@ -12962,16 +12965,17 @@ TraceRecorder::getCharCodeAt(JSString *s + snapshot(MISMATCH_EXIT)); + *out = w.i2d(w.getStringChar(str_ins, idx_ins)); + return RECORD_CONTINUE; + } + + JS_STATIC_ASSERT(sizeof(JSString) == 16 || sizeof(JSString) == 32); + + ++#ifdef JS_HAS_STATIC_STRINGS + JS_REQUIRES_STACK LIns* + TraceRecorder::getUnitString(LIns* str_ins, LIns* idx_ins) + { + LIns *ch_ins = w.getStringChar(str_ins, idx_ins); + guard(true, w.ltuiN(ch_ins, UNIT_STRING_LIMIT), MISMATCH_EXIT); + return w.addp(w.nameImmpNonGC(JSString::unitStringTable), + w.lshpN(w.ui2p(ch_ins), (sizeof(JSString) == 16) ? 4 : 5)); + } +@@ -13005,16 +13009,17 @@ TraceRecorder::getCharAt(JSString *str, + LIns *unitstr_ins = getUnitString(str_ins, idx_ins); + w.stAlloc(unitstr_ins, phi_ins); + w.label(mbr); + } + *out = w.ldpAlloc(phi_ins); + } + return RECORD_CONTINUE; + } ++#endif + + // Typed array tracing depends on EXPANDED_LOADSTORE and F2I + #if NJ_EXPANDED_LOADSTORE_SUPPORTED && NJ_F2I_SUPPORTED + static bool OkToTraceTypedArrays = true; + #else + static bool OkToTraceTypedArrays = false; + #endif + +@@ -13039,28 +13044,30 @@ TraceRecorder::record_JSOP_GETELEM() + bool call = *cx->regs->pc == JSOP_CALLELEM; + + Value& idx = stackval(-1); + Value& lval = stackval(-2); + + LIns* obj_ins = get(&lval); + LIns* idx_ins = get(&idx); + ++#ifdef JS_HAS_STATIC_STRINGS + // Special case for array-like access of strings. + if (lval.isString() && hasInt32Repr(idx)) { + if (call) + RETURN_STOP_A("JSOP_CALLELEM on a string"); + int i = asInt32(idx); + if (size_t(i) >= lval.toString()->length()) + RETURN_STOP_A("Invalid string index in JSOP_GETELEM"); + LIns* char_ins; + CHECK_STATUS_A(getCharAt(lval.toString(), obj_ins, idx_ins, JSOP_GETELEM, &char_ins)); + set(&lval, char_ins); + return ARECORD_CONTINUE; + } ++#endif + + if (lval.isPrimitive()) + RETURN_STOP_A("JSOP_GETLEM on a primitive"); + RETURN_IF_XML_A(lval); + + JSObject* obj = &lval.toObject(); + if (obj == globalObj) + RETURN_STOP_A("JSOP_GETELEM on global"); +diff -rp -u8 mozjs-old2/js/src/jstracer.h mozjs-1.8.5-1.0.0+dfsg/js/src/jstracer.h +--- mozjs-old2/js/src/jstracer.h 2012-10-05 19:03:00.000000000 +0200 ++++ mozjs-1.8.5-1.0.0+dfsg/js/src/jstracer.h 2012-10-05 19:08:15.000000000 +0200 +@@ -1389,20 +1389,22 @@ class TraceRecorder + Value* outp); + JS_REQUIRES_STACK RecordingStatus getPropertyWithScriptGetter(JSObject *obj, + nanojit::LIns* obj_ins, + const js::Shape* shape); + + JS_REQUIRES_STACK RecordingStatus getCharCodeAt(JSString *str, + nanojit::LIns* str_ins, nanojit::LIns* idx_ins, + nanojit::LIns** out_ins); ++#ifdef JS_HAS_STATIC_STRINGS + JS_REQUIRES_STACK nanojit::LIns* getUnitString(nanojit::LIns* str_ins, nanojit::LIns* idx_ins); + JS_REQUIRES_STACK RecordingStatus getCharAt(JSString *str, + nanojit::LIns* str_ins, nanojit::LIns* idx_ins, + JSOp mode, nanojit::LIns** out_ins); ++#endif + + JS_REQUIRES_STACK RecordingStatus initOrSetPropertyByName(nanojit::LIns* obj_ins, + Value* idvalp, Value* rvalp, + bool init); + JS_REQUIRES_STACK RecordingStatus initOrSetPropertyByIndex(nanojit::LIns* obj_ins, + nanojit::LIns* index_ins, + Value* rvalp, bool init); + JS_REQUIRES_STACK AbortableRecordingStatus setElem(int lval_spindex, int idx_spindex, +diff -rp -u8 mozjs-old2/js/src/tracejit/Writer.cpp mozjs-1.8.5-1.0.0+dfsg/js/src/tracejit/Writer.cpp +--- mozjs-old2/js/src/tracejit/Writer.cpp 2012-10-05 19:03:00.000000000 +0200 ++++ mozjs-1.8.5-1.0.0+dfsg/js/src/tracejit/Writer.cpp 2012-10-05 19:08:55.000000000 +0200 +@@ -241,28 +241,31 @@ couldBeObjectOrString(LIns *ins) + ins->oprnd2()->isImmQ() && + uintptr_t(ins->oprnd2()->immQ()) == JSVAL_PAYLOAD_MASK) + { + // ins_oprnd1 = ldq ... + // ins_oprnd2 = immq JSVAL_PAYLOAD_MASK + // ins = andq ins_oprnd1, ins_oprnd2 + ret = true; + #endif +- } else if (ins->isop(LIR_addp) && ++ } ++#ifdef JS_HAS_STATIC_STRINGS ++ else if (ins->isop(LIR_addp) && + ((ins->oprnd1()->isImmP() && + (void *)ins->oprnd1()->immP() == JSString::unitStringTable) || + (ins->oprnd2()->isImmP() && + (void *)ins->oprnd2()->immP() == JSString::unitStringTable))) + { + // (String only) + // ins = addp ..., JSString::unitStringTable + // OR + // ins = addp JSString::unitStringTable, ... + ret = true; + } ++#endif + + return ret; + } + + static bool + isConstPrivatePtr(LIns *ins, unsigned slot) + { + #if JS_BITS_PER_WORD == 32 + + +Signed-off-by: Stephan Schreiber <i...@fs-driver.org> +Based on a work of Luke Wagner <l...@mozilla.com> diff -Nru mozjs-1.8.5-1.0.0+dfsg/debian/patches/fix-map-pages-on-ia64.patch mozjs-1.8.5-1.0.0+dfsg/debian/patches/fix-map-pages-on-ia64.patch --- mozjs-1.8.5-1.0.0+dfsg/debian/patches/fix-map-pages-on-ia64.patch 1970-01-01 01:00:00.000000000 +0100 +++ mozjs-1.8.5-1.0.0+dfsg/debian/patches/fix-map-pages-on-ia64.patch 2012-10-25 21:51:11.000000000 +0200 @@ -0,0 +1,76 @@ +From: Stephan Schreiber <i...@fs-driver.org> +Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=659186 +Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=589735 +Description: Fix MapPages() on ia64 + +diff -rp -u10 mozjs-old1/js/src/jsgcchunk.cpp mozjs-old2/js/src/jsgcchunk.cpp +--- mozjs-old1/js/src/jsgcchunk.cpp 2012-10-05 18:53:40.000000000 +0200 ++++ mozjs-old2/js/src/jsgcchunk.cpp 2012-10-19 20:39:14.000000000 +0200 +@@ -311,29 +311,62 @@ MapAlignedPages(size_t size, size_t alig + if (p == MAP_FAILED) + return NULL; + return p; + } + + # else /* JS_GC_HAS_MAP_ALIGN */ + + static void * + MapPages(void *addr, size_t size) + { ++#if defined(__ia64__) ++ /* ++ * The JS engine assumes that all allocated pointers have their high 17 bits clear, ++ * which ia64's mmap doesn't support directly. However, we can emulate it by passing ++ * mmap an "addr" parameter with those bits clear. The mmap will return that address, ++ * or the nearest available memory above that address, providing a near-guarantee ++ * that those bits are clear. If they are not, we return NULL below to indicate ++ * out-of-memory. ++ * ++ * The addr is chosen as 0x0000070000000000, which still allows about 120TB of virtual ++ * address space. ++ * ++ * See Bug 589735 for more information. ++ */ ++#endif ++ + /* + * We don't use MAP_FIXED here, because it can cause the *replacement* + * of existing mappings, and we only want to create new mappings. + */ ++#if defined(__ia64__) ++ void *p = mmap(addr ? addr : (void*)0x0000070000000000, ++ size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, ++ -1, 0); ++#else + void *p = mmap(addr, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, + -1, 0); ++#endif + if (p == MAP_FAILED) + return NULL; ++#if defined(__ia64__) ++ /* ++ * If the caller requested a specific memory location, verify that's what mmap returned. ++ * Otherwise: If the allocated memory doesn't have its upper 17 bits clear, consider it ++ * as out of memory. ++ */ ++ if (addr && p != addr ++ || !addr && ((long long)p & 0xffff800000000000)) { ++#else ++ /* If the caller requested a specific memory location, verify that's what mmap returned. */ + if (addr && p != addr) { ++#endif + /* We succeeded in mapping memory, but not in the right place. */ + JS_ALWAYS_TRUE(munmap(p, size) == 0); + return NULL; + } + return p; + } + + # endif /* !JS_GC_HAS_MAP_ALIGN */ + + static void + + +Signed-off-by: Stephan Schreiber <i...@fs-driver.org> +Based on a work of Jan Horak <jho...@redhat.com> + diff -Nru mozjs-1.8.5-1.0.0+dfsg/debian/patches/series mozjs-1.8.5-1.0.0+dfsg/debian/patches/series --- mozjs-1.8.5-1.0.0+dfsg/debian/patches/series 2012-01-25 00:11:56.000000000 +0100 +++ mozjs-1.8.5-1.0.0+dfsg/debian/patches/series 2012-10-25 21:51:11.000000000 +0200 @@ -5,4 +5,6 @@ Bug-589744-Fallback-to-perf-measurement-stub-when-pe.patch 64bit-big-endian.patch destdir.patch +fix-map-pages-on-ia64.patch +disable-static-strings-on-ia64.patch autoconf.patch