提交 37b39438 编写于 作者: K kamg

7030388: JCK test failed to reject invalid class check01304m10n.

Summary: Restrict fix for 7020118 to only when checking exception handlers
Reviewed-by: dcubed, dholmes
上级 b8839b42
...@@ -208,8 +208,10 @@ bool StackMapFrame::has_flag_match_exception( ...@@ -208,8 +208,10 @@ bool StackMapFrame::has_flag_match_exception(
return true; return true;
} }
bool StackMapFrame::is_assignable_to(const StackMapFrame* target, TRAPS) const { bool StackMapFrame::is_assignable_to(
if (_max_locals != target->max_locals() || _stack_size != target->stack_size()) { const StackMapFrame* target, bool is_exception_handler, TRAPS) const {
if (_max_locals != target->max_locals() ||
_stack_size != target->stack_size()) {
return false; return false;
} }
// Only need to compare type elements up to target->locals() or target->stack(). // Only need to compare type elements up to target->locals() or target->stack().
...@@ -222,7 +224,7 @@ bool StackMapFrame::is_assignable_to(const StackMapFrame* target, TRAPS) const { ...@@ -222,7 +224,7 @@ bool StackMapFrame::is_assignable_to(const StackMapFrame* target, TRAPS) const {
bool match_flags = (_flags | target->flags()) == target->flags(); bool match_flags = (_flags | target->flags()) == target->flags();
return match_locals && match_stack && return match_locals && match_stack &&
(match_flags || has_flag_match_exception(target)); (match_flags || (is_exception_handler && has_flag_match_exception(target)));
} }
VerificationType StackMapFrame::pop_stack_ex(VerificationType type, TRAPS) { VerificationType StackMapFrame::pop_stack_ex(VerificationType type, TRAPS) {
......
...@@ -134,7 +134,8 @@ class StackMapFrame : public ResourceObj { ...@@ -134,7 +134,8 @@ class StackMapFrame : public ResourceObj {
void copy_stack(const StackMapFrame* src); void copy_stack(const StackMapFrame* src);
// Return true if this stack map frame is assignable to target. // Return true if this stack map frame is assignable to target.
bool is_assignable_to(const StackMapFrame* target, TRAPS) const; bool is_assignable_to(const StackMapFrame* target,
bool is_exception_handler, TRAPS) const;
// Push type into stack type array. // Push type into stack type array.
inline void push_stack(VerificationType type, TRAPS) { inline void push_stack(VerificationType type, TRAPS) {
......
...@@ -98,10 +98,13 @@ bool StackMapTable::match_stackmap( ...@@ -98,10 +98,13 @@ bool StackMapTable::match_stackmap(
bool result = true; bool result = true;
StackMapFrame *stackmap_frame = _frame_array[frame_index]; StackMapFrame *stackmap_frame = _frame_array[frame_index];
if (match) { if (match) {
// when checking handler target, match == true && update == false
bool is_exception_handler = !update;
// Has direct control flow from last instruction, need to match the two // Has direct control flow from last instruction, need to match the two
// frames. // frames.
result = frame->is_assignable_to( result = frame->is_assignable_to(
stackmap_frame, CHECK_VERIFY_(frame->verifier(), false)); stackmap_frame, is_exception_handler,
CHECK_VERIFY_(frame->verifier(), false));
} }
if (update) { if (update) {
// Use the frame in stackmap table as current frame // Use the frame in stackmap table as current frame
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册