Mercurial > hg > truffle
comparison src/share/vm/graal/graalCompilerToVM.cpp @ 11513:8d4e5e08d83f
Fix graalCompilerToVM::initializeBytecode regarding bytecode rewritting for methods that are not rewritten.
Use the BytecodeStream in a way that does not require pre-processing for breakpoints
author | Gilles Duboscq <duboscq@ssw.jku.at> |
---|---|
date | Tue, 03 Sep 2013 14:14:09 +0200 |
parents | 001c41b01d13 |
children | a3b39ab7c453 |
comparison
equal
deleted
inserted
replaced
11512:38acec26d535 | 11513:8d4e5e08d83f |
---|---|
62 C2V_ENTRY(jbyteArray, initializeBytecode, (JNIEnv *env, jobject, jlong metaspace_method, jbyteArray result)) | 62 C2V_ENTRY(jbyteArray, initializeBytecode, (JNIEnv *env, jobject, jlong metaspace_method, jbyteArray result)) |
63 methodHandle method = asMethod(metaspace_method); | 63 methodHandle method = asMethod(metaspace_method); |
64 ResourceMark rm; | 64 ResourceMark rm; |
65 | 65 |
66 int code_size = method->code_size(); | 66 int code_size = method->code_size(); |
67 jbyte* reconstituted_code = NULL; | 67 jbyte* reconstituted_code = NEW_RESOURCE_ARRAY(jbyte, code_size); |
68 | 68 |
69 // replace all breakpoints - must be done before undoing any rewriting | 69 bool is_rewritten = method->method_holder()->is_rewritten(); |
70 if (method->number_of_breakpoints() > 0) { | |
71 reconstituted_code = NEW_RESOURCE_ARRAY(jbyte, code_size); | |
72 memcpy(reconstituted_code, (jbyte *) method->code_base(), code_size); | |
73 BreakpointInfo* bp = InstanceKlass::cast(method->method_holder())->breakpoints(); | |
74 for (; bp != NULL; bp = bp->next()) { | |
75 if (bp->match(method())) { | |
76 jbyte code = bp->orig_bytecode(); | |
77 reconstituted_code[bp->bci()] = code; | |
78 } | |
79 } | |
80 } | |
81 | |
82 // iterate over all bytecodes and replace non-Java bytecodes | 70 // iterate over all bytecodes and replace non-Java bytecodes |
83 if (RewriteBytecodes || RewriteFrequentPairs || InstanceKlass::cast(method->method_holder())->is_rewritten()) { | 71 |
84 if (reconstituted_code == NULL) { | 72 for (BytecodeStream s(method); s.next() != Bytecodes::_illegal; ) { |
85 reconstituted_code = NEW_RESOURCE_ARRAY(jbyte, code_size); | 73 Bytecodes::Code code = s.code(); |
86 memcpy(reconstituted_code, (jbyte *) method->code_base(), code_size); | 74 Bytecodes::Code raw_code = s.raw_code(); |
87 } | 75 int bci = s.bci(); |
88 | 76 int len = s.instruction_size(); |
89 for (BytecodeStream s(method); s.next() != Bytecodes::_illegal; ) { | 77 |
90 Bytecodes::Code code = s.code(); | 78 // Restore original byte code. |
91 Bytecodes::Code raw_code = s.raw_code(); | 79 reconstituted_code[bci] = (jbyte) (s.is_wide()? Bytecodes::_wide : code); |
92 int bci = s.bci(); | 80 if (len > 1) { |
93 | 81 memcpy(&reconstituted_code[bci+1], s.bcp()+1, len-1); |
94 // Restore original byte code. The Bytecodes::is_java_code check | 82 } |
95 // also avoids overwriting wide bytecodes. | 83 |
96 if (!Bytecodes::is_java_code(raw_code)) { | 84 if (is_rewritten && len > 1) { |
97 reconstituted_code[bci] = (jbyte) code; | |
98 } | |
99 | |
100 // Restore the big-endian constant pool indexes. | 85 // Restore the big-endian constant pool indexes. |
101 // Cf. Rewriter::scan_method | 86 // Cf. Rewriter::scan_method |
102 switch (code) { | 87 switch (code) { |
103 case Bytecodes::_getstatic: | 88 case Bytecodes::_getstatic: |
104 case Bytecodes::_putstatic: | 89 case Bytecodes::_putstatic: |
139 } | 124 } |
140 } | 125 } |
141 } | 126 } |
142 } | 127 } |
143 | 128 |
144 if (reconstituted_code == NULL) { | 129 env->SetByteArrayRegion(result, 0, code_size, reconstituted_code); |
145 env->SetByteArrayRegion(result, 0, code_size, (jbyte *) method->code_base()); | |
146 } else { | |
147 env->SetByteArrayRegion(result, 0, code_size, reconstituted_code); | |
148 } | |
149 | 130 |
150 return result; | 131 return result; |
151 C2V_END | 132 C2V_END |
152 | 133 |
153 C2V_VMENTRY(jstring, getSignature, (JNIEnv *env, jobject, jlong metaspace_method)) | 134 C2V_VMENTRY(jstring, getSignature, (JNIEnv *env, jobject, jlong metaspace_method)) |