diff src/share/vm/graal/graalCompilerToVM.cpp @ 5150:fdd9dd4508fa

some GC fixes avoid non-Java bytecodes in code() array passed to Graal
author Christian Haeubl <christian.haeubl@oracle.com>
date Thu, 22 Mar 2012 18:54:02 -0700
parents ab038e0d6b43
children ae72dd38eeb1
line wrap: on
line diff
--- a/src/share/vm/graal/graalCompilerToVM.cpp	Wed Mar 21 16:33:58 2012 -0700
+++ b/src/share/vm/graal/graalCompilerToVM.cpp	Thu Mar 22 18:54:02 2012 -0700
@@ -52,9 +52,32 @@
 JNIEXPORT jbyteArray JNICALL Java_com_oracle_graal_hotspot_bridge_CompilerToVMImpl_RiMethod_1code(JNIEnv *env, jobject, jobject hotspot_method) {
   TRACE_graal_3("CompilerToVM::RiMethod_code");
   methodHandle method = getMethodFromHotSpotMethod(hotspot_method);
+  
+  // copy all bytecodes
   int code_size = method->code_size();
   jbyteArray result = env->NewByteArray(code_size);
   env->SetByteArrayRegion(result, 0, code_size, (const jbyte *) method->code_base());
+  
+  // iterate over all bytecodes and replace non-Java bytecodes
+  if (RewriteBytecodes || RewriteFrequentPairs) {
+    BytecodeStream s(method);
+    while(!s.is_last_bytecode()) {
+      jbyte code = s.next();
+      env->SetByteArrayRegion(result, s.bci(), 1, &code);
+    }
+  }
+
+  // replace all breakpoints
+  if (method->number_of_breakpoints() > 0) {
+    BreakpointInfo* bp = instanceKlass::cast(method->method_holder())->breakpoints();
+    for (; bp != NULL; bp = bp->next()) {
+      if (bp->match(method())) {
+        jbyte code = bp->orig_bytecode();
+        env->SetByteArrayRegion(result, bp->bci(), 1, &code);
+      }
+    }
+  }
+
   return result;
 }