Closed Bug 229722 Opened 21 years ago Closed 20 years ago

64bit safe code for mozilla/content (WinXP AMD64)

Categories

(Core :: DOM: Core & HTML, enhancement)

x86
Windows XP
enhancement
Not set
normal

Tracking

()

RESOLVED FIXED

People

(Reporter: m_kato, Assigned: m_kato)

References

Details

Attachments

(1 file)

User-Agent:       Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.6b) Gecko/20031208
Build Identifier: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.6b) Gecko/20031208

Curretly code is defined as pointer type.

mozilla/content/base/public/nsIContent.h
...
  #endif

  protected:
    typedef long PtrBits;
    ^^^^^^^^^^^^^^^^^^^^^

     // Subclasses may use the low two bits of mParentPtrBits to store other data
     enum { kParentBitMask = 0x3 };
...

But WinXP 64bits for AMD64 is that "long" type is defined as 32 bits, so pointer
cast is always invalied.  So you should replace it with PRWord.  (PRWord is
pointer value).

Reproducible: Always

Steps to Reproduce:
not need.  This is porting issue
Actual Results:  
not need.  This is porting issue

Expected Results:  
not need.  This is porting issue
PRWord is currently typedef-ed to |long|, so I don't see how this will help.
In any case, this is jst/peterv stuff, not misc layout code.
Assignee: nobody → general
Component: Layout: Misc Code → DOM
QA Contact: core.layout.misc-code → ian
Perhaps PRWord should be typedeffed to long long as needed (a configure check)?
please see bug #226094 and bug #225859 about pointer structure of PR* and js*.
Depends on: 226094
http://landfill.mozilla.org/mxr-test/nspr/source/nsprpub/pr/include/prtypes.h#472
462 ** WARNING: The undocumented data types PRWord and PRUword are
463 ** only used in the garbage collection and arena code.  Do not
464 ** use PRWord and PRUword in new code.
465 **
466 ** A PRWord is an integer that is the same size as a void*.
467 ** It implements the notion of a "word" in the Java Virtual
468 ** Machine.  (See Sec. 3.4 "Words", The Java Virtual Machine
469 ** Specification, Addison-Wesley, September 1996.
470 ** http://java.sun.com/docs/books/vmspec/index.html.)
471 */
472 typedef long PRWord;
473 typedef unsigned long PRUword;
First, this bug should not depend on bug 226094.  Rather, all of this bug, that
bug, and bug 225859 should depend on a meta-bug about supporting LLP64
compilation targets (of which WinXP on AMD64 is the first to come to our attention).

Second, let's fix this right, once.  We should use PRWord (PRUword if signed
comparison or sign extension would do the wrong thing) consistently in our code,
through whatever local typedef names are appropriate.  But this requires
changing NSPR, and changing deprecated NSPR types, to boot.  Cc'ing Wan-Teh.

/be
So js/src/jstypes.h is an old, ad-hoc fork of prtypes.h, done to make JS stand
alone whether built into Mozilla or not.  Therefore we'd need autoconf tests for
two places: NSPR and JS.  On the plus side, the JSWord (jsword, using the older
scalar-typedef lowercase naming convention) type and its unsigned counterpart
are not deprecated.

Wan-Teh, can we un-deprecate PRWord/PRUword and parameterize them for LLP64 as
well as LP64?  I hope you're reading bugmail -- if so, Happy New Year.

/be
Status: UNCONFIRMED → NEW
Ever confirmed: true
Blocks: 237202
Comment on attachment 138166 [details] [diff] [review]
mozilla/content diffs

r+sr=jst
Attachment #138166 - Flags: superreview+
Attachment #138166 - Flags: review+
Note that there are other places that use the same typedef. Both the nsAttrValue
and nsAttrAndChildArray does.
Assignee: general → m_kato
checked in
Status: NEW → RESOLVED
Closed: 20 years ago
Resolution: --- → FIXED
Er.... we're in freeze.  Checkins require driver approval, no?
Yes, Makoto, this shouldn't have been checked in w/o approval from drivers. In
the future, pay attention to the rules. (for this particular change, I don't
think it's worth backing out or even worrying drivers with it since it really
doesn't change anything on the tier-1 platforms).
Re: comment 7 and comment 8

As long as we precisely define PRWord and PRUword,
that should be fine.  I think what you want is the
new intptr_t and uintptr_t types in C99.

What I don't like about PRWord and PRUword are:

1. "Word" has many meanings.  To the best of my
knowledge, the "word" in PRWord means a word in
the Java virtual machine (the predecessor of NSPR
was used by Netscape to port Sun's JVM to other
platforms), and most people don't know what exactly
a JVM word means.

2. PRWord is defined to be an integer that is the
same size as a void*.  "The same size" might be
overly restrictive.  It may be better to say "large
enough to hold".
> 2. PRWord is defined to be an integer that is the
> same size as a void*.  "The same size" might be
> overly restrictive.  It may be better to say "large
> enough to hold".

Actually, in many cases we do want something that is "The same size". "large
enough to hold" might mean that it's bigger then a void* which might cause
unneccesary bloat.

Does intptr_t and uintptr_t work across enough compilers for us to use in XP
mozilla code? If not we *need* something that is defined to be "The same size"
as a void* or we'll keep running into this problem.
Note that it's still not fixed for the nsAttrValue and nsAttrName classes.
About discuss PRWord value, please see bug 226094 and bug 225859.  Since PRWord
is defined as pointer, we should use it, not long.

And about other code of Mozilla/content, I file a new bug as bug 239499.
Jonas: intptr_t and uintptr_t are relatively new and
therefore are not universally supported yet.  Also,
they are "large enough to hold", as opposed to "the
same size as", a pointer.
Then it sounds like intptr_t and uintptr_t won't cut it here and we need some
NSPR typedef that we can rely on.
Component: DOM → DOM: Core & HTML
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: