79 } |
79 } |
80 |
80 |
81 void ciMethodData::load_extra_data() { |
81 void ciMethodData::load_extra_data() { |
82 MethodData* mdo = get_MethodData(); |
82 MethodData* mdo = get_MethodData(); |
83 |
83 |
84 MutexLocker(mdo->extra_data_lock()); |
84 MutexLocker ml(mdo->extra_data_lock()); |
85 |
85 |
86 // speculative trap entries also hold a pointer to a Method so need to be translated |
86 // speculative trap entries also hold a pointer to a Method so need to be translated |
87 DataLayout* dp_src = mdo->extra_data_base(); |
87 DataLayout* dp_src = mdo->extra_data_base(); |
88 DataLayout* end_src = mdo->args_data_limit(); |
88 DataLayout* end_src = mdo->args_data_limit(); |
89 DataLayout* dp_dst = extra_data_base(); |
89 DataLayout* dp_dst = extra_data_base(); |
101 memcpy(dp_dst, dp_src, ((intptr_t)MethodData::next_extra(dp_src)) - ((intptr_t)dp_src)); |
101 memcpy(dp_dst, dp_src, ((intptr_t)MethodData::next_extra(dp_src)) - ((intptr_t)dp_src)); |
102 } |
102 } |
103 |
103 |
104 switch(tag) { |
104 switch(tag) { |
105 case DataLayout::speculative_trap_data_tag: { |
105 case DataLayout::speculative_trap_data_tag: { |
106 ciSpeculativeTrapData* data_dst = new ciSpeculativeTrapData(dp_dst); |
106 ciSpeculativeTrapData data_dst(dp_dst); |
107 SpeculativeTrapData* data_src = new SpeculativeTrapData(dp_src); |
107 SpeculativeTrapData data_src(dp_src); |
108 |
108 |
109 data_dst->translate_from(data_src); |
109 { // During translation a safepoint can happen or VM lock can be taken (e.g., Compile_lock). |
110 |
110 MutexUnlocker ml(mdo->extra_data_lock()); |
111 #ifdef ASSERT |
111 data_dst.translate_from(&data_src); |
112 SpeculativeTrapData* data_src2 = new SpeculativeTrapData(dp_src); |
112 } |
113 assert(data_src2->method() == data_src->method() && data_src2->bci() == data_src->bci(), "entries changed while translating"); |
|
114 #endif |
|
115 |
|
116 break; |
113 break; |
117 } |
114 } |
118 case DataLayout::bit_data_tag: |
115 case DataLayout::bit_data_tag: |
119 break; |
116 break; |
120 case DataLayout::no_tag: |
117 case DataLayout::no_tag: |
121 case DataLayout::arg_info_data_tag: |
118 case DataLayout::arg_info_data_tag: |
122 // An empty slot or ArgInfoData entry marks the end of the trap data |
119 // An empty slot or ArgInfoData entry marks the end of the trap data |
123 return; |
120 { |
|
121 return; // Need a block to avoid SS compiler bug |
|
122 } |
124 default: |
123 default: |
125 fatal("bad tag = %d", dp_dst->tag()); |
124 fatal("bad tag = %d", tag); |
126 } |
125 } |
127 } |
126 } |
128 } |
127 } |
129 |
128 |
130 void ciMethodData::load_data() { |
129 void ciMethodData::load_data() { |