Skip to content

Commit 78d2f76

Browse files
committed
Treat illegal reflective access in test_gc_jy.
By default we no longer use reflection when traversing cyclic isolates (cyclic garbage) so that reflective access warnings will not be produced. However, we enable it, for one class of test case only, on Java versions less than 9. The clauses of the original test are made individual tests to aid debug.
1 parent a192291 commit 78d2f76

2 files changed

Lines changed: 41 additions & 34 deletions

File tree

Lib/test/test_gc_jy.py

Lines changed: 40 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ def setUpClass(cls):
3333
gc.stopMonitoring()
3434
except Exception:
3535
pass
36-
36+
3737
@classmethod
3838
def tearDownClass(cls):
3939
try:
@@ -371,7 +371,7 @@ def __del__(self):
371371
class Test_Resurrection(object):
372372
def __init__(self, name):
373373
self.name = name
374-
374+
375375
def __repr__(self):
376376
return "<"+self.name+">"
377377

@@ -385,7 +385,7 @@ def __del__(self):
385385
c = Test_Resurrection("c")
386386
c.a = a
387387
c.toResurrect = Test_Finalizable("d")
388-
388+
389389
del a
390390
del c
391391
self.assertNotEqual(gc.collect(), 0)
@@ -552,7 +552,7 @@ def __del__(self):
552552
class Test_Resurrection(object):
553553
def __init__(self, name):
554554
self.name = name
555-
555+
556556
def __repr__(self):
557557
return "<"+self.name+">"
558558

@@ -566,7 +566,7 @@ def __del__(self):
566566
c = Test_Resurrection("c")
567567
c.a = a
568568
c.toResurrect = Test_Finalizable("d")
569-
569+
570570
del a
571571
del c
572572
self.assertNotEqual(gc.collect(), 0)
@@ -616,31 +616,31 @@ def tearDownClass(cls):
616616
def test_raw_forced_delayedFinalization(self):
617617
#print "test_raw_forced_delayedFinalization"
618618
comments = []
619-
619+
620620
class Test_JavaAbortFinalizable(Object):
621621
def __init__(self, name, toAbort):
622622
self.name = name
623623
self.toAbort = toAbort
624-
624+
625625
def __repr__(self):
626626
return "<"+self.name+">"
627-
627+
628628
def finalize(self):
629629
gc.notifyPreFinalization()
630630
comments.append("del "+self.name)
631631
gc.abortDelayedFinalization(self.toAbort)
632632
gc.notifyPostFinalization()
633-
633+
634634
class Test_Finalizable(object):
635635
def __init__(self, name):
636636
self.name = name
637-
637+
638638
def __repr__(self):
639639
return "<"+self.name+">"
640-
640+
641641
def __del__(self):
642642
comments.append("del "+self.name)
643-
643+
644644
def callback(obj):
645645
comments.append("callback0")
646646

@@ -666,12 +666,12 @@ def callback(obj):
666666
def test_raw_forced_delayedWeakrefCallback(self):
667667
comments = []
668668
resurrected = []
669-
669+
670670
class Test_JavaResurrectFinalizable(Object):
671671
def __init__(self, name, toResurrect):
672672
self.name = name
673673
self.toResurrect = toResurrect
674-
674+
675675
def __repr__(self):
676676
return "<"+self.name+">"
677677

@@ -684,20 +684,20 @@ def finalize(self):
684684
# We manually restore weak references:
685685
gc.restoreWeakReferences(self.toResurrect)
686686
gc.notifyPostFinalization()
687-
687+
688688
class Test_Finalizable(object):
689689
def __init__(self, name):
690690
self.name = name
691-
691+
692692
def __repr__(self):
693693
return "<"+self.name+">"
694-
694+
695695
def __del__(self):
696696
comments.append("del "+self.name)
697-
697+
698698
def callback(obj):
699699
comments.append("callback")
700-
700+
701701
a = Test_Finalizable("a")
702702
b = Test_JavaResurrectFinalizable("b", a)
703703
wa = weakref.ref(a, callback)
@@ -723,15 +723,15 @@ def callback(obj):
723723

724724
def test_raw_forced_delayed(self):
725725
comments = []
726-
726+
727727
class Test_JavaAbortFinalizable(Object):
728728
def __init__(self, name, toAbort):
729729
self.name = name
730730
self.toAbort = toAbort
731-
731+
732732
def __repr__(self):
733733
return "<"+self.name+">"
734-
734+
735735
def finalize(self):
736736
gc.notifyPreFinalization()
737737
comments.append("del "+self.name)
@@ -826,7 +826,7 @@ def __del__(self):
826826
class Test_Resurrection(object):
827827
def __init__(self, name):
828828
self.name = name
829-
829+
830830
def __repr__(self):
831831
return "<"+self.name+">"
832832

@@ -926,7 +926,7 @@ def __del__(self):
926926
class Test_Resurrection(object):
927927
def __init__(self, name):
928928
self.name = name
929-
929+
930930
def __repr__(self):
931931
return "<"+self.name+">"
932932

@@ -976,7 +976,7 @@ def __del__(self):
976976
class Test_Resurrection(object):
977977
def __init__(self, name):
978978
self.name = name
979-
979+
980980
def __repr__(self):
981981
return "<"+self.name+">"
982982

@@ -1035,7 +1035,7 @@ def __del__(self):
10351035
class Test_Resurrection(object):
10361036
def __init__(self, name):
10371037
self.name = name
1038-
1038+
10391039
def __repr__(self):
10401040
return "<"+self.name+">"
10411041

@@ -1071,18 +1071,18 @@ def __del__(self):
10711071
self.assertEqual(wc(), None)
10721072

10731073

1074-
@unittest.skipUnless(test_support.is_jython,
1075-
'''
1076-
The test involves Java-classes and is thus not supported by
1077-
non-Jython interpreters.
1078-
''')
1074+
@unittest.skipUnless(test_support.is_jython and test_support.get_java_version() < (9,),
1075+
"Test is specific to Java versions <9")
1076+
# From Java 9 onwards we get ugly warnings.
1077+
# See discussion in http://bugs.jython.org/issue2656
10791078
class GCTests_Jy_TraverseByReflection(unittest.TestCase):
10801079

10811080
@classmethod
10821081
def setUpClass(cls):
10831082
#Jython-specific block:
10841083
try:
10851084
cls.savedJythonGCFlags = gc.getJythonGCFlags()
1085+
gc.removeJythonGCFlags(gc.DONT_TRAVERSE_BY_REFLECTION) # i.e. enable ...
10861086
gc.addJythonGCFlags(gc.SUPPRESS_TRAVERSE_BY_REFLECTION_WARNING)
10871087
gc.setMonitorGlobal(True)
10881088
except Exception:
@@ -1096,25 +1096,32 @@ def tearDownClass(cls):
10961096
except Exception:
10971097
pass
10981098

1099-
def test_TraverseByReflection(self):
1099+
def test_Field(self):
11001100
gc.collect()
1101-
11021101
prt = GCTestHelper.reflectionTraverseTestField()
11031102
del prt
11041103
self.assertEqual(gc.collect(), 1)
11051104

1105+
def test_List(self):
1106+
gc.collect()
11061107
prt = GCTestHelper.reflectionTraverseTestList()
11071108
del prt
11081109
self.assertEqual(gc.collect(), 1)
11091110

1111+
def test_Array(self):
1112+
gc.collect()
11101113
prt = GCTestHelper.reflectionTraverseTestArray()
11111114
del prt
11121115
self.assertEqual(gc.collect(), 1)
11131116

1117+
def test_PyList(self):
1118+
gc.collect()
11141119
prt = GCTestHelper.reflectionTraverseTestPyList()
11151120
del prt
11161121
self.assertEqual(gc.collect(), 2)
11171122

1123+
def test_Cycle(self):
1124+
gc.collect()
11181125
prt = GCTestHelper.reflectionTraverseTestCycle()
11191126
del prt
11201127
self.assertEqual(gc.collect(), 0)

src/org/python/modules/gc.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -469,7 +469,7 @@ public class gc {
469469
DEBUG_OBJECTS |
470470
DEBUG_SAVEALL;
471471

472-
private static short gcFlags = 0;
472+
private static short gcFlags = DONT_TRAVERSE_BY_REFLECTION;
473473
private static int debugFlags = 0;
474474
private static boolean monitorNonTraversable = false;
475475
private static boolean waitingForFinalizers = false;

0 commit comments

Comments
 (0)