Compare commits

..

17 Commits

Author SHA1 Message Date
Roland Westrelin
dfe3c943ac JBR-4256: 8275330: C2: assert(n->is_Root() || n->is_Region() || n->is_Phi() || n->is_MachMerge() || def_block->dominates(block)) failed: uses must be dominated by definitions
Reviewed-by: thartmann, chagedorn
(cherry picked from commit 3e798dd40c)
2022-02-18 20:48:54 +07:00
Roland Westrelin
bcb764c139 JBR-4256: backport 8280799: С2: assert(false) failed: cyclic dependency prevents range check elimination
Reviewed-by: thartmann, kvn
2022-02-18 13:40:41 +07:00
Vitaly Provodin
711684d1e2 fixup! JBR-4154 extract version info from sources - check JDK_BUILD_NUMBER not empty 2022-02-16 15:43:20 +07:00
Vitaly Provodin
a4cf32a98e exclude javax/imageio/plugins/external_plugin_tests/TestClassPathPlugin.sh from commit testing 2022-02-16 10:10:24 +07:00
Vitaly Provodin
73bb0cdf2f fixup! JBR-4154 extract version info from sources 2022-02-15 17:25:04 +07:00
Vitaly Provodin
0e012935af exclude java/awt/Dialog/NonResizableDialogSysMenuResize/NonResizableDialogSysMenuResize.java and java/awt/Dialog/NestedDialogs/Modeless/NestedModelessDialogTest.java TBD windows-all 2022-02-14 09:56:48 +07:00
Vitaly Provodin
07a07d61bb fixup! JBR-4154 extract version info from sources 2022-02-12 18:55:08 +07:00
Vitaly Provodin
629cab8653 JBR-4154 extract version info from sources 2022-02-12 18:47:07 +07:00
Alexey Ushakov
0019142eaf JBR-4224 java/awt/image/VolatileImage/GradientPaints.java: Number of mismatches (300000) exceeds limit (54000) with tolerance=5
Updated reg test to handle contentLost event
2022-02-11 16:44:31 +01:00
Artem Semenov
41feaaedf0 8281338: NSAccessibilityPressAction action for tree node and NSAccessibilityShowMenuAcgtion action not working
Reviewed-by: ant, kizune
2022-02-10 17:58:28 +03:00
Vitaly Provodin
3948c3538c JBR-4099 make test-image on jbrsdk_jcef step, introduce do_maketest flag 2022-02-10 16:30:41 +07:00
Maxim Kartashev
497d00d82e JBR-3950 javax/swing/JFormattedTextField/TestSelectedTextBackgroundColor.java: The expected background color for Selected Text was not found
Made Robot image capture work when sun.java2d.uiScale
doesn't match the desktop scale on Linux.
Improved tests to verify that color picking is precise to the pixel
(only on Linux and Windows; Mac may not always give precise color
of the desired pixel).
2022-02-10 12:24:59 +03:00
Dmitry Batrak
37ceee0ce3 JBR-4194 RenderPerfTest: TextNoAA >10% degradation in OGL
(cherry picked from commit 42fa3e3d34)
2022-02-10 11:48:28 +03:00
Vitaly Provodin
74dfdfbbfe update the link to JBR17 for IDEA 2022.1 EAP 2022-02-10 04:04:26 +07:00
Nikita Provotorov
8f1223d69a JBR-3299: The test /jb/sun/awt/macos/NationalLayoutTest/Layout_ABC.java fails on MacOS.
Fixes the Layout_*.java tests by giving them to know the <Ctrl + key> combinations can generate KEY_TYPED event.

(cherry picked from commit eae5198b20)
2022-02-09 01:52:57 +07:00
Fairoz Matte
6d4c958c9a 8274718: runtime/cds/appcds/LambdaEagerInit.java fails with -XX:-CompactStrings
Reviewed-by: iklam, ccheung
(cherry picked from commit d8f6b6c19a)
2022-02-08 10:48:58 +07:00
Alexey Ushakov
8730341c70 JBR-4112 macOS: SIGILL at [libsystem_kernel] __kill in OOME: Java heap space at java.awt.image.DataBufferInt.<init>
Reg test update: replace management api with jfr
2022-02-07 10:49:06 +01:00
34 changed files with 1021 additions and 352 deletions

View File

@@ -11,6 +11,7 @@ can be found on the [releases page](https://github.com/JetBrains/JetBrainsRuntim
| IDE Version | Latest JBR | Date Released |
| --- | --- | --- |
| 2022.1 | [17_0_2-b315.1](https://github.com/JetBrains/JetBrainsRuntime/releases/tag/jbr17_0_2b315.1) | 09-Feb-2022 |
| 2021.3 | [17_0_1-b164.8](https://github.com/JetBrains/JetBrainsRuntime/releases/tag/jbr17_0_1b164.8) | 15-Nov-2021 |
## Contents

View File

@@ -30,13 +30,15 @@ architecture=$3 # aarch64 or x64
bundle_type=$(do_maketest)
do_maketest=$?
tag_prefix="jbr-"
OPENJDK_TAG=$(git log --simplify-by-decoration --decorate=short --pretty=short | grep "$tag_prefix" | cut -d "(" -f2 | cut -d ")" -f1 | awk '{print $2}' | sort -t "-" -k 2 -g | tail -n 1)
VERSION_FEATURE=$(getVersionProp "DEFAULT_VERSION_FEATURE")
VERSION_INTERIM=$(getVersionProp "DEFAULT_VERSION_INTERIM")
VERSION_UPDATE=$(getVersionProp "DEFAULT_VERSION_UPDATE")
[[ $VERSION_UPDATE = 0 ]] && JBSDK_VERSION="$VERSION_FEATURE" || JBSDK_VERSION="${VERSION_FEATURE}.${VERSION_INTERIM}.${VERSION_UPDATE}"
echo "##teamcity[setParameter name='env.JBSDK_VERSION' value='${JBSDK_VERSION}']"
JDK_BUILD_NUMBER=${JDK_BUILD_NUMBER:=0}
JDK_BUILD_NUMBER=${JDK_BUILD_NUMBER:=$(echo $OPENJDK_TAG | awk -F "-|[+]" '{print $3}')}
[ -z $JDK_BUILD_NUMBER ] && JDK_BUILD_NUMBER=1
echo "##teamcity[setParameter name='env.JDK_UPDATE_NUMBER' value='${JDK_BUILD_NUMBER}']"
VENDOR_NAME="JetBrains s.r.o."

View File

@@ -80,6 +80,7 @@ RELEASE_NAME=linux-x86_64-server-release
case "$bundle_type" in
"jcef")
do_reset_changes=1
do_maketest=1
;;
"nomod" | "")
bundle_type=""
@@ -124,7 +125,7 @@ if [ "$bundle_type" == "jcef" ] || [ "$bundle_type" == "fd" ] || [ "$bundle_type
fi
create_image_bundle "$JBRSDK_BUNDLE${jbr_name_postfix}" $JBRSDK_BUNDLE $JSDK_MODS_DIR "$modules" || do_exit $?
if [ "$bundle_type" == "jcef" ]; then
if [ $do_maketest -eq 1 ]; then
JBRSDK_TEST=${JBRSDK_BUNDLE}-${JBSDK_VERSION}-linux-test-x64-b${build_number}
echo Creating "$JBRSDK_TEST" ...
[ $do_reset_changes -eq 1 ] && git checkout HEAD modules.list src/java.desktop/share/classes/module-info.java

View File

@@ -119,6 +119,7 @@ RELEASE_NAME=macosx-${CONF_ARCHITECTURE}-server-release
case "$bundle_type" in
"jcef")
do_reset_changes=1
do_maketest=1
;;
"nomod" | "")
bundle_type=""
@@ -162,7 +163,7 @@ if [ "$bundle_type" == "jcef" ] || [ "$bundle_type" == "fd" ] || [ "$bundle_type
fi
create_image_bundle "$JBRSDK_BUNDLE${jbr_name_postfix}" "$JBRSDK_BUNDLE" "$JSDK_MODS_DIR" "$modules" || do_exit $?
if [ "$bundle_type" == "jcef" ]; then
if [ $do_maketest -eq 1 ]; then
JBRSDK_TEST=${JBRSDK_BUNDLE}-${JBSDK_VERSION}-osx-test-${architecture}-b${build_number}
echo Creating "$JBRSDK_TEST" ...
[ $do_reset_changes -eq 1 ] && git checkout HEAD modules.list src/java.desktop/share/classes/module-info.java

View File

@@ -66,6 +66,7 @@ RELEASE_NAME=windows-x86_64-server-release
case "$bundle_type" in
"jcef")
do_reset_changes=0
do_maketest=1
;;
"nomod" | "")
bundle_type=""
@@ -79,13 +80,13 @@ esac
if [ -z "$INC_BUILD" ]; then
do_configure || do_exit $?
if [ "$bundle_type" == "jcef" ]; then
if [ $do_maketest -eq 1 ]; then
make LOG=info CONF=$RELEASE_NAME clean images test-image || do_exit $?
else
make LOG=info CONF=$RELEASE_NAME clean images || do_exit $?
fi
else
if [ "$bundle_type" == "jcef" ]; then
if [ $do_maketest -eq 1 ]; then
make LOG=info CONF=$RELEASE_NAME images test-image || do_exit $?
else
make LOG=info CONF=$RELEASE_NAME images || do_exit $?

View File

@@ -341,9 +341,9 @@ void PhaseIdealLoop::clone_skeleton_predicates_to_unswitched_loop(IdealLoopTree*
assert(predicate->is_Proj() && predicate->as_Proj()->is_IfProj(), "predicate must be a projection of an if node");
IfProjNode* predicate_proj = predicate->as_IfProj();
ProjNode* fast_proj = clone_skeleton_predicate_for_unswitched_loops(iff, predicate_proj, uncommon_proj, reason, iffast_pred, loop);
ProjNode* fast_proj = clone_skeleton_predicate_for_unswitched_loops(iff, predicate_proj, reason, iffast_pred);
assert(skeleton_predicate_has_opaque(fast_proj->in(0)->as_If()), "must find skeleton predicate for fast loop");
ProjNode* slow_proj = clone_skeleton_predicate_for_unswitched_loops(iff, predicate_proj, uncommon_proj, reason, ifslow_pred, loop);
ProjNode* slow_proj = clone_skeleton_predicate_for_unswitched_loops(iff, predicate_proj, reason, ifslow_pred);
assert(skeleton_predicate_has_opaque(slow_proj->in(0)->as_If()), "must find skeleton predicate for slow loop");
// Update control dependent data nodes.
@@ -397,10 +397,10 @@ void PhaseIdealLoop::get_skeleton_predicates(Node* predicate, Unique_Node_List&
// Clone a skeleton predicate for an unswitched loop. OpaqueLoopInit and OpaqueLoopStride nodes are cloned and uncommon
// traps are kept for the predicate (a Halt node is used later when creating pre/main/post loops and copying this cloned
// predicate again).
ProjNode* PhaseIdealLoop::clone_skeleton_predicate_for_unswitched_loops(Node* iff, ProjNode* predicate, Node* uncommon_proj,
Deoptimization::DeoptReason reason, ProjNode* output_proj,
IdealLoopTree* loop) {
Node* bol = clone_skeleton_predicate_bool(iff, NULL, NULL, predicate, uncommon_proj, output_proj, loop);
ProjNode* PhaseIdealLoop::clone_skeleton_predicate_for_unswitched_loops(Node* iff, ProjNode* predicate,
Deoptimization::DeoptReason reason,
ProjNode* output_proj) {
Node* bol = clone_skeleton_predicate_bool(iff, NULL, NULL, output_proj);
ProjNode* proj = create_new_if_for_predicate(output_proj, NULL, reason, iff->Opcode(), predicate->is_IfTrue());
_igvn.replace_input_of(proj->in(0), 1, bol);
_igvn.replace_input_of(output_proj->in(0), 0, proj);

View File

@@ -1264,10 +1264,12 @@ void PhaseIdealLoop::copy_skeleton_predicates_to_main_loop_helper(Node* predicat
// Clone the skeleton predicate twice and initialize one with the initial
// value of the loop induction variable. Leave the other predicate
// to be initialized when increasing the stride during loop unrolling.
prev_proj = clone_skeleton_predicate_for_main_loop(iff, opaque_init, NULL, predicate, uncommon_proj, current_proj, outer_loop, prev_proj);
prev_proj = clone_skeleton_predicate_for_main_or_post_loop(iff, opaque_init, NULL, predicate, uncommon_proj,
current_proj, outer_loop, prev_proj);
assert(skeleton_predicate_has_opaque(prev_proj->in(0)->as_If()), "");
prev_proj = clone_skeleton_predicate_for_main_loop(iff, init, stride, predicate, uncommon_proj, current_proj, outer_loop, prev_proj);
prev_proj = clone_skeleton_predicate_for_main_or_post_loop(iff, init, stride, predicate, uncommon_proj,
current_proj, outer_loop, prev_proj);
assert(!skeleton_predicate_has_opaque(prev_proj->in(0)->as_If()), "");
// Rewire any control inputs from the cloned skeleton predicates down to the main and post loop for data nodes that are part of the
@@ -1344,8 +1346,7 @@ bool PhaseIdealLoop::skeleton_predicate_has_opaque(IfNode* iff) {
// Clone the skeleton predicate bool for a main or unswitched loop:
// Main loop: Set new_init and new_stride nodes as new inputs.
// Unswitched loop: new_init and new_stride are both NULL. Clone OpaqueLoopInit and OpaqueLoopStride instead.
Node* PhaseIdealLoop::clone_skeleton_predicate_bool(Node* iff, Node* new_init, Node* new_stride, Node* predicate, Node* uncommon_proj,
Node* control, IdealLoopTree* outer_loop) {
Node* PhaseIdealLoop::clone_skeleton_predicate_bool(Node* iff, Node* new_init, Node* new_stride, Node* control) {
Node_Stack to_clone(2);
to_clone.push(iff->in(1), 1);
uint current = C->unique();
@@ -1421,9 +1422,9 @@ Node* PhaseIdealLoop::clone_skeleton_predicate_bool(Node* iff, Node* new_init, N
// Clone a skeleton predicate for the main loop. new_init and new_stride are set as new inputs. Since the predicates cannot fail at runtime,
// Halt nodes are inserted instead of uncommon traps.
Node* PhaseIdealLoop::clone_skeleton_predicate_for_main_loop(Node* iff, Node* new_init, Node* new_stride, Node* predicate, Node* uncommon_proj,
Node* control, IdealLoopTree* outer_loop, Node* input_proj) {
Node* result = clone_skeleton_predicate_bool(iff, new_init, new_stride, predicate, uncommon_proj, control, outer_loop);
Node* PhaseIdealLoop::clone_skeleton_predicate_for_main_or_post_loop(Node* iff, Node* new_init, Node* new_stride, Node* predicate, Node* uncommon_proj,
Node* control, IdealLoopTree* outer_loop, Node* input_proj) {
Node* result = clone_skeleton_predicate_bool(iff, new_init, new_stride, control);
Node* proj = predicate->clone();
Node* other_proj = uncommon_proj->clone();
Node* new_iff = iff->clone();
@@ -1437,8 +1438,8 @@ Node* PhaseIdealLoop::clone_skeleton_predicate_for_main_loop(Node* iff, Node* ne
C->root()->add_req(halt);
new_iff->set_req(0, input_proj);
register_control(new_iff, outer_loop->_parent, input_proj);
register_control(proj, outer_loop->_parent, new_iff);
register_control(new_iff, outer_loop == _ltree_root ? _ltree_root : outer_loop->_parent, input_proj);
register_control(proj, outer_loop == _ltree_root ? _ltree_root : outer_loop->_parent, new_iff);
register_control(other_proj, _ltree_root, new_iff);
register_control(halt, _ltree_root, other_proj);
return proj;
@@ -1521,7 +1522,8 @@ void PhaseIdealLoop::insert_pre_post_loops(IdealLoopTree *loop, Node_List &old_n
// Add the post loop
const uint idx_before_pre_post = Compile::current()->unique();
CountedLoopNode *post_head = NULL;
Node *main_exit = insert_post_loop(loop, old_new, main_head, main_end, incr, limit, post_head);
Node* post_incr = incr;
Node* main_exit = insert_post_loop(loop, old_new, main_head, main_end, post_incr, limit, post_head);
const uint idx_after_post_before_pre = Compile::current()->unique();
//------------------------------
@@ -1620,6 +1622,7 @@ void PhaseIdealLoop::insert_pre_post_loops(IdealLoopTree *loop, Node_List &old_n
assert(post_head->in(1)->is_IfProj(), "must be zero-trip guard If node projection of the post loop");
copy_skeleton_predicates_to_main_loop(pre_head, castii, stride, outer_loop, outer_main_head, dd_main_head,
idx_before_pre_post, idx_after_post_before_pre, min_taken, post_head->in(1), old_new);
copy_skeleton_predicates_to_post_loop(outer_main_head, post_head, post_incr, stride);
// Step B4: Shorten the pre-loop to run only 1 iteration (for now).
// RCE and alignment may change this later.
@@ -1742,6 +1745,7 @@ void PhaseIdealLoop::insert_vector_post_loop(IdealLoopTree *loop, Node_List &old
// In this case we throw away the result as we are not using it to connect anything else.
CountedLoopNode *post_head = NULL;
insert_post_loop(loop, old_new, main_head, main_end, incr, limit, post_head);
copy_skeleton_predicates_to_post_loop(main_head->skip_strip_mined(), post_head, incr, main_head->stride());
// It's difficult to be precise about the trip-counts
// for post loops. They are usually very short,
@@ -1788,6 +1792,7 @@ void PhaseIdealLoop::insert_scalar_rced_post_loop(IdealLoopTree *loop, Node_List
// In this case we throw away the result as we are not using it to connect anything else.
CountedLoopNode *post_head = NULL;
insert_post_loop(loop, old_new, main_head, main_end, incr, limit, post_head);
copy_skeleton_predicates_to_post_loop(main_head->skip_strip_mined(), post_head, incr, main_head->stride());
// It's difficult to be precise about the trip-counts
// for post loops. They are usually very short,
@@ -1804,9 +1809,9 @@ void PhaseIdealLoop::insert_scalar_rced_post_loop(IdealLoopTree *loop, Node_List
//------------------------------insert_post_loop-------------------------------
// Insert post loops. Add a post loop to the given loop passed.
Node *PhaseIdealLoop::insert_post_loop(IdealLoopTree *loop, Node_List &old_new,
CountedLoopNode *main_head, CountedLoopEndNode *main_end,
Node *incr, Node *limit, CountedLoopNode *&post_head) {
Node *PhaseIdealLoop::insert_post_loop(IdealLoopTree* loop, Node_List& old_new,
CountedLoopNode* main_head, CountedLoopEndNode* main_end,
Node*& incr, Node* limit, CountedLoopNode*& post_head) {
IfNode* outer_main_end = main_end;
IdealLoopTree* outer_loop = loop;
if (main_head->is_strip_mined()) {
@@ -1890,8 +1895,8 @@ Node *PhaseIdealLoop::insert_post_loop(IdealLoopTree *loop, Node_List &old_new,
}
// CastII for the new post loop:
Node* castii = cast_incr_before_loop(zer_opaq->in(1), zer_taken, post_head);
assert(castii != NULL, "no castII inserted");
incr = cast_incr_before_loop(zer_opaq->in(1), zer_taken, post_head);
assert(incr != NULL, "no castII inserted");
return new_main_exit;
}
@@ -1933,7 +1938,8 @@ void PhaseIdealLoop::update_main_loop_skeleton_predicates(Node* ctrl, CountedLoo
_igvn.replace_input_of(iff, 1, iff->in(1)->in(2));
} else {
// Add back predicates updated for the new stride.
prev_proj = clone_skeleton_predicate_for_main_loop(iff, init, max_value, entry, proj, ctrl, outer_loop, prev_proj);
prev_proj = clone_skeleton_predicate_for_main_or_post_loop(iff, init, max_value, entry, proj, ctrl, outer_loop,
prev_proj);
assert(!skeleton_predicate_has_opaque(prev_proj->in(0)->as_If()), "unexpected");
}
}
@@ -1945,6 +1951,34 @@ void PhaseIdealLoop::update_main_loop_skeleton_predicates(Node* ctrl, CountedLoo
}
}
void PhaseIdealLoop::copy_skeleton_predicates_to_post_loop(LoopNode* main_loop_head, CountedLoopNode* post_loop_head, Node* init, Node* stride) {
// Go over the skeleton predicates of the main loop and make a copy for the post loop with its initial iv value and
// stride as inputs.
Node* post_loop_entry = post_loop_head->in(LoopNode::EntryControl);
Node* main_loop_entry = main_loop_head->in(LoopNode::EntryControl);
IdealLoopTree* post_loop = get_loop(post_loop_head);
Node* ctrl = main_loop_entry;
Node* prev_proj = post_loop_entry;
while (ctrl != NULL && ctrl->is_Proj() && ctrl->in(0)->is_If()) {
IfNode* iff = ctrl->in(0)->as_If();
ProjNode* proj = iff->proj_out(1 - ctrl->as_Proj()->_con);
if (proj->unique_ctrl_out()->Opcode() != Op_Halt) {
break;
}
if (iff->in(1)->Opcode() == Op_Opaque4 && skeleton_predicate_has_opaque(iff)) {
prev_proj = clone_skeleton_predicate_for_main_or_post_loop(iff, init, stride, ctrl, proj, post_loop_entry,
post_loop, prev_proj);
assert(!skeleton_predicate_has_opaque(prev_proj->in(0)->as_If()), "unexpected");
}
ctrl = ctrl->in(0)->in(0);
}
if (prev_proj != post_loop_entry) {
_igvn.replace_input_of(post_loop_head, LoopNode::EntryControl, prev_proj);
set_idom(post_loop_head, prev_proj, dom_depth(post_loop_head));
}
}
//------------------------------do_unroll--------------------------------------
// Unroll the loop body one step - make each trip do 2 iterations.
void PhaseIdealLoop::do_unroll(IdealLoopTree *loop, Node_List &old_new, bool adjust_min_trip) {

View File

@@ -2150,12 +2150,14 @@ Node* CountedLoopNode::skip_predicates_from_entry(Node* ctrl) {
}
Node* CountedLoopNode::skip_predicates() {
Node* ctrl = in(LoopNode::EntryControl);
if (is_main_loop()) {
Node* ctrl = skip_strip_mined()->in(LoopNode::EntryControl);
ctrl = skip_strip_mined()->in(LoopNode::EntryControl);
}
if (is_main_loop() || is_post_loop()) {
return skip_predicates_from_entry(ctrl);
}
return in(LoopNode::EntryControl);
return ctrl;
}
@@ -5351,38 +5353,45 @@ void PhaseIdealLoop::build_loop_late_post_work(Node *n, bool pinned) {
}
assert(early == legal || legal != C->root(), "bad dominance of inputs");
if (least != early) {
// Move the node above predicates as far up as possible so a
// following pass of loop predication doesn't hoist a predicate
// that depends on it above that node.
Node* new_ctrl = least;
for (;;) {
if (!new_ctrl->is_Proj()) {
break;
}
CallStaticJavaNode* call = new_ctrl->as_Proj()->is_uncommon_trap_if_pattern(Deoptimization::Reason_none);
if (call == NULL) {
break;
}
int req = call->uncommon_trap_request();
Deoptimization::DeoptReason trap_reason = Deoptimization::trap_request_reason(req);
if (trap_reason != Deoptimization::Reason_loop_limit_check &&
trap_reason != Deoptimization::Reason_predicate &&
trap_reason != Deoptimization::Reason_profile_predicate) {
break;
}
Node* c = new_ctrl->in(0)->in(0);
if (is_dominator(c, early) && c != early) {
break;
}
new_ctrl = c;
}
least = new_ctrl;
}
// Try not to place code on a loop entry projection
// which can inhibit range check elimination.
if (least != early) {
Node* ctrl_out = least->unique_ctrl_out();
if (ctrl_out && ctrl_out->is_Loop() &&
least == ctrl_out->in(LoopNode::EntryControl)) {
// Move the node above predicates as far up as possible so a
// following pass of loop predication doesn't hoist a predicate
// that depends on it above that node.
Node* new_ctrl = least;
for (;;) {
if (!new_ctrl->is_Proj()) {
break;
}
CallStaticJavaNode* call = new_ctrl->as_Proj()->is_uncommon_trap_if_pattern(Deoptimization::Reason_none);
if (call == NULL) {
break;
}
int req = call->uncommon_trap_request();
Deoptimization::DeoptReason trap_reason = Deoptimization::trap_request_reason(req);
if (trap_reason != Deoptimization::Reason_loop_limit_check &&
trap_reason != Deoptimization::Reason_predicate &&
trap_reason != Deoptimization::Reason_profile_predicate) {
break;
}
Node* c = new_ctrl->in(0)->in(0);
if (is_dominator(c, early) && c != early) {
break;
}
new_ctrl = c;
least == ctrl_out->in(LoopNode::EntryControl) &&
(ctrl_out->is_CountedLoop() || ctrl_out->is_OuterStripMinedLoop())) {
Node* least_dom = idom(least);
if (get_loop(least_dom)->is_member(get_loop(least))) {
least = least_dom;
}
least = new_ctrl;
}
}

View File

@@ -915,13 +915,13 @@ private:
void copy_skeleton_predicates_to_main_loop(CountedLoopNode* pre_head, Node* init, Node* stride, IdealLoopTree* outer_loop, LoopNode* outer_main_head,
uint dd_main_head, const uint idx_before_pre_post, const uint idx_after_post_before_pre,
Node* zero_trip_guard_proj_main, Node* zero_trip_guard_proj_post, const Node_List &old_new);
Node* clone_skeleton_predicate_for_main_loop(Node* iff, Node* new_init, Node* new_stride, Node* predicate, Node* uncommon_proj, Node* control,
IdealLoopTree* outer_loop, Node* input_proj);
Node* clone_skeleton_predicate_bool(Node* iff, Node* new_init, Node* new_stride, Node* predicate, Node* uncommon_proj, Node* control,
IdealLoopTree* outer_loop);
Node* clone_skeleton_predicate_for_main_or_post_loop(Node* iff, Node* new_init, Node* new_stride, Node* predicate, Node* uncommon_proj, Node* control,
IdealLoopTree* outer_loop, Node* input_proj);
Node* clone_skeleton_predicate_bool(Node* iff, Node* new_init, Node* new_stride, Node* control);
static bool skeleton_predicate_has_opaque(IfNode* iff);
static void get_skeleton_predicates(Node* predicate, Unique_Node_List& list, bool get_opaque = false);
void update_main_loop_skeleton_predicates(Node* ctrl, CountedLoopNode* loop_head, Node* init, int stride_con);
void copy_skeleton_predicates_to_post_loop(LoopNode* main_loop_head, CountedLoopNode* post_loop_head, Node* init, Node* stride);
void insert_loop_limit_check(ProjNode* limit_check_proj, Node* cmp_limit, Node* bol);
#ifdef ASSERT
bool only_has_infinite_loops();
@@ -1244,9 +1244,9 @@ public:
void insert_pre_post_loops( IdealLoopTree *loop, Node_List &old_new, bool peel_only );
// Add post loop after the given loop.
Node *insert_post_loop(IdealLoopTree *loop, Node_List &old_new,
CountedLoopNode *main_head, CountedLoopEndNode *main_end,
Node *incr, Node *limit, CountedLoopNode *&post_head);
Node *insert_post_loop(IdealLoopTree* loop, Node_List& old_new,
CountedLoopNode* main_head, CountedLoopEndNode* main_end,
Node*& incr, Node* limit, CountedLoopNode*& post_head);
// Add an RCE'd post loop which we will multi-version adapt for run time test path usage
void insert_scalar_rced_post_loop( IdealLoopTree *loop, Node_List &old_new );
@@ -1579,8 +1579,9 @@ private:
Node_List* old_new = NULL);
void clone_skeleton_predicates_to_unswitched_loop(IdealLoopTree* loop, const Node_List& old_new, Deoptimization::DeoptReason reason,
ProjNode* old_predicate_proj, ProjNode* iffast_pred, ProjNode* ifslow_pred);
ProjNode* clone_skeleton_predicate_for_unswitched_loops(Node* iff, ProjNode* predicate, Node* uncommon_proj, Deoptimization::DeoptReason reason,
ProjNode* output_proj, IdealLoopTree* loop);
ProjNode* clone_skeleton_predicate_for_unswitched_loops(Node* iff, ProjNode* predicate,
Deoptimization::DeoptReason reason,
ProjNode* output_proj);
static void check_created_predicate_for_unswitching(const Node* new_entry) PRODUCT_RETURN;
bool _created_loop_node;

View File

@@ -2562,6 +2562,7 @@ void PhaseMacroExpand::eliminate_macro_nodes() {
assert(n->Opcode() == Op_LoopLimit ||
n->Opcode() == Op_Opaque2 ||
n->Opcode() == Op_Opaque3 ||
n->Opcode() == Op_Opaque4 ||
BarrierSet::barrier_set()->barrier_set_c2()->is_gc_barrier_node(n),
"unknown node type in macro list");
}
@@ -2623,6 +2624,19 @@ bool PhaseMacroExpand::expand_macro_nodes() {
_igvn.replace_node(n, repl);
success = true;
#endif
} else if (n->Opcode() == Op_Opaque4) {
// With Opaque4 nodes, the expectation is that the test of input 1
// is always equal to the constant value of input 2. So we can
// remove the Opaque4 and replace it by input 2. In debug builds,
// leave the non constant test in instead to sanity check that it
// never fails (if it does, that subgraph was constructed so, at
// runtime, a Halt node is executed).
#ifdef ASSERT
_igvn.replace_node(n, n->in(1));
#else
_igvn.replace_node(n, n->in(2));
#endif
success = true;
} else if (n->Opcode() == Op_OuterStripMinedLoop) {
n->as_OuterStripMinedLoop()->adjust_strip_mined_loop(&_igvn);
C->remove_macro_node(n);

View File

@@ -60,25 +60,6 @@ bool Opaque2Node::cmp( const Node &n ) const {
return (&n == this); // Always fail except on self
}
Node* Opaque4Node::Identity(PhaseGVN* phase) {
if (phase->C->post_loop_opts_phase()) {
// With Opaque4 nodes, the expectation is that the test of input 1
// is always equal to the constant value of input 2. So we can
// remove the Opaque4 and replace it by input 2. In debug builds,
// leave the non constant test in instead to sanity check that it
// never fails (if it does, that subgraph was constructed so, at
// runtime, a Halt node is executed).
#ifdef ASSERT
return this->in(1);
#else
return this->in(2);
#endif
} else {
phase->C->record_for_post_loop_opts_igvn(this);
}
return this;
}
const Type* Opaque4Node::Value(PhaseGVN* phase) const {
return phase->type(in(1));
}

View File

@@ -114,11 +114,13 @@ class Opaque3Node : public Opaque2Node {
// GraphKit::must_be_not_null().
class Opaque4Node : public Node {
public:
Opaque4Node(Compile* C, Node *tst, Node* final_tst) : Node(NULL, tst, final_tst) {}
Opaque4Node(Compile* C, Node *tst, Node* final_tst) : Node(NULL, tst, final_tst) {
init_flags(Flag_is_macro);
C->add_macro_node(this);
}
virtual int Opcode() const;
virtual const Type *bottom_type() const { return TypeInt::BOOL; }
virtual Node* Identity(PhaseGVN* phase);
virtual const Type* Value(PhaseGVN* phase) const;
};

View File

@@ -200,6 +200,24 @@ bool PhaseIdealLoop::split_up( Node *n, Node *blk1, Node *blk2 ) {
return true;
}
}
if (n->Opcode() == Op_OpaqueLoopStride || n->Opcode() == Op_OpaqueLoopInit) {
Unique_Node_List wq;
wq.push(n);
for (uint i = 0; i < wq.size(); i++) {
Node* m = wq.at(i);
if (m->is_If()) {
assert(skeleton_predicate_has_opaque(m->as_If()), "opaque node not reachable from if?");
Node* bol = clone_skeleton_predicate_bool(m, NULL, NULL, m->in(0));
_igvn.replace_input_of(m, 1, bol);
} else {
assert(!m->is_CFG(), "not CFG expected");
for (DUIterator_Fast jmax, j = m->fast_outs(jmax); j < jmax; j++) {
Node* u = m->fast_out(j);
wq.push(u);
}
}
}
}
// See if splitting-up a Store. Any anti-dep loads must go up as
// well. An anti-dep load might be in the wrong block, because in

View File

@@ -249,6 +249,13 @@ public final class CStrike extends PhysicalStrike {
}
}
int getSlot0GlyphImagePtrs(int[] glyphCodes, long[] images, int len) {
int ourGlyphs = 0;
while (ourGlyphs < len && (glyphCodes[ourGlyphs] & CompositeGlyphMapper.SLOTMASK) == 0) ourGlyphs++;
getGlyphImagePtrs(glyphCodes, images, ourGlyphs);
return ourGlyphs;
}
// called from the Sun2D renderer
void getGlyphImagePtrs(int[] glyphCodes, long[] images, int len) {
synchronized (glyphInfoCache) {

View File

@@ -161,8 +161,8 @@ void initializeActions() {
[sActions setObject:NSAccessibilityPressAction forKey:@"click"];
[sActions setObject:NSAccessibilityIncrementAction forKey:@"increment"];
[sActions setObject:NSAccessibilityDecrementAction forKey:@"decrement"];
[sActions setObject:NSAccessibilityShowMenuAction forKey:@"togglePopup"];
[sActions setObject:NSAccessibilityPressAction forKey:@"toggleExpand"];
[sActions setObject:NSAccessibilityShowMenuAction forKey:@"toggle popup"];
[sActions setObject:NSAccessibilityPressAction forKey:@"toggleexpand"];
sActionSelectors = [[NSMutableDictionary alloc] initWithCapacity:actionsCount];

View File

@@ -37,7 +37,9 @@
#include "sizecalc.h"
#include <jni_util.h>
#include <stdio.h>
#include <math.h>
#include "awt.h"
#include "debug_assert.h"
static void *gtk3_libhandle = NULL;
static void *gthread_libhandle = NULL;
@@ -2911,8 +2913,12 @@ static void transform_detail_string (const gchar *detail,
}
}
inline static int scale_down(int what, int scale) {
return (int)(what / (float)scale + 0.5f);
inline static int scale_down_to_plus_inf(int what, int scale) {
return (int)ceilf(what / (float)scale);
}
inline static int scale_down_to_minus_inf(int what, int scale) {
return (int)floorf(what / (float)scale);
}
static gboolean gtk3_get_drawable_data(JNIEnv *env, jintArray pixelArray,
@@ -2921,15 +2927,29 @@ static gboolean gtk3_get_drawable_data(JNIEnv *env, jintArray pixelArray,
GdkPixbuf *pixbuf;
jint *ary;
int skip_left = 0;
int skip_top = 0;
GdkWindow *root = (*fp_gdk_get_default_root_window)();
if (gtk3_version_3_10) {
int win_scale = (*fp_gdk_window_get_scale_factor)(root);
// Scale the size up to, but never below, 1. This is for the case when a single-pixel
// image is required. Besides, Gtk API doesn't allow the size to be less than one.
const int width_scaled = (width <= win_scale) ? 1 : scale_down(width, win_scale);
const int height_scaled = (height <= win_scale) ? 1 : scale_down(height, win_scale);
const int x_scaled = scale_down(x, win_scale);
const int y_scaled = scale_down(y, win_scale);
// Scale the coordinate and size carefully such that the captured area
// is at least as large as requested. We trim off excess later by
// using the skip_* variables.
const int x_scaled = scale_down_to_minus_inf(x, win_scale);
const int y_scaled = scale_down_to_minus_inf(y, win_scale);
skip_left = x - x_scaled*win_scale;
skip_top = y - y_scaled*win_scale;
DASSERT(skip_left >= 0 && skip_top >= 0);
const int x_right_scaled = scale_down_to_plus_inf(x + width, win_scale);
const int width_scaled = x_right_scaled - x_scaled;
DASSERT(width_scaled > 0);
const int y_bottom_scaled = scale_down_to_plus_inf(y + height, win_scale);
const int height_scaled = y_bottom_scaled - y_scaled;
DASSERT(height_scaled > 0);
pixbuf = (*fp_gdk_pixbuf_get_from_drawable)(
root, x_scaled, y_scaled, width_scaled, height_scaled);
} else {
@@ -2966,7 +2986,8 @@ static gboolean gtk3_get_drawable_data(JNIEnv *env, jintArray pixelArray,
int index;
for (_y = 0; _y < height; _y++) {
for (_x = 0; _x < width; _x++) {
p = pix + (intptr_t) _y * stride + _x * nchan;
p = pix + (intptr_t) (_y + skip_top) * stride
+ (_x + skip_left) * nchan;
index = (_y + dy) * jwidth + (_x + dx);
ary[index] = 0xff000000

View File

@@ -0,0 +1,79 @@
/*
* Copyright (c) 2021, Red Hat, Inc. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/**
* @test
* @bug 8275330
* @summary C2: assert(n->is_Root() || n->is_Region() || n->is_Phi() || n->is_MachMerge() || def_block->dominates(block)) failed: uses must be dominated by definitions
*
* @run main/othervm -Xmx512m -XX:+UnlockDiagnosticVMOptions -Xcomp -XX:CompileOnly=TestDeadPostLoopBecausePredicate TestDeadPostLoopBecausePredicate
*
*/
public class TestDeadPostLoopBecausePredicate {
public static final int N = 400;
public static int iFld=54270;
public static int iFld1=-4;
public int iFld2=201;
public int mainTest(String[] strArr1) {
int i=0, i17=8052, i19=22380, i20=60894, iArr[]=new int[N];
init(iArr, 4);
i = 1;
do {
for (i17 = 5; i17 < 114; i17++) {
switch ((i17 % 7) + 126) {
case 126:
for (i19 = 2; i19 > i; i19 -= 3) {
try {
i20 = (iFld2 % TestDeadPostLoopBecausePredicate.iFld1);
i20 = (iArr[i19 - 1] % TestDeadPostLoopBecausePredicate.iFld);
TestDeadPostLoopBecausePredicate.iFld = (TestDeadPostLoopBecausePredicate.iFld1 % iArr[i19]);
} catch (ArithmeticException a_e) {}
}
break;
}
}
} while (++i < 220);
return i20;
}
public static void init(int[] a, int seed) {
for (int j = 0; j < a.length; j++) {
a[j] = (j % 2 == 0) ? seed + j : seed - j;
}
}
public static void main(String[] strArr) {
TestDeadPostLoopBecausePredicate _instance = new TestDeadPostLoopBecausePredicate();
for (int i = 0; i < 10; i++ ) {
_instance.mainTest(strArr);
}
}
}

View File

@@ -0,0 +1,268 @@
/*
* Copyright (c) 2022, Red Hat, Inc. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* bug 8280799
* @summary С2: assert(false) failed: cyclic dependency prevents range check elimination
* @run main/othervm -XX:-BackgroundCompilation -XX:-UseCountedLoopSafepoints TestPredicateInputBelowLoopPredicate
*/
public class TestPredicateInputBelowLoopPredicate {
private static final Object object = new Object();
private static int fieldStop = 100;
private static int[] array = new int[200];
private static int[] array2 = new int[200];
private static int fieldStart = 0;
public static void main(String[] args) {
for (int i = 0; i < 20_000; i++) {
test(true);
test(false);
}
}
private static void test(boolean flag) {
if (array == null) {
}
int start = fieldStart;
int i = start;
for(;;) {
int j;
for (j = -10; j < 0; j++) {
}
int stop = fieldStop;
// bound check becomes candidate for predication once
// loop above is optimized out
array[stop - i + j] = 0;
// A bunch of stuff to grow loop body size and prevent peeling:
array2[0] = 0;
array2[1] = 0;
array2[2] = 0;
array2[3] = 0;
array2[4] = 0;
array2[5] = 0;
array2[6] = 0;
array2[7] = 0;
array2[8] = 0;
array2[9] = 0;
array2[10] = 0;
array2[11] = 0;
array2[12] = 0;
array2[13] = 0;
array2[14] = 0;
array2[15] = 0;
array2[16] = 0;
array2[17] = 0;
array2[18] = 0;
array2[19] = 0;
array2[20] = 0;
array2[21] = 0;
array2[22] = 0;
array2[23] = 0;
array2[24] = 0;
array2[25] = 0;
array2[26] = 0;
array2[27] = 0;
array2[28] = 0;
array2[29] = 0;
array2[30] = 0;
array2[31] = 0;
array2[32] = 0;
array2[33] = 0;
array2[34] = 0;
array2[35] = 0;
array2[36] = 0;
array2[37] = 0;
array2[38] = 0;
array2[39] = 0;
array2[40] = 0;
array2[41] = 0;
array2[42] = 0;
array2[43] = 0;
array2[44] = 0;
array2[45] = 0;
array2[46] = 0;
array2[47] = 0;
array2[48] = 0;
array2[49] = 0;
array2[50] = 0;
array2[51] = 0;
array2[52] = 0;
array2[53] = 0;
array2[54] = 0;
array2[55] = 0;
array2[56] = 0;
array2[57] = 0;
array2[58] = 0;
array2[59] = 0;
array2[60] = 0;
array2[61] = 0;
array2[62] = 0;
array2[63] = 0;
array2[64] = 0;
array2[65] = 0;
array2[66] = 0;
array2[67] = 0;
array2[68] = 0;
array2[69] = 0;
array2[70] = 0;
array2[71] = 0;
array2[72] = 0;
array2[73] = 0;
array2[74] = 0;
array2[75] = 0;
array2[76] = 0;
array2[77] = 0;
array2[78] = 0;
array2[79] = 0;
array2[80] = 0;
array2[81] = 0;
array2[82] = 0;
array2[83] = 0;
array2[84] = 0;
array2[85] = 0;
array2[86] = 0;
array2[87] = 0;
array2[88] = 0;
array2[89] = 0;
array2[90] = 0;
array2[91] = 0;
array2[92] = 0;
array2[93] = 0;
array2[94] = 0;
array2[95] = 0;
array2[96] = 0;
array2[97] = 0;
array2[98] = 0;
array2[99] = 0;
array2[100] = 0;
array2[101] = 0;
array2[102] = 0;
array2[103] = 0;
array2[104] = 0;
array2[105] = 0;
array2[106] = 0;
array2[107] = 0;
array2[108] = 0;
array2[109] = 0;
array2[110] = 0;
array2[111] = 0;
array2[112] = 0;
array2[113] = 0;
array2[114] = 0;
array2[115] = 0;
array2[116] = 0;
array2[117] = 0;
array2[118] = 0;
array2[119] = 0;
array2[120] = 0;
array2[121] = 0;
array2[122] = 0;
array2[123] = 0;
array2[124] = 0;
array2[125] = 0;
array2[126] = 0;
array2[127] = 0;
array2[128] = 0;
array2[129] = 0;
array2[130] = 0;
array2[131] = 0;
array2[132] = 0;
array2[133] = 0;
array2[134] = 0;
array2[135] = 0;
array2[136] = 0;
array2[137] = 0;
array2[138] = 0;
array2[139] = 0;
array2[140] = 0;
array2[141] = 0;
array2[142] = 0;
array2[143] = 0;
array2[144] = 0;
array2[145] = 0;
array2[146] = 0;
array2[147] = 0;
array2[148] = 0;
array2[149] = 0;
array2[150] = 0;
array2[151] = 0;
array2[152] = 0;
array2[153] = 0;
array2[154] = 0;
array2[155] = 0;
array2[156] = 0;
array2[157] = 0;
array2[158] = 0;
array2[159] = 0;
array2[160] = 0;
array2[161] = 0;
array2[162] = 0;
array2[163] = 0;
array2[164] = 0;
array2[165] = 0;
array2[166] = 0;
array2[167] = 0;
array2[168] = 0;
array2[169] = 0;
array2[170] = 0;
array2[171] = 0;
array2[172] = 0;
array2[173] = 0;
array2[174] = 0;
array2[175] = 0;
array2[176] = 0;
array2[177] = 0;
array2[178] = 0;
array2[179] = 0;
array2[180] = 0;
array2[181] = 0;
array2[182] = 0;
array2[183] = 0;
array2[184] = 0;
array2[185] = 0;
array2[186] = 0;
array2[187] = 0;
array2[188] = 0;
array2[189] = 0;
array2[190] = 0;
array2[191] = 0;
array2[192] = 0;
array2[193] = 0;
array2[194] = 0;
array2[195] = 0;
array2[196] = 0;
array2[197] = 0;
array2[198] = 0;
array2[199] = 0;
i++;
if (i == stop) { // requires a loop limit predicate
break;
}
}
}
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2020, 2021, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -109,6 +109,7 @@ public class LambdaEagerInit {
static void testDefaultArchiveWithEagerInitializationEnabled() throws Exception {
// run with default CDS archive with the -Djdk.internal.lambda.disableEagerInitialization=true property
CDSOptions runOpts = (new CDSOptions())
.setXShareMode("auto")
.addPrefix("-cp", appJar, testProperty, "-Xlog:class+load,cds=debug")
.setUseSystemArchive(true)
.setUseVersion(false)
@@ -122,13 +123,16 @@ public class LambdaEagerInit {
static void testDefaultArchiveWithEagerInitializationDisabled() throws Exception {
// run with default CDS archive without the -Djdk.internal.lambda.disableEagerInitialization=true property
CDSOptions runOpts = (new CDSOptions())
.setXShareMode("auto")
.addPrefix("-cp", appJar, "-Xlog:class+load,cds=debug")
.setUseSystemArchive(true)
.setUseVersion(false)
.addSuffix(mainClass);
.addSuffix("-showversion", mainClass);
OutputAnalyzer output = CDSTestUtils.runWithArchive(runOpts);
output.shouldMatch(lambdaLoadedFromArchive)
.shouldMatch(cdsLoadedLambdaProxy)
.shouldHaveExitValue(0);
if (output.getStderr().contains("sharing")) {
output.shouldMatch(lambdaLoadedFromArchive)
.shouldMatch(cdsLoadedLambdaProxy);
}
output.shouldHaveExitValue(0);
}
}

View File

@@ -25,13 +25,17 @@ import java.awt.Dimension;
import java.awt.DisplayMode;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.lang.management.ManagementFactory;
import java.lang.management.MemoryMXBean;
import java.lang.reflect.InvocationTargetException;
import java.nio.file.Path;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
import jdk.jfr.Recording;
import java.io.IOException;
import jdk.jfr.consumer.RecordedEvent;
import jdk.jfr.consumer.RecordedFrame;
import jdk.jfr.consumer.RecordingFile;
/*
* @test
@@ -39,20 +43,21 @@ import javax.swing.WindowConstants;
*
* @summary Test verifies that there is no extra allocation after display mode switch
*
* @run main/othervm -Xmx750M ExtraAllocationTest
* @run main/othervm -Xmx750M ExtraAllocationTest
*/
public class ExtraAllocationTest {
private static final int MAX_MODES = 10;
private static final int W = 500;
private static final int H = 500;
static JFrame f = null;
public static void main(String[] args) throws InterruptedException, InvocationTargetException {
MemoryMXBean memBean = ManagementFactory.getMemoryMXBean();
memBean.gc();
Thread.sleep(2000);
static long th = ((long) W * H * 32) / (8 * 2);
public static void main(String[] args) throws InterruptedException, InvocationTargetException,
IOException
{
Recording recording = new Recording();
recording.enable("jdk.ObjectAllocationOutsideTLAB");
recording.start();
SwingUtilities.invokeAndWait(() -> {
f = new JFrame();
f.add(new JPanel());
@@ -66,35 +71,38 @@ public class ExtraAllocationTest {
GraphicsDevice d = ge.getDefaultScreenDevice();
if (d.isDisplayChangeSupported()) {
DisplayMode odm = d.getDisplayMode();
DisplayMode[] modes = d.getDisplayModes();
try {
int modesCount = Math.min(modes.length, MAX_MODES);
int modesCount = Math.min(modes.length, MAX_MODES);
for (int i = 0; i < modesCount; i++) {
DisplayMode mode = modes[i];
int w = mode.getWidth();
int h = mode.getHeight();
int bpp = mode.getBitDepth();
long th = ((long) W * H * bpp) / (8 * 2);
DisplayMode newMode =
new DisplayMode(w, h, bpp, DisplayMode.REFRESH_RATE_UNKNOWN);
long usedHeap = memBean.getHeapMemoryUsage().getUsed();
d.setDisplayMode(newMode);
Thread.sleep(2000);
long memDiff = memBean.getHeapMemoryUsage().getUsed() - usedHeap;
if (memDiff > th) {
throw new RuntimeException("Extra allocation detected: " + memDiff);
}
ManagementFactory.getMemoryMXBean().gc();
Thread.sleep(2000);
for (int i = 0; i < modesCount; i++) {
DisplayMode mode = modes[i];
try {
d.setDisplayMode(mode);
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
} finally {
d.setDisplayMode(odm);
Thread.sleep(2000);
}
}
f.setVisible(false);
f.dispose();
Thread.sleep(1000);
Path path = Path.of("recording.jfr");
recording.dump(path);
recording.close();
for (RecordedEvent event : RecordingFile.readAllEvents(path)) {
if ("jdk.ObjectAllocationOutsideTLAB".equalsIgnoreCase(event.getEventType().getName())) {
for (RecordedFrame recordedFrame :event.getStackTrace().getFrames()) {
if (recordedFrame.isJavaFrame() &&
"java.awt.image.DataBufferInt".equals(
recordedFrame.getMethod().getType().getName()) &&
event.getLong("allocationSize") > th)
{
throw new RuntimeException("Extra allocation detected: " +
event.getLong("allocationSize"));
}
}
}
}
}
}

View File

@@ -39,13 +39,17 @@ import java.io.IOException;
/**
* @test
* @key headful
* @bug 8073320
* @bug 8073320 8280861
* @summary Windows HiDPI support
* @author Alexander Scherbatiy
* @requires (os.family == "linux" | os.family == "windows")
* @requires !display.XWayland
* @run main/othervm -Dsun.java2d.win.uiScaleX=3 -Dsun.java2d.win.uiScaleY=2
* HiDPIRobotScreenCaptureTest
* @run main/othervm -Dsun.java2d.uiScale=1
* HiDPIRobotScreenCaptureTest
* @run main/othervm -Dsun.java2d.uiScale=2
* HiDPIRobotScreenCaptureTest
*/
public class HiDPIRobotScreenCaptureTest {
@@ -65,7 +69,14 @@ public class HiDPIRobotScreenCaptureTest {
}
Frame frame = new Frame();
frame.setBounds(40, 30, 400, 300);
// Position the frame on prime number coordinates to avoid
// them being multiple of the desktop scale; this tests Linux
// color picker better.
// Also, the position should be far enough from the top left
// corner of the screen to reduce the chance of being repositioned
// by the system because that area's occupied by the global
// menu bar and such.
frame.setBounds(83, 97, 400, 300);
frame.setUndecorated(true);
Panel panel = new Panel(new BorderLayout());
@@ -83,6 +94,13 @@ public class HiDPIRobotScreenCaptureTest {
g.fillRect(0, h / 2, w / 2, h / 2);
g.setColor(COLORS[3]);
g.fillRect(w / 2, h / 2, w / 2, h / 2);
// Several distinct pixels next to one another
// in order to test color picker's precision.
for (int i = 1; i < 4; i++) {
g.setColor(COLORS[i]);
g.fillRect(i, 0, 1, 1);
}
}
};
@@ -93,6 +111,9 @@ public class HiDPIRobotScreenCaptureTest {
robot.waitForIdle();
robot.delay(500);
final Point screenLocation = frame.getLocationOnScreen();
checkPixelColors(robot, screenLocation.x, screenLocation.y);
Rectangle rect = canvas.getBounds();
rect.setLocation(canvas.getLocationOnScreen());
@@ -107,13 +128,28 @@ public class HiDPIRobotScreenCaptureTest {
throw new RuntimeException("Wrong image size!");
}
checkRectColor(image, new Rectangle(0, 0, w / 2, h / 2), COLORS[0]);
checkRectColor(image, new Rectangle(w / 2, 0, w / 2, h / 2), COLORS[1]);
checkRectColor(image, new Rectangle(0, h / 2, w / 2, h / 2), COLORS[2]);
checkRectColor(image, new Rectangle(w / 2, h / 2, w / 2, h / 2), COLORS[3]);
}
private static final int OFFSET = 3;
static void checkPixelColors(Robot robot, int x, int y) {
for (int i = 0; i < 4; i++) {
final Color actualColor = robot.getPixelColor(x + i, y);
System.out.print("Checking color at " + (x + i) + ", " + y + " to be equal to " + COLORS[i]);
if (!actualColor.equals(COLORS[i])) {
System.out.println("... Mismatch: found " + actualColor + " instead");
throw new RuntimeException("Wrong screen pixel color");
} else {
System.out.println("... OK");
}
}
}
private static final int OFFSET = 5;
static void checkRectColor(BufferedImage image, Rectangle rect, Color expectedColor) {
System.out.println("Checking rectangle " + rect + " to have color " + expectedColor);
final Point[] pointsToCheck = new Point[] {

View File

@@ -24,7 +24,7 @@
/*
* @test
* @key headful
* @bug 8162959
* @bug 8162959 8280861
* @requires !display.XWayland
* @summary Validate output of createMultiResolutionScreenCapture
* new API which returns MultiResolutionImage.
@@ -60,7 +60,14 @@ public class ScreenCaptureTest {
public static void main(String[] args) throws Exception {
frame = new Frame();
frame.setBounds(0, 0, 400, 400);
// Position the frame on prime number coordinates to avoid
// them being multiple of the desktop scale; this tests Linux
// color picker better.
// Also, the position should be far enough from the top left
// corner of the screen to reduce the chance of being repositioned
// by the system because that area's occupied by the global
// menu bar and such.
frame.setBounds(83, 97, 400, 400);
frame.setUndecorated(true);
robot = new Robot();
Panel panel = new Panel(new BorderLayout());
@@ -93,7 +100,7 @@ public class ScreenCaptureTest {
final int x = screenLocation.x;
final int y = screenLocation.y;
try {
// getPixelColor Test
// getPixelColor() tests
checkRectColor(new Rectangle(x, y, w / 2, h / 2), COLORS[0]);
checkRectColor(new Rectangle(x + w / 2, y, w / 2, h / 2), COLORS[1]);
checkRectColor(new Rectangle(x, y + h / 2, w / 2, h / 2), COLORS[2]);
@@ -175,7 +182,7 @@ public class ScreenCaptureTest {
}
private static final int OFFSET = 3;
private static final int OFFSET = 5;
static void checkRectColor(Rectangle rect, Color expectedColor) {
System.out.println("Checking rectangle " + rect + " to have color " + expectedColor);
final Point[] pointsToCheck = new Point[] {

View File

@@ -0,0 +1,183 @@
/*
* Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2021, JetBrains s.r.o.. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 8281338
* @summary Test for an element that has more than one Accessibility Action
* @author Artem.Semenov@jetbrains.com
* @run main/manual AccessibleActionsTest
* @requires (os.family == "mac")
*/
import javax.accessibility.Accessible;
import javax.accessibility.AccessibleAction;
import javax.accessibility.AccessibleContext;
import javax.swing.*;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreePath;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Hashtable;
import java.util.concurrent.CountDownLatch;
public class AccessibleActionsTest extends AccessibleComponentTest {
@Override
public CountDownLatch createCountDownLatch() {
return new CountDownLatch(1);
}
void createTest() {
INSTRUCTIONS = "INSTRUCTIONS:\n"
+ "Check a11y actions.\n\n"
+ "Turn screen reader on, and Tab to the label.\n\n"
+ "Perform the VO action \"Press\" (VO+space)\n"
+ "Perform the VO action \"Show menu\" (VO+m)\n\n"
+ "If after the first action the text of the label has changed, and after the second action the menu appears tab further and press PASS, otherwise press FAIL.";
exceptionString = "AccessibleAction test failed!";
super.createUI(new AccessibleActionsTestFrame(), "AccessibleActionsTest");
}
void createTree() {
INSTRUCTIONS = "INSTRUCTIONS:\n"
+ "Check a11y actions.\n\n"
+ "Turn screen reader on, and Tab to the label.\n\n"
+ "Perform the VO action \"Press\" (VO+space) on tree nodes\n\n"
+ "If after press the tree node is expanded tab further and press PASS, otherwise press FAIL.";
String root = "Root";
String[] nodes = new String[] {"One node", "Two node"};
String[][] leafs = new String[][]{{"leaf 1.1", "leaf 1.2", "leaf 1.3", "leaf 1.4"},
{"leaf 2.1", "leaf 2.2", "leaf 2.3", "leaf 2.4"}};
Hashtable<String, String[]> data = new Hashtable<String, String[]>();
for (int i = 0; i < nodes.length; i++) {
data.put(nodes[i], leafs[i]);
}
JTree tree = new JTree(data);
tree.setRootVisible(true);
JPanel panel = new JPanel();
panel.setLayout(new FlowLayout());
JScrollPane scrollPane = new JScrollPane(tree);
panel.add(scrollPane);
panel.setFocusable(false);
exceptionString = "AccessibleAction test failed!";
super.createUI(panel, "AccessibleActionsTest");
}
public static void main(String[] args) throws Exception {
AccessibleActionsTest test = new AccessibleActionsTest();
countDownLatch = test.createCountDownLatch();
SwingUtilities.invokeLater(test::createTest);
countDownLatch.await();
if (!testResult) {
throw new RuntimeException(a11yTest.exceptionString);
}
countDownLatch = test.createCountDownLatch();
SwingUtilities.invokeLater(test::createTree);
countDownLatch.await();
if (!testResult) {
throw new RuntimeException(a11yTest.exceptionString);
}
}
private class AccessibleActionsTestFrame extends JPanel {
public AccessibleActionsTestFrame() {
MyLabel label = new MyLabel("I'm waiting for the push");
label.setComponentPopupMenu(createPopup());
label.setFocusable(true);
add(label);
setLayout(new FlowLayout());
}
private static class MyLabel extends JLabel {
public MyLabel(String text) {
super(text);
}
@Override
public AccessibleContext getAccessibleContext() {
if (accessibleContext == null) {
accessibleContext = new MyAccessibleJLabel();
}
return accessibleContext;
}
private class MyAccessibleJLabel extends JLabel.AccessibleJLabel {
@Override
public AccessibleAction getAccessibleAction() {
return new AccessibleAction() {
@Override
public int getAccessibleActionCount() {
return 2;
}
@Override
public String getAccessibleActionDescription(int i) {
if (i == 0) {
return AccessibleAction.CLICK;
}
return AccessibleAction.TOGGLE_POPUP;
}
@Override
public boolean doAccessibleAction(int i) {
if (i == 0) {
changeText(MyLabel.this, "label is pressed");
return true;
}
JPopupMenu popup = createPopup();
popup.show(MyLabel.this, 0, 0);
return true;
}
};
}
}
}
private static JPopupMenu createPopup() {
JPopupMenu popup = new JPopupMenu("MENU");
popup.add("One");
popup.add("Two");
popup.add("Three");
return popup;
}
private static void changeText(JLabel label, String text) {
label.setText(text);
}
}
}

View File

@@ -39,7 +39,9 @@ import java.awt.geom.*;
import java.awt.image.*;
import java.io.File;
import java.util.Arrays;
import java.util.concurrent.CountDownLatch;
import javax.imageio.ImageIO;
import javax.swing.SwingUtilities;
public class GradientPaints extends Canvas {
@@ -68,8 +70,8 @@ public class GradientPaints extends Canvas {
(int)(TESTW * TESTH * 0.18);
private static final int ALLOWED_MISMATCHES_RADIAL =
(int)(TESTW * TESTH * 0.45);
private static final int ALLOWED_RENDER_ATTEMPTS = 5;
private static boolean done;
private static boolean verbose;
private static final Color[] COLORS = {
@@ -83,8 +85,8 @@ public class GradientPaints extends Canvas {
new Color(128, 128, 128),
};
private static enum PaintType {BASIC, LINEAR, RADIAL};
private static enum XformType {IDENTITY, TRANSLATE, SCALE, SHEAR, ROTATE};
private enum PaintType {BASIC, LINEAR, RADIAL}
private enum XformType {IDENTITY, TRANSLATE, SCALE, SHEAR, ROTATE}
private static final int[] numStopsArray = {2, 4, 7};
private static final Object[] hints = {
RenderingHints.VALUE_ANTIALIAS_OFF,
@@ -92,35 +94,14 @@ public class GradientPaints extends Canvas {
};
public void paint(Graphics g) {
synchronized (this) {
if (!done) {
done = true;
notifyAll();
}
}
}
private void testOne(BufferedImage refImg, VolatileImage testImg) {
Graphics2D gref = refImg.createGraphics();
Graphics2D gtest = testImg.createGraphics();
Paint paint =
makePaint(PaintType.RADIAL, CycleMethod.REPEAT,
ColorSpaceType.SRGB, XformType.IDENTITY, 7);
Object aahint = hints[0];
renderTest(gref, paint, aahint);
renderTest(gtest, paint, aahint);
Toolkit.getDefaultToolkit().sync();
compareImages(refImg, testImg.getSnapshot(),
TOLERANCE, 0, "");
gref.dispose();
gtest.dispose();
painted.countDown();
}
private void testAll(Graphics gscreen,
BufferedImage refImg, VolatileImage testImg)
BufferedImage refImg, VolatileImage testImg, GraphicsConfiguration gc)
{
Graphics2D gref = refImg.createGraphics();
Graphics2D gtest = testImg.createGraphics();
testImg.validate(gc);
for (PaintType paintType : PaintType.values()) {
for (CycleMethod cycleMethod : CycleMethod.values()) {
for (ColorSpaceType colorSpace : ColorSpaceType.values()) {
@@ -138,16 +119,32 @@ public class GradientPaints extends Canvas {
" numStops=" + numStops +
" aa=" + aahint;
renderTest(gref, paint, aahint);
renderTest(gtest, paint, aahint);
gscreen.drawImage(testImg, 0, 0, null);
Toolkit.getDefaultToolkit().sync();
int allowedMismatches =
paintType == PaintType.RADIAL ?
ALLOWED_MISMATCHES_RADIAL :
ALLOWED_MISMATCHES_LINEAR;
compareImages(refImg, testImg.getSnapshot(),
TOLERANCE, allowedMismatches,
msg);
int allowedMismatches = paintType == PaintType.RADIAL ?
ALLOWED_MISMATCHES_RADIAL : ALLOWED_MISMATCHES_LINEAR;
int attempt = 0;
while (true) {
Graphics2D gtest = testImg.createGraphics();
renderTest(gtest, paint, aahint);
gscreen.drawImage(testImg, 0, 0, null);
Toolkit.getDefaultToolkit().sync();
gtest.dispose();
BufferedImage snapshot = testImg.getSnapshot();
if (testImg.contentsLost() &&
testImg.validate(gc) != VolatileImage.IMAGE_OK)
{
if (attempt++ >= ALLOWED_RENDER_ATTEMPTS) {
throw new RuntimeException("Cannot render to VI");
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
continue;
}
compareImages(refImg, snapshot, allowedMismatches, msg);
break;
}
}
}
}
@@ -155,7 +152,6 @@ public class GradientPaints extends Canvas {
}
}
gref.dispose();
gtest.dispose();
}
private Paint makePaint(PaintType paintType,
@@ -172,7 +168,6 @@ public class GradientPaints extends Canvas {
int focusX = ctrX + 20;
int focusY = ctrY + 20;
float radius = 100.0f;
Paint paint;
AffineTransform transform;
Color[] colors = Arrays.copyOf(COLORS, numStops);
@@ -181,57 +176,30 @@ public class GradientPaints extends Canvas {
fractions[i] = ((float)i) / (fractions.length-1);
}
switch (xformType) {
default:
case IDENTITY:
transform = new AffineTransform();
break;
case TRANSLATE:
transform = AffineTransform.getTranslateInstance(2, 2);
break;
case SCALE:
transform = AffineTransform.getScaleInstance(1.2, 1.4);
break;
case SHEAR:
transform = AffineTransform.getShearInstance(0.1, 0.1);
break;
case ROTATE:
transform = AffineTransform.getRotateInstance(Math.PI / 4,
getWidth()/2,
getHeight()/2);
break;
}
transform = switch (xformType) {
case IDENTITY -> new AffineTransform();
case TRANSLATE -> AffineTransform.getTranslateInstance(2, 2);
case SCALE -> AffineTransform.getScaleInstance(1.2, 1.4);
case SHEAR -> AffineTransform.getShearInstance(0.1, 0.1);
case ROTATE -> AffineTransform.getRotateInstance(Math.PI / 4,
getWidth() >> 1, getHeight() >> 1);
};
switch (paintType) {
case BASIC:
boolean cyclic = (cycleMethod != CycleMethod.NO_CYCLE);
paint =
new GradientPaint(startX, startY, Color.RED,
endX, endY, Color.BLUE, cyclic);
break;
default:
case LINEAR:
paint =
new LinearGradientPaint(new Point2D.Float(startX, startY),
new Point2D.Float(endX, endY),
fractions, colors,
cycleMethod, colorSpace,
transform);
break;
case RADIAL:
paint =
new RadialGradientPaint(new Point2D.Float(ctrX, ctrY),
radius,
new Point2D.Float(focusX, focusY),
fractions, colors,
cycleMethod, colorSpace,
transform);
break;
}
return paint;
return switch (paintType) {
case BASIC -> new GradientPaint(startX, startY, Color.RED,
endX, endY, Color.BLUE, (cycleMethod != CycleMethod.NO_CYCLE));
case LINEAR -> new LinearGradientPaint(new Point2D.Float(startX, startY),
new Point2D.Float(endX, endY),
fractions, colors,
cycleMethod, colorSpace,
transform);
case RADIAL -> new RadialGradientPaint(new Point2D.Float(ctrX, ctrY),
radius,
new Point2D.Float(focusX, focusY),
fractions, colors,
cycleMethod, colorSpace,
transform);
};
}
private void renderTest(Graphics2D g2d, Paint p, Object aahint) {
@@ -248,7 +216,7 @@ public class GradientPaints extends Canvas {
private static void compareImages(BufferedImage refImg,
BufferedImage testImg,
int tolerance, int allowedMismatches,
int allowedMismatches,
String msg)
{
int numMismatches = 0;
@@ -261,7 +229,7 @@ public class GradientPaints extends Canvas {
for (int x = x1; x < x2; x++) {
Color expected = new Color(refImg.getRGB(x, y));
Color actual = new Color(testImg.getRGB(x, y));
if (!isSameColor(expected, actual, tolerance)) {
if (!isSameColor(expected, actual)) {
numMismatches++;
}
}
@@ -277,6 +245,7 @@ public class GradientPaints extends Canvas {
ImageIO.write(testImg, "png",
new File("GradientPaints.cap.png"));
} catch (Exception e) {
e.printStackTrace();
}
if (!verbose) {
System.err.println(msg);
@@ -285,53 +254,49 @@ public class GradientPaints extends Canvas {
numMismatches +
") exceeds limit (" +
allowedMismatches +
") with tolerance=" +
tolerance);
") with tolerance=" + TOLERANCE);
}
}
private static boolean isSameColor(Color c1, Color c2, int e) {
private static boolean isSameColor(Color c1, Color c2) {
int r1 = c1.getRed();
int g1 = c1.getGreen();
int b1 = c1.getBlue();
int r2 = c2.getRed();
int g2 = c2.getGreen();
int b2 = c2.getBlue();
int rmin = Math.max(r2-e, 0);
int gmin = Math.max(g2-e, 0);
int bmin = Math.max(b2-e, 0);
int rmax = Math.min(r2+e, 255);
int gmax = Math.min(g2+e, 255);
int bmax = Math.min(b2+e, 255);
if (r1 >= rmin && r1 <= rmax &&
g1 >= gmin && g1 <= gmax &&
b1 >= bmin && b1 <= bmax)
{
return true;
}
return false;
int rmin = Math.max(r2- TOLERANCE, 0);
int gmin = Math.max(g2- TOLERANCE, 0);
int bmin = Math.max(b2- TOLERANCE, 0);
int rmax = Math.min(r2+ TOLERANCE, 255);
int gmax = Math.min(g2+ TOLERANCE, 255);
int bmax = Math.min(b2+ TOLERANCE, 255);
return r1 >= rmin && r1 <= rmax &&
g1 >= gmin && g1 <= gmax &&
b1 >= bmin && b1 <= bmax;
}
static CountDownLatch painted = new CountDownLatch(1);
static Frame frame = null;
public static void main(String[] args) {
if (args.length == 1 && args[0].equals("-verbose")) {
verbose = true;
}
GradientPaints test = new GradientPaints();
Frame frame = new Frame();
frame.add(test);
frame.pack();
frame.setVisible(true);
SwingUtilities.invokeLater(() -> {
frame = new Frame();
frame.add(test);
frame.pack();
frame.setVisible(true);
});
// Wait until the component's been painted
synchronized (test) {
while (!done) {
try {
test.wait();
} catch (InterruptedException e) {
throw new RuntimeException("Failed: Interrupted");
}
}
try {
painted.await();
} catch (InterruptedException e) {
throw new RuntimeException("Failed: Interrupted");
}
GraphicsConfiguration gc = frame.getGraphicsConfiguration();
@@ -345,10 +310,9 @@ public class GradientPaints extends Canvas {
BufferedImage refImg =
new BufferedImage(TESTW, TESTH, BufferedImage.TYPE_INT_RGB);
VolatileImage testImg = frame.createVolatileImage(TESTW, TESTH);
testImg.validate(gc);
try {
test.testAll(test.getGraphics(), refImg, testImg);
test.testAll(test.getGraphics(), refImg, testImg, gc);
} finally {
frame.dispose();
}

View File

@@ -35,20 +35,20 @@ public enum Layout_ABC implements LayoutKey {
// located on the left side of the key 1 on the Apple International English keyboard
// SECTION ('§', '§', '±', '±'),
VK_MINUS ('-', '', '_', '—'),
VK_EQUALS ('=', '≠', '+', '±'),
VK_MINUS ('-', '', '_', '—', '\u001F'),
VK_EQUALS ('=', '≠', '+', '±', '='),
VK_OPEN_BRACKET ('[', '“', '{', '”'),
VK_CLOSE_BRACKET (']', '', '}', ''),
VK_OPEN_BRACKET ('[', '“', '{', '”', '\u001B'),
VK_CLOSE_BRACKET (']', '', '}', '', '\u001D'),
VK_SEMICOLON (';', '…', ':', 'Ú'),
VK_QUOTE ('\'', 'æ', '"', 'Æ'),
VK_BACK_SLASH ('\\', '«', '|', '»'),
VK_SEMICOLON (';', '…', ':', 'Ú', ';'),
VK_QUOTE ('\'', 'æ', '"', 'Æ', '\''),
VK_BACK_SLASH ('\\', '«', '|', '»', '\u001C'),
VK_BACK_QUOTE (KeyChar.ch('`'), KeyChar.dead('`'), KeyChar.ch('~'), KeyChar.ch('`')),
VK_COMMA (',', '≤', '<', '¯'),
VK_PERIOD ('.', '≥', '>', '˘'),
VK_SLASH ('/', '÷', '?', '¿'),
VK_BACK_QUOTE (KeyChar.ch('`'), KeyChar.dead('`'), KeyChar.ch('~'), KeyChar.ch('`'), KeyChar.ch('`')),
VK_COMMA (',', '≤', '<', '¯', ','),
VK_PERIOD ('.', '≥', '>', '˘', '.'),
VK_SLASH ('/', '÷', '?', '¿', '/'),
//VK_1 ('1', '¡', '!', ''),
//VK_2 ('2', '™', '@', '€'),
@@ -99,12 +99,12 @@ public enum Layout_ABC implements LayoutKey {
private final Key key;
Layout_ABC(char no, char alt, char shift, char alt_shift) {
key = new Key(name(), new MappedKeyChars(no, alt, shift, alt_shift));
Layout_ABC(char no, char alt, char shift, char alt_shift, char control) {
key = new Key(name(), new MappedKeyChars(no, alt, shift, alt_shift, control));
}
Layout_ABC(KeyChar no, KeyChar alt, KeyChar shift, KeyChar alt_shift) {
key = new Key(name(), new MappedKeyChars(no, alt, shift, alt_shift));
Layout_ABC(KeyChar no, KeyChar alt, KeyChar shift, KeyChar alt_shift, KeyChar control) {
key = new Key(name(), new MappedKeyChars(no, alt, shift, alt_shift, control));
}
public Key getKey() {

View File

@@ -30,20 +30,20 @@ public enum Layout_FRENCH_PC implements LayoutKey {
// Enum name must be the same as KeyEvent.VK_ constant name corresponding to the key on US keyboard layout
// Note that '\u0000' may be used if no char is mapped to a key + modifier or if one wants to skip its testing
VK_MINUS (')', ']', '°', ']'),
VK_EQUALS ('=', '}', '+', '≠'),
VK_MINUS (')', ']', '°', ']', '\u001B'),
VK_EQUALS ('=', '}', '+', '≠', '\u001F'),
VK_OPEN_BRACKET (KeyChar.dead('^'), KeyChar.ch('ô'), KeyChar.dead('¨'), KeyChar.ch('Ô')),
VK_CLOSE_BRACKET ('$', '¤', '£', '¥'),
VK_OPEN_BRACKET (KeyChar.dead('^'), KeyChar.ch('ô'), KeyChar.dead('¨'), KeyChar.ch('Ô'), KeyChar.ch('\u001E')),
VK_CLOSE_BRACKET ('$', '¤', '£', '¥', '\u001D'),
VK_SEMICOLON ('m', 'µ', 'M', 'Ó'),
VK_QUOTE ('ù', 'Ù', '%', '‰'),
VK_BACK_SLASH ('*', '@', 'μ', '#'),
VK_SEMICOLON ('m', 'µ', 'M', 'Ó', '\r'),
VK_QUOTE ('ù', 'Ù', '%', '‰', 'ù'),
VK_BACK_SLASH ('*', '@', 'μ', '#', '\u001C'),
VK_BACK_QUOTE ('<', '«', '>', '≥'),
VK_COMMA (';', '…', '.', '•'),
VK_PERIOD (':', '÷', '/', '\\'),
VK_SLASH ('!', '¡', '§', '±'),
VK_BACK_QUOTE ('<', '«', '>', '≥', '<'),
VK_COMMA (';', '…', '.', '•', ';'),
VK_PERIOD (':', '÷', '/', '\\', ':'),
VK_SLASH ('!', '¡', '§', '±', '='),
;
@@ -51,12 +51,12 @@ public enum Layout_FRENCH_PC implements LayoutKey {
private final Key key;
Layout_FRENCH_PC(char no, char alt, char shift, char alt_shift) {
key = new Key(name(), new MappedKeyChars(no, alt, shift, alt_shift));
Layout_FRENCH_PC(char no, char alt, char shift, char alt_shift, char control) {
key = new Key(name(), new MappedKeyChars(no, alt, shift, alt_shift, control));
}
Layout_FRENCH_PC(KeyChar no, KeyChar alt, KeyChar shift, KeyChar alt_shift) {
key = new Key(name(), new MappedKeyChars(no, alt, shift, alt_shift));
Layout_FRENCH_PC(KeyChar no, KeyChar alt, KeyChar shift, KeyChar alt_shift, KeyChar control) {
key = new Key(name(), new MappedKeyChars(no, alt, shift, alt_shift, control));
}
public Key getKey() {

View File

@@ -31,20 +31,20 @@ public enum Layout_GERMAN implements LayoutKey {
// Note that '\u0000' may be used if no char is mapped to a key + modifier or if one wants to skip its testing
// Eszett
VK_MINUS ('ß', '¿', '?', '˙'),
VK_EQUALS (KeyChar.dead('´'), KeyChar.ch('\''), KeyChar.dead('`'), KeyChar.ch('˚')),
VK_MINUS ('ß', '¿', '?', '˙', 'ß'),
VK_EQUALS (KeyChar.dead('´'), KeyChar.ch('\''), KeyChar.dead('`'), KeyChar.ch('˚'), KeyChar.ch('´')),
VK_OPEN_BRACKET ('ü', '•', 'Ü', '°'),
VK_CLOSE_BRACKET ('+', '±', '*', ''),
VK_OPEN_BRACKET ('ü', '•', 'Ü', '°', '\u001D'),
VK_CLOSE_BRACKET ('+', '±', '*', '', '+'),
VK_SEMICOLON ('ö', 'œ', 'Ö', 'Œ'),
VK_QUOTE ('ä', 'æ', 'Ä', 'Æ'),
VK_BACK_SLASH ('#', '', '\'', ''),
VK_SEMICOLON ('ö', 'œ', 'Ö', 'Œ', '\u001C'),
VK_QUOTE ('ä', 'æ', 'Ä', 'Æ', '\u001B'),
VK_BACK_SLASH ('#', '', '\'', '', '#'),
VK_BACK_QUOTE ('<', '≤', '>', '≥'),
VK_COMMA (',', '∞', ';', '˛'),
VK_PERIOD ('.', '…', ':', '÷'),
VK_SLASH ('-', '', '_', '—'),
VK_BACK_QUOTE ('<', '≤', '>', '≥', '<'),
VK_COMMA (',', '∞', ';', '˛', ','),
VK_PERIOD ('.', '…', ':', '÷', '.'),
VK_SLASH ('-', '', '_', '—', '-'),
;
@@ -52,12 +52,12 @@ public enum Layout_GERMAN implements LayoutKey {
private final Key key;
Layout_GERMAN(char no, char alt, char shift, char alt_shift) {
key = new Key(name(), new MappedKeyChars(no, alt, shift, alt_shift));
Layout_GERMAN(char no, char alt, char shift, char alt_shift, char control) {
key = new Key(name(), new MappedKeyChars(no, alt, shift, alt_shift, control));
}
Layout_GERMAN(KeyChar no, KeyChar alt, KeyChar shift, KeyChar alt_shift) {
key = new Key(name(), new MappedKeyChars(no, alt, shift, alt_shift));
Layout_GERMAN(KeyChar no, KeyChar alt, KeyChar shift, KeyChar alt_shift, KeyChar control) {
key = new Key(name(), new MappedKeyChars(no, alt, shift, alt_shift, control));
}
public Key getKey() {

View File

@@ -30,20 +30,20 @@ public enum Layout_SPANISH_ISO implements LayoutKey {
// Enum name must be the same as KeyEvent.VK_ constant name corresponding to the key on US keyboard layout
// Note that '\u0000' may be used if no char is mapped to a key + modifier or if one wants to skip its testing
VK_MINUS ('\'', '´', '?', '¸'),
VK_EQUALS ('¡', '', '¿', '˛'),
VK_MINUS ('\'', '´', '?', '¸', '\u001F'),
VK_EQUALS ('¡', '', '¿', '˛', '='),
VK_OPEN_BRACKET (KeyChar.dead('`'), KeyChar.ch('['), KeyChar.dead('^'), KeyChar.ch('ˆ')),
VK_CLOSE_BRACKET ('+', ']', '*', '±'),
VK_OPEN_BRACKET (KeyChar.dead('`'), KeyChar.ch('['), KeyChar.dead('^'), KeyChar.ch('ˆ'), KeyChar.ch('\u001B')),
VK_CLOSE_BRACKET ('+', ']', '*', '±', '\u001D'),
VK_SEMICOLON (KeyChar.ch('ñ'), KeyChar.dead('~'), KeyChar.ch('Ñ'), KeyChar.ch('˜')),
VK_QUOTE (KeyChar.dead('´'), KeyChar.ch('{'), KeyChar.dead('¨'), KeyChar.ch('«')),
VK_BACK_SLASH ('ç', '}', 'Ç', '»'),
VK_SEMICOLON (KeyChar.ch('ñ'), KeyChar.dead('~'), KeyChar.ch('Ñ'), KeyChar.ch('˜'), KeyChar.ch(':')),
VK_QUOTE (KeyChar.dead('´'), KeyChar.ch('{'), KeyChar.dead('¨'), KeyChar.ch('«'), KeyChar.ch('"')),
VK_BACK_SLASH ('ç', '}', 'Ç', '»', '\u001C'),
VK_BACK_QUOTE ('<', '≤', '>', '≥'),
VK_COMMA (',', '„', ';', '\u0000'),
VK_PERIOD ('.', '…', ':', '…'),
VK_SLASH ('-', '', '_', '—'),
VK_BACK_QUOTE ('<', '≤', '>', '≥', '`'),
VK_COMMA (',', '„', ';', '\u0000', ','),
VK_PERIOD ('.', '…', ':', '…', '.'),
VK_SLASH ('-', '', '_', '—', '/'),
;
@@ -51,12 +51,12 @@ public enum Layout_SPANISH_ISO implements LayoutKey {
private final Key key;
Layout_SPANISH_ISO(char no, char alt, char shift, char alt_shift) {
key = new Key(name(), new MappedKeyChars(no, alt, shift, alt_shift));
Layout_SPANISH_ISO(char no, char alt, char shift, char alt_shift, char control) {
key = new Key(name(), new MappedKeyChars(no, alt, shift, alt_shift, control));
}
Layout_SPANISH_ISO(KeyChar no, KeyChar alt, KeyChar shift, KeyChar alt_shift) {
key = new Key(name(), new MappedKeyChars(no, alt, shift, alt_shift));
Layout_SPANISH_ISO(KeyChar no, KeyChar alt, KeyChar shift, KeyChar alt_shift, KeyChar control) {
key = new Key(name(), new MappedKeyChars(no, alt, shift, alt_shift, control));
}
public Key getKey() {

View File

@@ -30,21 +30,21 @@ public enum Layout_US_INTERNATIONAL_PC implements LayoutKey {
// Enum name must be the same as KeyEvent.VK_ constant name corresponding to the key on US keyboard layout
// Note that '\u0000' may be used if no char is mapped to a key + modifier or if one wants to skip its testing
VK_MINUS ('-', '', '_', '—'),
VK_EQUALS ('=', '≠', '+', '±'),
VK_MINUS ('-', '', '_', '—', '\u001F'),
VK_EQUALS ('=', '≠', '+', '±', '='),
VK_OPEN_BRACKET ('[', '“', '{', '”'),
VK_CLOSE_BRACKET (']', '', '}', ''),
VK_OPEN_BRACKET ('[', '“', '{', '”', '\u001B'),
VK_CLOSE_BRACKET (']', '', '}', '', '\u001D'),
VK_SEMICOLON (';', '…', ':', 'Ú'),
VK_SEMICOLON (';', '…', ':', 'Ú', ';'),
// ' is a special dead symbol, which may add either acute or cedilla to the next key
VK_QUOTE (KeyChar.dead('\''), KeyChar.ch('æ'), KeyChar.dead('\"'), KeyChar.ch('Æ')),
VK_BACK_SLASH ('\\', '«', '|', '»'),
VK_QUOTE (KeyChar.dead('\''), KeyChar.ch('æ'), KeyChar.dead('\"'), KeyChar.ch('Æ'), KeyChar.ch('\'')),
VK_BACK_SLASH ('\\', '«', '|', '»', '\u001C'),
VK_BACK_QUOTE (KeyChar.dead('`'), KeyChar.dead('`'), KeyChar.dead('~'), KeyChar.ch('`')),
VK_COMMA (',', '≤', '<', '¯'),
VK_PERIOD ('.', '≥', '>', '˘'),
VK_SLASH ('/', '÷', '?', '¿'),
VK_BACK_QUOTE (KeyChar.dead('`'), KeyChar.dead('`'), KeyChar.dead('~'), KeyChar.ch('`'), KeyChar.ch('`')),
VK_COMMA (',', '≤', '<', '¯', ','),
VK_PERIOD ('.', '≥', '>', '˘', '.'),
VK_SLASH ('/', '÷', '?', '¿', '/'),
;
@@ -52,12 +52,12 @@ public enum Layout_US_INTERNATIONAL_PC implements LayoutKey {
private final Key key;
Layout_US_INTERNATIONAL_PC(char no, char alt, char shift, char alt_shift) {
key = new Key(name(), new MappedKeyChars(no, alt, shift, alt_shift));
Layout_US_INTERNATIONAL_PC(char no, char alt, char shift, char alt_shift, char control) {
key = new Key(name(), new MappedKeyChars(no, alt, shift, alt_shift, control));
}
Layout_US_INTERNATIONAL_PC(KeyChar no, KeyChar alt, KeyChar shift, KeyChar alt_shift) {
key = new Key(name(), new MappedKeyChars(no, alt, shift, alt_shift));
Layout_US_INTERNATIONAL_PC(KeyChar no, KeyChar alt, KeyChar shift, KeyChar alt_shift, KeyChar control) {
key = new Key(name(), new MappedKeyChars(no, alt, shift, alt_shift, control));
}
public Key getKey() {

View File

@@ -23,20 +23,22 @@ public class MappedKeyChars {
private final KeyChar alt;
private final KeyChar shift;
private final KeyChar alt_shift;
private final KeyChar control;
MappedKeyChars(char no_modifier, char alt, char shift, char alt_shift) {
MappedKeyChars(char no_modifier, char alt, char shift, char alt_shift, char control) {
this.no_modifier = KeyChar.ch(no_modifier);
this.alt = KeyChar.ch(alt);
this.shift = KeyChar.ch(shift);
this.alt_shift = KeyChar.ch(alt_shift);
this.control = KeyChar.ch(control);
}
MappedKeyChars(KeyChar no_modifier, KeyChar alt, KeyChar shift, KeyChar alt_shift) {
MappedKeyChars(KeyChar no_modifier, KeyChar alt, KeyChar shift, KeyChar alt_shift, KeyChar control) {
this.no_modifier = no_modifier;
this.alt = alt;
this.shift = shift;
this.alt_shift = alt_shift;
this.control = control;
}
/*
@@ -57,6 +59,9 @@ public class MappedKeyChars {
if(modifier.isAltShift()) {
return alt_shift;
}
if(modifier.isControl()) {
return control;
}
return KeyChar.ch(Character.MAX_VALUE);
}

View File

@@ -94,6 +94,10 @@ public enum Modifier {
return ((modifiers.length == 2) && list.contains(KeyEvent.VK_ALT) && list.contains(KeyEvent.VK_SHIFT));
}
boolean isControl() {
return ((modifiers.length == 1) && (modifiers[0] == KeyEvent.VK_CONTROL));
}
@Override
public String toString() {
if (modifiers.length == 0) {

View File

@@ -57,7 +57,9 @@ import java.util.stream.Collectors;
* - No keyTyped event is expected as the result of pressing dead key + key.
* - Pressing "dead key + space" generates corresponding diacritic character,
* which may be obtained using inputMethodTextChanged event.
* - Cmd, Ctrl and its combinations with other modifiers are considered as a "shortcut",
* - Ctrl can be used to type the "control characters" (0th to 31th character inclusively in the ASCII table),
* so Ctrl + key can generate keyTyped event.
* - Cmd and its combinations with other modifiers are considered as a "shortcut",
* no keyTyped event is expected as the result of pressing a shortcut,
* no attempts are made to check inputMethodTextChanged event result for a "shortcut".
*
@@ -182,7 +184,7 @@ public class NationalLayoutTest {
for (Modifier modifier : Modifier.values()) {
if(!testLayout(layout, modifier)) {
failed = true;
};
}
}
}
// Provide the test result
@@ -253,7 +255,7 @@ public class NationalLayoutTest {
// Corresponding latch is released in the typeAreaFocusListener.
if(!typeAreaGainedFocus.await(PAUSE, TimeUnit.MILLISECONDS)) {
throw new RuntimeException("TEST ERROR: Failed to request focus in the text area for typing");
};
}
}
/*
@@ -305,9 +307,21 @@ public class NationalLayoutTest {
// Obtain typed char
char keyChar = e.getKeyChar();
int keyCode = KeyEvent.getExtendedKeyCodeForChar(keyChar);
if ((keyCode != NEXT_MODIFIER) && (keyCode != NEXT_KEY) && (keyCode != TERMINATE_KEY)) {
// Store typed char to the corresponding list
charsTyped.add(keyChar);
switch (keyCode) {
case NEXT_MODIFIER:
case NEXT_KEY:
case TERMINATE_KEY:
if ((e.getModifiers() & KeyEvent.CTRL_MASK) == 0) {
// Do not store the typed char only if it is NEXT_MODIFIER, NEXT_KEY, TERMINATE_KEY generated
// without Control modifier: the Control allows to "type" the "control characters"
// (0th to 31th character inclusively in the ASCII table).
break;
}
default:
// Store typed char to the corresponding list
charsTyped.add(keyChar);
break;
}
}
};
@@ -356,7 +370,7 @@ public class NationalLayoutTest {
}
if(!nextModifierSet.await(PAUSE*10, TimeUnit.MILLISECONDS)) {
throw new RuntimeException("TEST ERROR: User has not proceeded with manual testing");
};
}
// Clean up the test text areas
inputArea.setText("");
@@ -411,7 +425,7 @@ public class NationalLayoutTest {
if(!nextKey.await(PAUSE, TimeUnit.MILLISECONDS)) {
throw new RuntimeException("TEST ERROR: "
+ KeyEvent.getKeyText(NEXT_KEY) + " key pressed event was not received");
};
}
// Define array of key codes expected to be pressed as the result of modifiers + key
int[] keysPattern = Arrays.copyOf(modifiers, modifiers.length + 1);
@@ -426,7 +440,7 @@ public class NationalLayoutTest {
// Check if the pressed key codes are equal to the expected ones
if(!checkResult(keysPattern, keysResult, null,null)) {
result = false;
};
}
} else {
// Define array of chars expected to be typed as the result of modifiers + key
// Do not expect any char typed as the result of shortcut (char is undefined in this case)
@@ -440,7 +454,7 @@ public class NationalLayoutTest {
// Check if pressed key codes and typed chars are equal to the expected ones
if(!checkResult(keysPattern, keysResult, charsPattern, charsResult)) {
result = false;
};
}
}
}
// Provide layout + modifier testing result
@@ -473,7 +487,7 @@ public class NationalLayoutTest {
boolean checkKeys = Arrays.equals(patternKeys, resultKeys);
boolean checkChars = Arrays.equals(patternChars, resultChars);
boolean result = (checkKeys & checkChars);
boolean result = (checkKeys && checkChars);
if(!result) {
String[] patternStr = (patternKeys != null) ? intsToStrings(patternKeys) : null;

View File

@@ -935,4 +935,7 @@ com/sun/java/swing/plaf/windows/Test8173145.java
com/sun/java/swing/plaf/windows/AltFocusIssueTest.java JBR-4197 windows-all
java/awt/event/MouseEvent/AltGraphModifierTest/AltGraphModifierTest.java JBR-4207 windows-all
jb/java/awt/keyboard/AltGrMustGenerateAltGrModifierTest4207.java JBR-4207 windows-all
jb/java/awt/keyboard/AltGrMustGenerateAltGrModifierTest4207.java JBR-4207 windows-all
java/awt/Dialog/NonResizableDialogSysMenuResize/NonResizableDialogSysMenuResize.java TBD windows-all
java/awt/Dialog/NestedDialogs/Modeless/NestedModelessDialogTest.java TBD windows-all

View File

@@ -0,0 +1 @@
javax/imageio/plugins/external_plugin_tests/TestClassPathPlugin.sh nobug generic-all line 59: /opt/teamcity-agent/work/efb45cc305c2e813/jbr/Contents/Home/bin/jar: No such file or directory