1061 assert((int)grow_by > 0, "sanity"); |
1061 assert((int)grow_by > 0, "sanity"); |
1062 int monoff = jvms->monoff(); |
1062 int monoff = jvms->monoff(); |
1063 int scloff = jvms->scloff(); |
1063 int scloff = jvms->scloff(); |
1064 int endoff = jvms->endoff(); |
1064 int endoff = jvms->endoff(); |
1065 assert(endoff == (int)req(), "no other states or debug info after me"); |
1065 assert(endoff == (int)req(), "no other states or debug info after me"); |
1066 assert(jvms->scl_size() == 0, "parsed code should not have scalar objects"); |
|
1067 Node* top = Compile::current()->top(); |
1066 Node* top = Compile::current()->top(); |
1068 for (uint i = 0; i < grow_by; i++) { |
1067 for (uint i = 0; i < grow_by; i++) { |
1069 ins_req(monoff, top); |
1068 ins_req(monoff, top); |
1070 } |
1069 } |
1071 jvms->set_monoff(monoff + grow_by); |
1070 jvms->set_monoff(monoff + grow_by); |
1077 // Add a LockNode, which points to both the original BoxLockNode (the |
1076 // Add a LockNode, which points to both the original BoxLockNode (the |
1078 // stack space for the monitor) and the Object being locked. |
1077 // stack space for the monitor) and the Object being locked. |
1079 const int MonitorEdges = 2; |
1078 const int MonitorEdges = 2; |
1080 assert(JVMState::logMonitorEdges == exact_log2(MonitorEdges), "correct MonitorEdges"); |
1079 assert(JVMState::logMonitorEdges == exact_log2(MonitorEdges), "correct MonitorEdges"); |
1081 assert(req() == jvms()->endoff(), "correct sizing"); |
1080 assert(req() == jvms()->endoff(), "correct sizing"); |
1082 assert((jvms()->scl_size() == 0), "parsed code should not have scalar objects"); |
|
1083 int nextmon = jvms()->scloff(); |
1081 int nextmon = jvms()->scloff(); |
1084 if (GenerateSynchronizationCode) { |
1082 if (GenerateSynchronizationCode) { |
1085 add_req(lock->box_node()); |
1083 ins_req(nextmon, lock->box_node()); |
1086 add_req(lock->obj_node()); |
1084 ins_req(nextmon+1, lock->obj_node()); |
1087 } else { |
1085 } else { |
1088 Node* top = Compile::current()->top(); |
1086 Node* top = Compile::current()->top(); |
1089 add_req(top); |
1087 ins_req(nextmon, top); |
1090 add_req(top); |
1088 ins_req(nextmon, top); |
1091 } |
1089 } |
1092 jvms()->set_scloff(nextmon+MonitorEdges); |
1090 jvms()->set_scloff(nextmon + MonitorEdges); |
1093 jvms()->set_endoff(req()); |
1091 jvms()->set_endoff(req()); |
1094 } |
1092 } |
1095 |
1093 |
1096 void SafePointNode::pop_monitor() { |
1094 void SafePointNode::pop_monitor() { |
1097 // Delete last monitor from debug info |
1095 // Delete last monitor from debug info |
1098 assert((jvms()->scl_size() == 0), "parsed code should not have scalar objects"); |
|
1099 debug_only(int num_before_pop = jvms()->nof_monitors()); |
1096 debug_only(int num_before_pop = jvms()->nof_monitors()); |
1100 const int MonitorEdges = (1<<JVMState::logMonitorEdges); |
1097 const int MonitorEdges = 2; |
|
1098 assert(JVMState::logMonitorEdges == exact_log2(MonitorEdges), "correct MonitorEdges"); |
1101 int scloff = jvms()->scloff(); |
1099 int scloff = jvms()->scloff(); |
1102 int endoff = jvms()->endoff(); |
1100 int endoff = jvms()->endoff(); |
1103 int new_scloff = scloff - MonitorEdges; |
1101 int new_scloff = scloff - MonitorEdges; |
1104 int new_endoff = endoff - MonitorEdges; |
1102 int new_endoff = endoff - MonitorEdges; |
1105 jvms()->set_scloff(new_scloff); |
1103 jvms()->set_scloff(new_scloff); |
1106 jvms()->set_endoff(new_endoff); |
1104 jvms()->set_endoff(new_endoff); |
1107 while (scloff > new_scloff) del_req(--scloff); |
1105 while (scloff > new_scloff) del_req_ordered(--scloff); |
1108 assert(jvms()->nof_monitors() == num_before_pop-1, ""); |
1106 assert(jvms()->nof_monitors() == num_before_pop-1, ""); |
1109 } |
1107 } |
1110 |
1108 |
1111 Node *SafePointNode::peek_monitor_box() const { |
1109 Node *SafePointNode::peek_monitor_box() const { |
1112 int mon = jvms()->nof_monitors() - 1; |
1110 int mon = jvms()->nof_monitors() - 1; |
1167 uint SafePointScalarObjectNode::match_edge(uint idx) const { |
1165 uint SafePointScalarObjectNode::match_edge(uint idx) const { |
1168 return 0; |
1166 return 0; |
1169 } |
1167 } |
1170 |
1168 |
1171 SafePointScalarObjectNode* |
1169 SafePointScalarObjectNode* |
1172 SafePointScalarObjectNode::clone(int jvms_adj, Dict* sosn_map) const { |
1170 SafePointScalarObjectNode::clone(Dict* sosn_map) const { |
1173 void* cached = (*sosn_map)[(void*)this]; |
1171 void* cached = (*sosn_map)[(void*)this]; |
1174 if (cached != NULL) { |
1172 if (cached != NULL) { |
1175 return (SafePointScalarObjectNode*)cached; |
1173 return (SafePointScalarObjectNode*)cached; |
1176 } |
1174 } |
1177 SafePointScalarObjectNode* res = (SafePointScalarObjectNode*)Node::clone(); |
1175 SafePointScalarObjectNode* res = (SafePointScalarObjectNode*)Node::clone(); |
1178 res->_first_index += jvms_adj; |
|
1179 sosn_map->Insert((void*)this, (void*)res); |
1176 sosn_map->Insert((void*)this, (void*)res); |
1180 return res; |
1177 return res; |
1181 } |
1178 } |
1182 |
1179 |
1183 |
1180 |