зеркало из https://github.com/mozilla/gecko-dev.git
Bug 507031 - Replace use of avmplus:String with Allocator and char* in nanojit::LabelMap and LirNameMap, r=dvander.
--HG-- extra : rebase_source : 3c59dc7bff1ece5ac282da9b0cb8820674345684
This commit is contained in:
Родитель
30ed122a0a
Коммит
0e8ae84f85
|
@ -1606,36 +1606,12 @@ namespace nanojit
|
|||
}
|
||||
}
|
||||
|
||||
LabelMap::Entry::~Entry()
|
||||
{
|
||||
}
|
||||
|
||||
LirNameMap::Entry::~Entry()
|
||||
{
|
||||
}
|
||||
|
||||
LirNameMap::~LirNameMap()
|
||||
{
|
||||
Entry *e;
|
||||
|
||||
while ((e = names.removeLast()) != NULL) {
|
||||
labels->core->freeString(e->name);
|
||||
NJ_DELETE(e);
|
||||
}
|
||||
}
|
||||
|
||||
bool LirNameMap::addName(LInsp i, Stringp name) {
|
||||
void LirNameMap::addName(LInsp i, const char* name) {
|
||||
if (!names.containsKey(i)) {
|
||||
Entry *e = NJ_NEW(labels->core->gc, Entry)(name);
|
||||
char *copy = new (allocator) char[VMPI_strlen(name)+1];
|
||||
VMPI_strcpy(copy, name);
|
||||
Entry *e = new (allocator) Entry(copy);
|
||||
names.put(i, e);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
void LirNameMap::addName(LInsp i, const char *name) {
|
||||
Stringp new_name = labels->core->newString(name);
|
||||
if (!addName(i, new_name)) {
|
||||
labels->core->freeString(new_name);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1643,11 +1619,11 @@ namespace nanojit
|
|||
char s2[200];
|
||||
if (isdigit(s[strlen(s)-1])) {
|
||||
// if s ends with a digit, add '_' to clarify the suffix
|
||||
sprintf(s2,"%s_%d", s, suffix);
|
||||
VMPI_sprintf(s2,"%s_%d", s, suffix);
|
||||
} else {
|
||||
sprintf(s2,"%s%d", s, suffix);
|
||||
VMPI_sprintf(s2,"%s%d", s, suffix);
|
||||
}
|
||||
addName(i, labels->core->newString(s2));
|
||||
addName(i, s2);
|
||||
}
|
||||
|
||||
void LirNameMap::formatImm(int32_t c, char *buf) {
|
||||
|
@ -1661,10 +1637,9 @@ namespace nanojit
|
|||
{
|
||||
char buffer[200], *buf=buffer;
|
||||
buf[0]=0;
|
||||
GC *gc = labels->core->gc;
|
||||
if (names.containsKey(ref)) {
|
||||
StringNullTerminatedUTF8 cname(gc, names.get(ref)->name);
|
||||
strcat(buf, cname.c_str());
|
||||
const char* name = names.get(ref)->name;
|
||||
VMPI_strcat(buf, name);
|
||||
}
|
||||
else if (ref->isconstq()) {
|
||||
#if defined NANOJIT_64BIT
|
||||
|
@ -1695,8 +1670,8 @@ namespace nanojit
|
|||
NanoAssert(size_t(ref->opcode()) < sizeof(lirNames) / sizeof(lirNames[0]));
|
||||
copyName(ref, lirNames[ref->opcode()], lircounts.add(ref->opcode()));
|
||||
}
|
||||
StringNullTerminatedUTF8 cname(gc, names.get(ref)->name);
|
||||
strcat(buf, cname.c_str());
|
||||
const char* name = names.get(ref)->name;
|
||||
VMPI_strcat(buf, name);
|
||||
}
|
||||
return labels->dup(buffer);
|
||||
}
|
||||
|
@ -2243,25 +2218,17 @@ namespace nanojit
|
|||
|
||||
void LabelMap::clear()
|
||||
{
|
||||
Entry *e;
|
||||
while ((e = names.removeLast()) != NULL) {
|
||||
core->freeString(e->name);
|
||||
NJ_DELETE(e);
|
||||
}
|
||||
// don't free entries since they're owned by Allocator
|
||||
names.clear();
|
||||
}
|
||||
|
||||
void LabelMap::add(const void *p, size_t size, size_t align, const char *name)
|
||||
{
|
||||
if (!this || names.containsKey(p))
|
||||
return;
|
||||
add(p, size, align, core->newString(name));
|
||||
}
|
||||
|
||||
void LabelMap::add(const void *p, size_t size, size_t align, Stringp name)
|
||||
{
|
||||
if (!this || names.containsKey(p))
|
||||
return;
|
||||
Entry *e = NJ_NEW(core->gc, Entry)(name, size<<align, align);
|
||||
char* copy = new (allocator) char[VMPI_strlen(name)+1];
|
||||
VMPI_strcpy(copy, name);
|
||||
Entry *e = new (allocator) Entry(copy, size << align, align);
|
||||
names.put(p, e);
|
||||
}
|
||||
|
||||
|
@ -2273,42 +2240,41 @@ namespace nanojit
|
|||
const void *start = names.keyAt(i);
|
||||
Entry *e = names.at(i);
|
||||
const void *end = (const char*)start + e->size;
|
||||
avmplus::StringNullTerminatedUTF8 cname(core->gc, e->name);
|
||||
const char *name = cname.c_str();
|
||||
const char *name = e->name;
|
||||
if (p == start) {
|
||||
if (addrs)
|
||||
sprintf(b,"%p %s",p,name);
|
||||
VMPI_sprintf(b,"%p %s",p,name);
|
||||
else
|
||||
strcpy(b, name);
|
||||
VMPI_strcpy(b, name);
|
||||
return dup(b);
|
||||
}
|
||||
else if (p > start && p < end) {
|
||||
int32_t d = int32_t(intptr_t(p)-intptr_t(start)) >> e->align;
|
||||
if (addrs)
|
||||
sprintf(b, "%p %s+%d", p, name, d);
|
||||
VMPI_sprintf(b, "%p %s+%d", p, name, d);
|
||||
else
|
||||
sprintf(b,"%s+%d", name, d);
|
||||
VMPI_sprintf(b,"%s+%d", name, d);
|
||||
return dup(b);
|
||||
}
|
||||
else {
|
||||
sprintf(b, "%p", p);
|
||||
VMPI_sprintf(b, "%p", p);
|
||||
return dup(b);
|
||||
}
|
||||
}
|
||||
sprintf(b, "%p", p);
|
||||
VMPI_sprintf(b, "%p", p);
|
||||
return dup(b);
|
||||
}
|
||||
|
||||
const char *LabelMap::dup(const char *b)
|
||||
{
|
||||
size_t need = strlen(b)+1;
|
||||
size_t need = VMPI_strlen(b)+1;
|
||||
char *s = end;
|
||||
end += need;
|
||||
if (end > buf+sizeof(buf)) {
|
||||
s = buf;
|
||||
end = s+need;
|
||||
}
|
||||
strcpy(s, b);
|
||||
VMPI_strcpy(s, b);
|
||||
return s;
|
||||
}
|
||||
|
||||
|
|
|
@ -860,25 +860,21 @@ namespace nanojit
|
|||
class LabelMap MMGC_SUBCLASS_DECL
|
||||
{
|
||||
Allocator& allocator;
|
||||
class Entry MMGC_SUBCLASS_DECL
|
||||
class Entry
|
||||
{
|
||||
public:
|
||||
Entry(int) : name(0), size(0), align(0) {}
|
||||
Entry(avmplus::String *n, size_t s, size_t a) : name(n),size(s),align(a) {}
|
||||
~Entry();
|
||||
DRCWB(avmplus::String*) name;
|
||||
Entry(char *n, size_t s, size_t a) : name(n),size(s),align(a) {}
|
||||
char* name;
|
||||
size_t size:29, align:3;
|
||||
};
|
||||
avmplus::SortedMap<const void*, Entry*, avmplus::LIST_GCObjects> names;
|
||||
avmplus::SortedMap<const void*, Entry*, avmplus::LIST_NonGCObjects> names;
|
||||
bool addrs, pad[3];
|
||||
char buf[1000], *end;
|
||||
void formatAddr(const void *p, char *buf);
|
||||
public:
|
||||
avmplus::AvmCore *core;
|
||||
LabelMap(avmplus::AvmCore *, Allocator& allocator);
|
||||
~LabelMap();
|
||||
void add(const void *p, size_t size, size_t align, const char *name);
|
||||
void add(const void *p, size_t size, size_t align, avmplus::String*);
|
||||
const char *dup(const char *);
|
||||
const char *format(const void *p);
|
||||
void clear();
|
||||
|
@ -904,15 +900,13 @@ namespace nanojit
|
|||
CountMap<int> lircounts;
|
||||
CountMap<const CallInfo *> funccounts;
|
||||
|
||||
class Entry MMGC_SUBCLASS_DECL
|
||||
class Entry
|
||||
{
|
||||
public:
|
||||
Entry(int) : name(0) {}
|
||||
Entry(avmplus::String *n) : name(n) {}
|
||||
~Entry();
|
||||
DRCWB(avmplus::String*) name;
|
||||
Entry(char* n) : name(n) {}
|
||||
char* name;
|
||||
};
|
||||
avmplus::SortedMap<LInsp, Entry*, avmplus::LIST_GCObjects> names;
|
||||
avmplus::SortedMap<LInsp, Entry*, avmplus::LIST_NonGCObjects> names;
|
||||
LabelMap *labels;
|
||||
void formatImm(int32_t c, char *buf);
|
||||
public:
|
||||
|
@ -924,10 +918,8 @@ namespace nanojit
|
|||
names(gc),
|
||||
labels(r)
|
||||
{}
|
||||
~LirNameMap();
|
||||
|
||||
void addName(LInsp i, const char *s);
|
||||
bool addName(LInsp i, avmplus::String *s);
|
||||
void copyName(LInsp i, const char *s, int suffix);
|
||||
const char *formatRef(LIns *ref);
|
||||
const char *formatIns(LInsp i);
|
||||
|
|
|
@ -288,6 +288,11 @@ namespace MMgc {
|
|||
|
||||
#define MMGC_MEM_TYPE(x)
|
||||
|
||||
#define VMPI_strlen strlen
|
||||
#define VMPI_strcat strcat
|
||||
#define VMPI_strcpy strcpy
|
||||
#define VMPI_sprintf sprintf
|
||||
|
||||
extern void VMPI_setPageProtection(void *address,
|
||||
size_t size,
|
||||
bool executableFlag,
|
||||
|
|
Загрузка…
Ссылка в новой задаче