[vmkit-commits] [PATCH] OpenJDK.inc: Implement JVM_FindPrimitiveClass

Will Dietz wdietz2 at illinois.edu
Wed Oct 26 18:56:58 PDT 2011


Inlined below.

~Will


>From e25a607974c98c8c01107ac3a72b666160f0023c Mon Sep 17 00:00:00 2001
From: Will Dietz <w at wdtz.org>
Date: Wed, 26 Oct 2011 20:52:26 -0500
Subject: [PATCH 1/3] OpenJDK.inc: Implement JVM_FindPrimitiveClass

---
 lib/J3/ClassLib/OpenJDK/OpenJDK.inc |   43 ++++++++++++++++++++++++++++++++++-
 1 files changed, 42 insertions(+), 1 deletions(-)

diff --git a/lib/J3/ClassLib/OpenJDK/OpenJDK.inc
b/lib/J3/ClassLib/OpenJDK/OpenJDK.inc
index e5690a5..2380abd 100644
--- a/lib/J3/ClassLib/OpenJDK/OpenJDK.inc
+++ b/lib/J3/ClassLib/OpenJDK/OpenJDK.inc
@@ -549,9 +549,50 @@ JVM_GetCallerClass(JNIEnv *env, int n) {
  * utf: class name
  */

+
+const struct {
+  const char * name;
+  char id;
+} static PrimMap[] = {
+  { "boolean", 'Z' },
+  { "byte"   , 'B' },
+  { "char"   , 'C' },
+  { "short"  , 'S' },
+  { "int"    , 'I' },
+  { "long"   , 'J' },
+  { "float"  , 'F' },
+  { "double" , 'D' },
+  { "void"   , 'V' }
+};
+const static unsigned PrimMapSize = sizeof(PrimMap)/sizeof(PrimMap[0]);
+
 JNIEXPORT jclass JNICALL
 JVM_FindPrimitiveClass(JNIEnv *env, const char *utf) {
-  NYI();
+  JavaObject* res = 0;
+  llvm_gcroot(res, 0);
+
+  BEGIN_JNI_EXCEPTION
+
+  Jnjvm* vm = JavaThread::get()->getJVM();
+
+  UserClassPrimitive * prim =  0;
+  for(unsigned i = 0; i < PrimMapSize; ++i) {
+    if(!strcmp(PrimMap[i].name, utf)) {
+      prim = UserClassPrimitive::byteIdToPrimitive(PrimMap[i].id, vm->upcalls);
+      break;
+    }
+  }
+  if (!prim) {
+    fprintf(stderr, "Unsupported primitive \"%s\"!  Missing table
entry?\n", utf);
+  }
+  assert(prim && "Invalid Primitive in JVM_FindPrimitiveClass");
+
+  res = (JavaObject*)prim->getClassDelegateePtr(vm);
+  RETURN_FROM_JNI((jclass)res);
+
+  END_JNI_EXCEPTION
+
+  return 0;
 }

 /*
-- 
1.7.5.1



More information about the vmkit-commits mailing list