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:
Edwin Smith 2009-07-15 12:34:17 -04:00
Родитель 30ed122a0a
Коммит 0e8ae84f85
3 изменённых файлов: 38 добавлений и 75 удалений

Просмотреть файл

@ -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,