Hi, all.

// Please CC me


I'm building Firefox for a solaris-based system on amd64 processor, e.
i. Firefox is to be an 64-bit application.
I've found that during the build xpcshell crashes [1]:

js::ObjectImpl::setFlag (this=0x7d7ffbf06040, cx=0x835600, flag_=8,
generateShape=js::ObjectImpl::GENERATE_SHAPE)
    at /home/pashev/packaging/firefox/iceweasel-22.0/js/src/vm/Shape.cpp:1071
warning: Source file is more recent than executable.
1071        if (lastProperty()->getObjectFlags() & flag)
(gdb) bt
#0  js::ObjectImpl::setFlag (this=0x7d7ffbf06040, cx=0x835600,
flag_=8, generateShape=js::ObjectImpl::GENERATE_SHAPE)
    at /home/pashev/packaging/firefox/iceweasel-22.0/js/src/vm/Shape.cpp:1071
#1  0xfffffd7fcd2ff4d5 in setDelegate (cx=0x835600,
this=0x7d7ffbf06040) at ../../../js/src/jsobjinlines.h:820
#2  JSCompartment::getNewType (this=0x835e10, cx=0x835600,
clasp=0xfffffd7fcd914820, proto_=..., fun_=0x0)
    at /home/pashev/packaging/firefox/iceweasel-22.0/js/src/jsinfer.cpp:6278
#3  0xfffffd7fcd2ff832 in JSObject::getNewType (this=<optimized out>,
cx=<optimized out>, clasp=<optimized out>, fun=<optimized out>)
    at /home/pashev/packaging/firefox/iceweasel-22.0/js/src/jsinfer.cpp:6339
....

I've investigated it a bit [2] and found that JSVAL_TO_OBJECT_IMPL()
trashes the pointer to stack by applying JSVAL_PAYLOAD_MASK:
uint64_t ptrBits = l.asBits & JSVAL_PAYLOAD_MASK;

This only matters on amd64, JSVAL_PAYLOAD_MASK is not used on an
32-bit architecture.

The value of JSVAL_PAYLOAD_MASK is 0x00007FFFFFFFFFFFLL; it looks like
a top of the stack on linux/amd64.
But the top of stack on solaris/amd64 is 0xfffffd8000000000 [3].

As a naive effort I've tried to set JSVAL_PAYLOAD_MASK =
0xFFFFFFFFFFFFFFFFLL. Of course it crashed in different place :-)

192         return obj && obj->is<StaticBlockObject>() ?
&obj->as<StaticBlockObject>() : NULL;
(gdb) bt 6
#0  enclosingBlock (this=<error reading variable: Cannot access memory
at address 0x10>) at ../../../js/src/vm/ScopeObject-inl.h:192
#1  
js::frontend::FinishPopStatement<js::frontend::ParseContext<js::frontend::FullParseHandler>
> (ct=ct@entry=0xfffffd7fffdfd950)
    at ../../../js/src/frontend/SharedContext-inl.h:92
#2  0xfffffd7fbeb0b760 in
js::frontend::PopStatementPC<js::frontend::FullParseHandler>
(cx=<optimized out>, pc=0xfffffd7fffdfd950)
    at 
/home/pashev/packaging/firefox/iceweasel-24.0/js/src/frontend/Parser.cpp:2669
#3  0xfffffd7fbeb1f987 in
js::frontend::Parser<js::frontend::FullParseHandler>::blockStatement
(this=this@entry=0xfffffd7fffdfe280)
    at 
/home/pashev/packaging/firefox/iceweasel-24.0/js/src/frontend/Parser.cpp:3319
#4  0xfffffd7fbeb1f15f in
js::frontend::Parser<js::frontend::FullParseHandler>::statement
(this=this@entry=0xfffffd7fffdfe280, canHaveDirectives=false)
    at 
/home/pashev/packaging/firefox/iceweasel-24.0/js/src/frontend/Parser.cpp:4785
#5  0xfffffd7fbea9cb6a in js::frontend::CompileScript
(cx=cx@entry=0x892830, scopeChain=..., scopeChain@entry=...,
evalCaller=..., options=...,
    chars=chars@entry=0x8ddeb0, length=<optimized out>,
source_=source_@entry=0x0, staticLevel=staticLevel@entry=0,
    extraSct=extraSct@entry=0xfffffd7fffdfea20) at
/home/pashev/packaging/firefox/iceweasel-24.0/js/src/frontend/BytecodeCompiler.cpp:271
(More stack frames follow...)
(gdb) print obj
$1 = (JSObject *) 0xfffb000000000000
(gdb) print *obj
Cannot access memory at address 0xfffb000000000000
(gdb) list
187
188     inline StaticBlockObject *
189     StaticBlockObject::enclosingBlock() const
190     {
191         JSObject *obj = getReservedSlot(SCOPE_CHAIN_SLOT).toObjectOrNull();
192         return obj && obj->is<StaticBlockObject>() ?
&obj->as<StaticBlockObject>() : NULL;
193     }
194
195     inline JSObject *
196     StaticBlockObject::enclosingStaticScope() const


So I'd like to ask to shed light on why JSVAL_PAYLOAD_MASK exists, how
it works, how can I port it on solaris/amd64 or disable it or
whatever.


[1] http://osdyson.org/issues/145
[2] http://osdyson.org/issues/145#note-2
[3] http://docs.oracle.com/cd/E18752_01/html/816-5138/fcowb.html
_______________________________________________
dev-tech-js-engine-internals mailing list
[email protected]
https://lists.mozilla.org/listinfo/dev-tech-js-engine-internals

Reply via email to