Thanks Will for this new version. Code looks good now, modulo one small comment inlined. Please apply!<div><br></div><div>Nicolas<br><br><div class="gmail_quote">On Mon, Oct 24, 2011 at 10:38 PM, Will Dietz <span dir="ltr"><<a href="mailto:wdietz2@illinois.edu">wdietz2@illinois.edu</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">(Fixing my failure to cc the list originally)<br>
<div><div></div><div class="h5"><br>
Updated patch below, addressing the mentioned concerns (thanks!).<br>
<br>
Also, dropped the 'getNativePointer' accessor on JavaMethod since<br>
that's confusing and forces one to know which "type" of native method<br>
they have.<br>
<br>
Instead put the logic into nativeLookup, so existing code that wants<br>
the native function pointer (and are used to doing so via<br>
nativeLookup) now get it with any fuss.<br>
<br>
Inlined below.<br>
<br>
~Will<br>
---<br>
 lib/J3/VMCore/JavaClass.h          |    1 -<br>
 lib/J3/VMCore/Jni.cpp              |   39 ++++++++++++++++++++++++++++++++---<br>
 lib/J3/VMCore/JnjvmClassLoader.cpp |   28 ++++++++++++++++++++++++-<br>
 lib/J3/VMCore/JnjvmClassLoader.h   |   13 ++++++++++++<br>
 4 files changed, 75 insertions(+), 6 deletions(-)<br>
<br>
diff --git a/lib/J3/VMCore/JavaClass.h b/lib/J3/VMCore/JavaClass.h<br>
index 1fa9b77..5da5571 100644<br>
--- a/lib/J3/VMCore/JavaClass.h<br>
+++ b/lib/J3/VMCore/JavaClass.h<br>
@@ -961,7 +961,6 @@ public:<br>
  /// with the given class loader.<br>
  ///<br>
  JavaObject* getReturnType(JnjvmClassLoader* loader);<br>
-<br>
<br>
 //===----------------------------------------------------------------------===//<br>
 //<br>
diff --git a/lib/J3/VMCore/Jni.cpp b/lib/J3/VMCore/Jni.cpp<br>
index 9f7d612..82d2719 100644<br>
--- a/lib/J3/VMCore/Jni.cpp<br>
+++ b/lib/J3/VMCore/Jni.cpp<br>
@@ -3755,11 +3755,42 @@ void SetDoubleArrayRegion(JNIEnv *env,<br>
jdoubleArray array, jsize start,<br>
 }<br>
<br>
<br>
-jint RegisterNatives(JNIEnv *env, jclass clazz, const JNINativeMethod *methods,<br>
+jint RegisterNatives(JNIEnv *env, jclass _clazz, const<br>
JNINativeMethod *methods,<br>
                    jint nMethods) {<br>
-  NYI();<br>
-  abort();<br>
-  return 0;<br>
+  BEGIN_JNI_EXCEPTION<br>
+<br>
+  JavaObject * clazz = 0;<br>
+  llvm_gcroot(clazz, 0);<br>
+  clazz = *(JavaObject**)_clazz;<br>
+<br>
+  Jnjvm* vm = JavaThread::get()->getJVM();<br>
+  UserCommonClass * Cl = UserCommonClass::resolvedImplClass(vm, clazz, false);<br>
+  // TODO: Don't assert, throw exceptions!<br>
+  assert(Cl);<br>
+  UserClass * cl = Cl->asClass();<br>
+<br>
+  for(int i = 0; i < nMethods; ++i)<br>
+  {<br>
+    const UTF8* name =<br>
cl->classLoader->hashUTF8->lookupAsciiz(methods[i].name);<br>
+    const UTF8* sign =<br>
cl->classLoader->hashUTF8->lookupAsciiz(methods[i].signature);<br>
+    assert(name);<br>
+    assert(sign);<br>
+<br>
+    JavaMethod * meth = cl->lookupMethodDontThrow(name, sign, true, true, 0);<br>
+    if (!meth) meth = cl->lookupMethodDontThrow(name, sign, false, true, 0);<br>
+<br>
+    // TODO: Don't assert, throw exceptions!<br>
+    assert(meth);<br>
+    assert(isNative(meth->access));<br>
+<br>
+    cl->classLoader->registerNative(meth,(word_t)methods[i].fnPtr);<br>
+  }<br>
+<br>
+  RETURN_FROM_JNI(0)<br>
+<br>
+  END_JNI_EXCEPTION<br>
+<br>
+  RETURN_FROM_JNI(0)<br>
 }<br>
<br>
<br>
diff --git a/lib/J3/VMCore/JnjvmClassLoader.cpp<br>
b/lib/J3/VMCore/JnjvmClassLoader.cpp<br>
index 55d3cfb..fe83593 100644<br>
--- a/lib/J3/VMCore/JnjvmClassLoader.cpp<br>
+++ b/lib/J3/VMCore/JnjvmClassLoader.cpp<br>
@@ -1005,9 +1005,19 @@ word_t JnjvmClassLoader::loadInLib(const char*<br>
name, void* handle) {<br>
 word_t JnjvmClassLoader::nativeLookup(JavaMethod* meth, bool& j3,<br>
                                        char* buf) {<br>
<br>
+  word_t res;<br>
+<br>
+  // Is this method defined via registerNatives()?<br>
+  // If so, use that definition.<br>
+  if (res = getRegisteredNative(meth))<br>
+    return res;<br>
+<br>
+  // Otherwise, try to resolve the method with a symbol lookup<br>
+  // First as the base method<br>
  meth->jniConsFromMeth(buf);<br>
-  word_t res = loadInLib(buf, j3);<br>
+  res = loadInLib(buf, j3);<br>
  if (!res) {<br>
+    // Failing that, try the overloaded symbol name<br>
    meth->jniConsFromMethOverloaded(buf);<br>
    res = loadInLib(buf, j3);<br>
  }<br>
@@ -1031,3 +1041,19 @@ JavaString**<br>
StringList::addString(JnjvmClassLoader* JCL, JavaString* obj) {<br>
    return res;<br>
  }<br>
 }<br>
+<br>
+void JnjvmClassLoader::registerNative(JavaMethod * meth, word_t fnPtr) {<br>
+  // Don't support multiple levels of registerNatives<br></div></div></blockquote><div><br></div><div>Please add that comment just before the 'assert'.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div><div class="h5">
+  lock.lock();<br>
+  assert(registeredNatives.find(meth) == registeredNatives.end());<br>
+<br>
+  registeredNatives[meth] = fnPtr;<br>
+  lock.unlock();<br>
+}<br>
+<br>
+word_t JnjvmClassLoader::getRegisteredNative(const JavaMethod * meth) {<br>
+  lock.lock();<br>
+  word_t res = registeredNatives[meth];<br>
+  lock.unlock();<br>
+  return res;<br>
+}<br>
diff --git a/lib/J3/VMCore/JnjvmClassLoader.h b/lib/J3/VMCore/JnjvmClassLoader.h<br>
index 8e15d65..f5891b0 100644<br>
--- a/lib/J3/VMCore/JnjvmClassLoader.h<br>
+++ b/lib/J3/VMCore/JnjvmClassLoader.h<br>
@@ -108,6 +108,11 @@ protected:<br>
  ///<br>
  mvm::LockRecursive lock;<br>
<br>
+  /// registeredNatives - Stores the native function pointers corresponding<br>
+  /// to methods that were defined through JNI's RegisterNatives mechanism.<br>
+  ///<br>
+  std::map<const JavaMethod*,word_t> registeredNatives;<br>
+<br>
 public:<br>
<br>
  /// allocator - Reference to the memory allocator, which will allocate UTF8s,<br>
@@ -301,6 +306,14 @@ public:<br>
  ///<br>
  Class* loadClassFromSelf(Jnjvm* vm, const char* name);<br>
<br>
+  /// registerNative - Record the native function pointer of a method.<br>
+  ///<br>
+  void registerNative(JavaMethod * meth, word_t fnPtr);<br>
+<br>
+  /// getRegisteredNative - Return the native pointer, if exists.<br>
+  ///<br>
+  word_t getRegisteredNative(const JavaMethod * meth);<br>
+<br>
  friend class Class;<br>
  friend class CommonClass;<br>
  friend class StringList;<br>
--<br>
1.7.5.1<br>
<br>
</div></div>_______________________________________________<br>
vmkit-commits mailing list<br>
<a href="mailto:vmkit-commits@cs.uiuc.edu">vmkit-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/vmkit-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/vmkit-commits</a><br>
</blockquote></div><br></div>