mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Merge.
This commit is contained in:
commit
503bf13dac
@ -1,5 +1,5 @@
|
||||
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
* vim: set ts=8 sw=4 et tw=79:
|
||||
* vim: set ts=8 sw=4 et tw=99:
|
||||
*
|
||||
* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
@ -66,16 +66,16 @@ Tracker::~Tracker()
|
||||
clear();
|
||||
}
|
||||
|
||||
long
|
||||
jsuword
|
||||
Tracker::getPageBase(const void* v) const
|
||||
{
|
||||
return ((long)v) & (~(NJ_PAGE_SIZE-1));
|
||||
return jsuword(v) & ~jsuword(NJ_PAGE_SIZE-1);
|
||||
}
|
||||
|
||||
struct Tracker::Page*
|
||||
Tracker::findPage(const void* v) const
|
||||
{
|
||||
long base = getPageBase(v);
|
||||
jsuword base = getPageBase(v);
|
||||
struct Tracker::Page* p = pagelist;
|
||||
while (p) {
|
||||
if (p->base == base) {
|
||||
@ -88,7 +88,7 @@ Tracker::findPage(const void* v) const
|
||||
|
||||
struct Tracker::Page*
|
||||
Tracker::addPage(const void* v) {
|
||||
long base = getPageBase(v);
|
||||
jsuword base = getPageBase(v);
|
||||
struct Tracker::Page* p = (struct Tracker::Page*)
|
||||
GC::Alloc(sizeof(struct Tracker::Page) + (NJ_PAGE_SIZE >> 2) * sizeof(LInsp));
|
||||
p->base = base;
|
||||
@ -112,7 +112,7 @@ Tracker::get(const void* v) const
|
||||
{
|
||||
struct Tracker::Page* p = findPage(v);
|
||||
JS_ASSERT(p != 0); /* we must have a page for the slot we are looking for */
|
||||
LIns* i = p->map[(((long)v) & 0xfff) >> 2];
|
||||
LIns* i = p->map[(jsuword(v) & 0xfff) >> 2];
|
||||
JS_ASSERT(i != 0);
|
||||
return i;
|
||||
}
|
||||
@ -123,7 +123,7 @@ Tracker::set(const void* v, LIns* ins)
|
||||
struct Tracker::Page* p = findPage(v);
|
||||
if (!p)
|
||||
p = addPage(v);
|
||||
p->map[(((long)v) & 0xfff) >> 2] = ins;
|
||||
p->map[(jsuword(v) & 0xfff) >> 2] = ins;
|
||||
}
|
||||
|
||||
#define LO ARGSIZE_LO
|
||||
@ -253,7 +253,7 @@ TraceRecorder::TraceRecorder(JSContext* cx, Fragmento* fragmento, Fragment* _fra
|
||||
import(&fp->argv[n], "arg", n);
|
||||
for (n = 0; n < fp->nvars; ++n)
|
||||
import(&fp->vars[n], "var", n);
|
||||
for (n = 0; n < (unsigned)(fp->regs->sp - fp->spbase); ++n)
|
||||
for (n = 0; n < unsigned(fp->regs->sp - fp->spbase); ++n)
|
||||
import(&fp->spbase[n], "stack", n);
|
||||
}
|
||||
|
||||
@ -285,16 +285,20 @@ TraceRecorder::calldepth() const
|
||||
JSStackFrame*
|
||||
TraceRecorder::findFrame(void* p) const
|
||||
{
|
||||
jsval* vp = (jsval*) p;
|
||||
JSStackFrame* fp = cx->fp;
|
||||
while (1) {
|
||||
if ((p >= &fp->argv[0] && p < &fp->argv[fp->argc]) ||
|
||||
(p >= &fp->vars[0] && p < &fp->vars[fp->nvars]) ||
|
||||
(p >= &fp->spbase[0] && p < &fp->spbase[fp->script->depth]))
|
||||
for (;;) {
|
||||
// FIXME: fixing bug 441686 collapses the last two tests here
|
||||
if (size_t(vp - fp->argv) < fp->argc ||
|
||||
size_t(vp - fp->vars) < fp->nvars ||
|
||||
size_t(vp - fp->spbase) < fp->script->depth) {
|
||||
return fp;
|
||||
}
|
||||
if (fp == entryFrame)
|
||||
return NULL;
|
||||
return NULL;
|
||||
fp = fp->down;
|
||||
}
|
||||
JS_NOT_REACHED("findFrame");
|
||||
}
|
||||
|
||||
/* Determine whether an address is part of a currently active frame. */
|
||||
@ -309,30 +313,33 @@ TraceRecorder::onFrame(void* p) const
|
||||
unsigned
|
||||
TraceRecorder::nativeFrameSlots(JSStackFrame* fp, JSFrameRegs& regs) const
|
||||
{
|
||||
unsigned size = 0;
|
||||
while (1) {
|
||||
size += fp->argc + fp->nvars + (regs.sp - fp->spbase);
|
||||
unsigned slots = 0;
|
||||
for (;;) {
|
||||
slots += fp->argc + fp->nvars + (regs.sp - fp->spbase);
|
||||
if (fp == entryFrame)
|
||||
return size;
|
||||
return slots;
|
||||
fp = fp->down;
|
||||
}
|
||||
JS_NOT_REACHED("nativeFrameSlots");
|
||||
}
|
||||
|
||||
/* Determine the offset in the native frame (marshal) for an address
|
||||
that is part of a currently active frame. */
|
||||
unsigned
|
||||
size_t
|
||||
TraceRecorder::nativeFrameOffset(void* p) const
|
||||
{
|
||||
jsval* vp = (jsval*) p;
|
||||
JSStackFrame* fp = findFrame(p);
|
||||
JS_ASSERT(fp != NULL); // must be on the frame somewhere
|
||||
unsigned offset = 0;
|
||||
if (p >= &fp->argv[0] && p < &fp->argv[fp->argc])
|
||||
offset = unsigned((jsval*)p - &fp->argv[0]);
|
||||
else if (p >= &fp->vars[0] && p < &fp->vars[fp->nvars])
|
||||
offset = (fp->argc + unsigned((jsval*)p - &fp->vars[0]));
|
||||
else {
|
||||
JS_ASSERT((p >= &fp->spbase[0] && p < &fp->spbase[fp->script->depth]));
|
||||
offset = (fp->argc + fp->nvars + unsigned((jsval*)p - &fp->spbase[0]));
|
||||
size_t offset = size_t(vp - fp->argv);
|
||||
if (offset >= fp->argc) {
|
||||
// FIXME: fixing bug 441686 collapses the vars and spbase cases
|
||||
offset = size_t(vp - fp->vars);
|
||||
if (offset >= fp->nvars) {
|
||||
JS_ASSERT(size_t(vp - fp->spbase) < fp->script->depth);
|
||||
offset = fp->nvars + size_t(vp - fp->spbase);
|
||||
}
|
||||
offset += fp->argc;
|
||||
}
|
||||
if (fp != entryFrame)
|
||||
offset += nativeFrameSlots(fp->down, *fp->regs);
|
||||
@ -816,12 +823,12 @@ TraceRecorder::map_is_native(JSObjectMap* map,
|
||||
{
|
||||
LIns* ops = lir->insLoadi(map_ins, offsetof(JSObjectMap, ops));
|
||||
if (map->ops == &js_ObjectOps) {
|
||||
guard(true, lir->ins2i(LIR_eq, ops, (long)&js_ObjectOps));
|
||||
guard(true, lir->ins2i(LIR_eq, ops, (jsword)&js_ObjectOps));
|
||||
return true;
|
||||
}
|
||||
LIns* n = lir->insLoadi(ops, offsetof(JSObjectOps, newObjectMap));
|
||||
if (map->ops->newObjectMap == js_ObjectOps.newObjectMap) {
|
||||
guard(true, lir->ins2i(LIR_eq, n, (long)js_ObjectOps.newObjectMap));
|
||||
guard(true, lir->ins2i(LIR_eq, n, (jsword)js_ObjectOps.newObjectMap));
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
@ -54,13 +54,13 @@
|
||||
class Tracker
|
||||
{
|
||||
struct Page {
|
||||
struct Page* next;
|
||||
long base;
|
||||
nanojit::LIns* map[0];
|
||||
struct Page* next;
|
||||
jsuword base;
|
||||
nanojit::LIns* map[0];
|
||||
};
|
||||
struct Page* pagelist;
|
||||
|
||||
long getPageBase(const void* v) const;
|
||||
jsuword getPageBase(const void* v) const;
|
||||
struct Page* findPage(const void* v) const;
|
||||
struct Page* addPage(const void* v);
|
||||
public:
|
||||
@ -74,7 +74,7 @@ public:
|
||||
|
||||
struct VMFragmentInfo {
|
||||
unsigned maxNativeFrameSlots;
|
||||
unsigned nativeStackBase;
|
||||
size_t nativeStackBase;
|
||||
char typeMap[0];
|
||||
};
|
||||
|
||||
@ -104,7 +104,7 @@ class TraceRecorder {
|
||||
JSStackFrame* findFrame(void* p) const;
|
||||
bool onFrame(void* p) const;
|
||||
unsigned nativeFrameSlots(JSStackFrame* fp, JSFrameRegs& regs) const;
|
||||
unsigned nativeFrameOffset(void* p) const;
|
||||
size_t nativeFrameOffset(void* p) const;
|
||||
void import(jsval*, char *prefix = NULL, int index = 0);
|
||||
void trackNativeFrameUse(unsigned slots);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user