[vmkit-commits] [vmkit] r142824 - /vmkit/trunk/lib/J3/VMCore/Jni.cpp

Will Dietz wdietz2 at illinois.edu
Mon Oct 24 11:23:14 PDT 2011


Author: wdietz2
Date: Mon Oct 24 13:23:14 2011
New Revision: 142824

URL: http://llvm.org/viewvc/llvm-project?rev=142824&view=rev
Log:
Jni.cpp: DefineClass,GetSuperClass,Throw, misc String functions.

Modified:
    vmkit/trunk/lib/J3/VMCore/Jni.cpp

Modified: vmkit/trunk/lib/J3/VMCore/Jni.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/Jni.cpp?rev=142824&r1=142823&r2=142824&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/Jni.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/Jni.cpp Mon Oct 24 13:23:14 2011
@@ -20,6 +20,7 @@
 #include "JavaTypes.h"
 #include "JavaUpcalls.h"
 #include "Jnjvm.h"
+#include "Reader.h"
 
 using namespace j3;
 
@@ -51,10 +52,30 @@
 }
 
 
-jclass DefineClass(JNIEnv *env, const char *name, jobject loader,
-				   const jbyte *buf, jsize bufLen) {
-  NYI();
-  abort();
+jclass DefineClass(JNIEnv *env, const char *name, jobject _loader,
+				   const jbyte *buf, jsize len) {
+  BEGIN_JNI_EXCEPTION
+
+  JavaObject * loader = _loader ? *(JavaObject**)_loader : 0;
+  llvm_gcroot(loader, 0);
+
+  jclass res;
+
+  Jnjvm* vm = JavaThread::get()->getJVM();
+  JnjvmClassLoader* JCL =
+    JnjvmClassLoader::getJnjvmLoaderFromJavaObject(loader, vm);
+
+  ClassBytes * bytes = new (JCL->allocator, len) ClassBytes(len);
+  memcpy(bytes->elements,buf,len);
+  const UTF8* utfName = JCL->asciizConstructUTF8(name);
+  UserClass *cl = JCL->constructClass(utfName, bytes);
+
+  if (cl) res = (jclass)cl->getClassDelegateePtr(vm);
+
+  RETURN_FROM_JNI(res);
+
+  END_JNI_EXCEPTION
+
   return 0;
 }
 
@@ -109,9 +130,23 @@
 
 
 jclass GetSuperclass(JNIEnv *env, jclass sub) {
-  NYI();
-  abort();
-  return 0;
+  BEGIN_JNI_EXCEPTION
+
+  jclass res = 0;
+  JavaObject* Cl = *(JavaObject**)sub;
+  llvm_gcroot(Cl, 0);
+  llvm_gcroot(res, 0);
+
+  Jnjvm* vm = JavaThread::get()->getJVM();
+  UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false);
+  if (!cl->isInterface() && cl->getSuper() != NULL) {
+    res = (jclass)cl->getSuper()->getClassDelegateePtr(vm);
+  }
+  RETURN_FROM_JNI(res);
+
+  END_JNI_EXCEPTION
+
+  RETURN_FROM_JNI(0);
 }
   
  
@@ -141,8 +176,10 @@
 
 
 jint Throw(JNIEnv *env, jthrowable obj) {
-  NYI();
-  abort();
+  BEGIN_JNI_EXCEPTION
+  JavaThread::get()->pendingException = *(JavaObject**)obj;
+
+  END_JNI_EXCEPTION
   return 0;
 }
 
@@ -2831,10 +2868,16 @@
 }
 
 
-jsize GetStringUTFLength (JNIEnv *env, jstring string) {   
-  NYI();
-  abort();
-  return 0;
+jsize GetStringUTFLength (JNIEnv *env, jstring string) {
+  BEGIN_JNI_EXCEPTION
+  JavaThread* th = JavaThread::get();
+
+  JavaString * s = *(JavaString**)string;
+  llvm_gcroot(s, 0);
+  RETURN_FROM_JNI(s->count);
+  END_JNI_EXCEPTION
+
+  RETURN_FROM_JNI(0)
 }
 
 
@@ -3779,15 +3822,51 @@
 
 void GetStringRegion(JNIEnv* env, jstring str, jsize start, jsize len,
                      jchar *buf) {
-  NYI();
-  abort();
+  BEGIN_JNI_EXCEPTION
+
+  JavaString * s = *(JavaString**)str;
+  llvm_gcroot(s, 0);
+  UserClass * cl = JavaObject::getClass(s)->asClass();
+  const UTF8 * utf = JavaString::javaToInternal(s, cl->classLoader->hashUTF8);
+
+  ssize_t end = start+len;
+  if (end > utf->size) {
+    assert(0 && "Throw string out of bounds exception here!");
+  }
+
+  Jnjvm* vm = JavaThread::get()->getJVM();
+  UTF8Map* map = vm->bootstrapLoader->hashUTF8;
+
+  const UTF8 * result = utf->extract(map, start, start + len);
+  assert(result->size == len);
+  for(sint32 i = 0; i < len; ++i)
+    buf[i] = result->elements[i];
+
+  RETURN_VOID_FROM_JNI;
+  END_JNI_EXCEPTION
+  RETURN_VOID_FROM_JNI;
 }
 
 
 void GetStringUTFRegion(JNIEnv* env, jstring str, jsize start, jsize len,
                         char *buf) {
-  NYI();
-  abort();
+  BEGIN_JNI_EXCEPTION
+
+  JavaString * s = *(JavaString**)str;
+  llvm_gcroot(s, 0);
+
+  int end = start+len;
+  if (end > s->count) {
+    assert(0 && "Throw string out of bounds exception here!");
+  }
+
+  char * internalStr = JavaString::strToAsciiz(s);
+  assert((int)strlen(internalStr) == len);
+  memcpy(buf, internalStr, len + 1);
+
+  RETURN_VOID_FROM_JNI;
+  END_JNI_EXCEPTION
+  RETURN_VOID_FROM_JNI;
 }
 
 





More information about the vmkit-commits mailing list