more bug fixes
authorbdemsky <bdemsky>
Fri, 15 Apr 2011 21:50:06 +0000 (21:50 +0000)
committerbdemsky <bdemsky>
Fri, 15 Apr 2011 21:50:06 +0000 (21:50 +0000)
Robust/src/IR/Flat/BuildCode.java
Robust/src/Runtime/garbage.h
Robust/src/Runtime/jni/jni-private.h
Robust/src/Runtime/jni/jni-stuff.c

index 7a2950b9fa38898178c7c5d3cc8fd26ed9112d0b..367d9a83789fa5bbbc6eaefc5df028dc6f55595a 100644 (file)
@@ -1831,7 +1831,7 @@ public class BuildCode {
     ClassDescriptor cd=md.getClassDesc();
     generateHeader(fm, md, outmethod);
     int startindex=0;
-    
+    outmethod.println("JNIPUSHFRAME();");    
     if (md.getModifiers().isStatic()) {
       outmethod.println("jobject rec=JNIWRAP(((void **)(((char *) &(global_defs_p->classobjs->___length___))+sizeof(int)))[" + cd.getId() + "]);");
     } else {
@@ -1874,10 +1874,10 @@ public class BuildCode {
     if (md.getReturnType()!=null) {
       if (md.getReturnType().isPtr()) {
        outmethod.println("struct ___Object___ * retobj=JNIUNWRAP(retval);");
-       outmethod.println("JNIclearstack();");
+       outmethod.println("JNIPOPFRAME();");
        outmethod.println("return retobj;");
       } else {
-       outmethod.println("JNIclearstack();");
+       outmethod.println("JNIPOPFRAME();");
        outmethod.println("return retval;");
       }
     }
index a5f7cd83486cceec7f1ace21fea98a37b0b43269..c504c65a43867f9b1d2dcfaab7c7f70e20e208d3 100644 (file)
@@ -26,6 +26,9 @@ struct listitem {
 #ifdef THREADS
   struct lockvector * lvector;
 #endif
+#ifdef JNI
+  struct jnireferences ** jnirefs;
+#endif
 #ifdef STM
   unsigned int tc_size;
   cliststruct_t **tc_structs;
index 9cc6a1329016cd8d2396235deb3bd9d9feb45c74..41645d8d0746d1d9315a04c32be07dacdc192db1 100644 (file)
@@ -18,6 +18,29 @@ struct jfieldID {
   char *fieldname;
 };
 
+struct _jobject {
+  void * ref;
+};
+
+#define MAXJNIREFS 2048
+struct jnireferences {
+  struct jnireferences * next;
+  int index
+  struct _jobject array[MAXJNIREFS];
+};
+
+#ifndef MAC
+struct _jobject * getwrapped(void * objptr);
+void jnipushframe();
+void jnipopframe();
+
+extern __thread struct jnireferences * jnirefs;
+#define JNIUNWRAP(x) ((x==NULL)?NULL:x->ref)
+#define JNIWRAP(x) getwrapper(x);
+#define JNIPUSHFRAME() jnipushframe();
+#define JNIPOPFRAME() jnipopframe();
+#endif
+
 jint RC_GetVersion(JNIEnv *);
 jclass RC_DefineClass(JNIEnv * env, const char * c, jobject loader, const jbyte * buf, jsize bufLen);
 jclass RC_FindClass(JNIEnv * env, const char *classname);
index 08584edf21ffa786513e59eb0e48d1b3e2c88731..f016b9e7a23ab48b415da30af298f4ef8c2673ad 100644 (file)
@@ -1,6 +1,28 @@
 #include<jni.h>
 #include<jni-private.h>
 
+#ifndef MAC
+struct _jobject * getwrapped(void * objptr) {
+  if ((jnirefs->index)>=MAXJNIREFS)
+    printf("OVERFLOW IN JOBJECT\n");
+  struct _jobject *ptr=&jnirefs->array[jnirefs->index++];
+  ptr->ref=objptr;
+  return ptr;
+}
+
+void jnipushframe() {
+  struct jnireferences *ptr=calloc(1, sizeof(struct jnireferences));
+  ptr->next=jnirefs;
+  jnirefs=ptr;
+}
+
+void jnipopframe() {
+  struct jnireferences *ptr=jnirefs;
+  jnirefs=ptr->next;
+  free(ptr);
+}
+#endif
+
 jint RC_GetVersion(JNIEnv * env) {
   return JNI_VERSION_1_1;
 }