+struct DynOffsetEntry {
+ void (*setter)(int32_t);
+ const char *name;
+};
+
+typedef std::map<classinfo *, DynOffsetEntry *> 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);
+}
+