X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fvm%2Fjavaobjects.cpp;h=cb862ee2c5d3dc91dc477d86a84820b8b6127911;hb=ac631c42adf26cee868135fc74401039099fe5ee;hp=2bd0a19ddd81ea35dd496ab2af783328283015b8;hpb=735bdda890a385d1fa9cc532faadbbc96f2d1218;p=cacao.git diff --git a/src/vm/javaobjects.cpp b/src/vm/javaobjects.cpp index 2bd0a19dd..cb862ee2c 100644 --- a/src/vm/javaobjects.cpp +++ b/src/vm/javaobjects.cpp @@ -1,5 +1,7 @@ /* src/vm/javaobjects.cpp - functions to create and access Java objects + Copyright (C) 1996-2011 + CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO Copyright (C) 2008, 2009 Theobroma Systems Ltd. This file is part of CACAO. @@ -35,6 +37,7 @@ #include "vm/initialize.hpp" #include "vm/javaobjects.hpp" +#include #if defined(ENABLE_JAVASE) @@ -188,6 +191,87 @@ java_handle_t* java_lang_reflect_Method::invoke(java_handle_t* o, java_handle_ob return result; } +struct DynOffsetEntry { + void (*setter)(int32_t); + const char *name; +}; + +typedef std::map RegisteredDynMap; +static RegisteredDynMap dynEntryMap; + +static void register_dyn_entry_table(classinfo *c, DynOffsetEntry *entries) +{ + dynEntryMap.insert(std::make_pair(c, entries)); +} + +static bool runAllSetters(classinfo *c, DynOffsetEntry entries[]) +{ + do { + fieldinfo *fi = class_findfield_by_name(c, utf_new_char(entries->name)); + if (!fi) + return false; + entries->setter(fi->offset); + } while ((++entries)->setter); + return true; +} + +bool jobjects_run_dynoffsets_hook(classinfo *c) +{ + RegisteredDynMap::const_iterator it = dynEntryMap.find(c); + if (it == dynEntryMap.end()) + return true; + + if (!runAllSetters(c, it->second)) + return false; + + return true; +} + +#if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH) + +off_t java_lang_Thread::offset_vmThread; +off_t java_lang_Thread::offset_group; +off_t java_lang_Thread::offset_name; +off_t java_lang_Thread::offset_daemon; +off_t java_lang_Thread::offset_priority; +off_t java_lang_Thread::offset_exceptionHandler; + +static DynOffsetEntry dyn_entries_java_lang_Thread[] = { + { &java_lang_Thread::set_vmThread_offset, "vmThread" }, + { &java_lang_Thread::set_group_offset, "group" }, + { &java_lang_Thread::set_name_offset, "name" }, + { &java_lang_Thread::set_daemon_offset, "daemon" }, + { &java_lang_Thread::set_priority_offset, "priority" }, + { &java_lang_Thread::set_exceptionHandler_offset, "exceptionHandler" }, + { 0, 0 } +}; + +#elif defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK) + +off_t java_lang_Thread::offset_priority; +off_t java_lang_Thread::offset_daemon; +off_t java_lang_Thread::offset_group; +off_t java_lang_Thread::offset_uncaughtExceptionHandler; +off_t java_lang_Thread::offset_threadStatus; +off_t java_lang_Thread::offset_me; + +static DynOffsetEntry dyn_entries_java_lang_Thread[] = { + { &java_lang_Thread::set_priority_offset, "priority" }, + { &java_lang_Thread::set_daemon_offset, "daemon" }, + { &java_lang_Thread::set_group_offset, "group" }, + { &java_lang_Thread::set_uncaughtExceptionHandler_offset, "uncaughtExceptionHandler" }, + { &java_lang_Thread::set_threadStatus_offset, "threadStatus" }, + { &java_lang_Thread::set_me_offset, "me" }, + { 0, 0 } +}; + +#endif + +void jobjects_register_dyn_offsets() +{ + register_dyn_entry_table(class_java_lang_Thread, dyn_entries_java_lang_Thread); +} + #endif // ENABLE_JAVASE @@ -202,4 +286,5 @@ java_handle_t* java_lang_reflect_Method::invoke(java_handle_t* o, java_handle_ob * c-basic-offset: 4 * tab-width: 4 * End: + * vim:noexpandtab:sw=4:ts=4: */