Merge branch 'master' of dice:git/vm

This commit is contained in:
Joel Dice 2008-01-28 17:34:20 -07:00
commit 12fe480f1c
3 changed files with 36 additions and 2 deletions

View File

@ -82,7 +82,7 @@ endif
ifeq ($(platform),darwin)
build-cflags = $(common-cflags) -fPIC -fvisibility=hidden \
-I$(JAVA_HOME)/include/linux -I$(src)
lflags = $(common-lflags) -ldl
lflags = $(common-lflags) -ldl -framework CoreFoundation
strip-all = -S -x
binaryToMacho = $(native-build)/binaryToMacho
endif

View File

@ -1,3 +1,7 @@
#ifdef __APPLE__
#include "CoreFoundation/CoreFoundation.h"
#undef assert
#endif
#include "sys/mman.h"
#include "sys/types.h"
#include "sys/stat.h"
@ -116,6 +120,28 @@ allocate(System* s, unsigned size)
return p;
}
void
pathOfExecutable(System* s, const char** retBuf, unsigned* size)
{
#ifdef __APPLE__
CFBundleRef bundle = CFBundleGetMainBundle();
CFURLRef url = CFBundleCopyExecutableURL(bundle);
CFStringRef path = CFURLCopyPath(url);
CFIndex pathSize = CFStringGetMaximumSizeOfFileSystemRepresentation(path);
char* buffer = reinterpret_cast<char*>(allocate(s, pathSize));
if (CFStringGetFileSystemRepresentation(path, buffer, pathSize)) {
*size = pathSize;
*retBuf = buffer;
} else {
abort();
}
#else
if (s)
*size = 0;
*retBuf = NULL;
#endif
}
const bool Verbose = false;
const unsigned Waiting = 1 << 0;
@ -646,6 +672,7 @@ class MySystem: public System {
bool mapName)
{
void* p;
bool alreadyAllocated = false;
unsigned nameLength = (name ? strlen(name) : 0);
if (mapName) {
unsigned size = nameLength + 3 + sizeof(SO_SUFFIX);
@ -653,6 +680,10 @@ class MySystem: public System {
snprintf(buffer, size, "lib%s" SO_SUFFIX, name);
p = dlopen(buffer, RTLD_LAZY);
} else {
if (!name) {
pathOfExecutable(this, &name, &nameLength);
alreadyAllocated = true;
}
p = dlopen(name, RTLD_LAZY);
}
@ -665,6 +696,9 @@ class MySystem: public System {
if (name) {
n = static_cast<char*>(allocate(this, nameLength + 1));
memcpy(n, name, nameLength + 1);
if (alreadyAllocated) {
free(name, nameLength, false);
}
} else {
n = 0;
}

View File

@ -170,7 +170,7 @@ resolveNativeMethod2(Thread* t, object method)
snprintf(decorated + decoratedSize - 1, 5, "@%d",
footprint * BytesPerWord);
p = resolveNativeMethod(t, undecorated, decorated);
p = ::resolveNativeMethod(t, undecorated, decorated);
if (p) {
return p;
}