Projects
Eulaceura:Mainline:GA
jython
_service:obs_scm:jython-no-carrotsearch-sizeof....
Sign Up
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File _service:obs_scm:jython-no-carrotsearch-sizeof.patch of Package jython
diff --git a/ACKNOWLEDGMENTS b/ACKNOWLEDGMENTS index 9c4370e..a435834 100644 --- a/ACKNOWLEDGMENTS +++ b/ACKNOWLEDGMENTS @@ -35,6 +35,7 @@ Jython links the following libraries: * Mock Runner, licensed under the Apache 1.1 license * Netty 4, licensed under the Apache 2.0 license from the Netty project * PyPy datetime module, licensed under the MIT License from the PyPy project +* Java sizeof, licensed under the Apache 2.0 License from the Apache Software Foundation Jython follows closely the Python language and its reference implementation CPython, as created by Guido van Rossum. diff --git a/Lib/test/test_support.py b/Lib/test/test_support.py index fc33854..7d280c5 100644 --- a/Lib/test/test_support.py +++ b/Lib/test/test_support.py @@ -1021,7 +1021,7 @@ def gc_collect(): gc.collect() -_header = '2P' +_header = '1P' if hasattr(sys, "gettotalrefcount"): _header = '2P' + _header _vheader = _header + 'P' diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py index e88445b..c038a9f 100644 --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -1,6 +1,8 @@ # -*- coding: iso-8859-1 -*- import unittest, test.test_support import sys, cStringIO +import struct + class SysModuleTest(unittest.TestCase): @@ -271,12 +273,84 @@ class SysModuleTest(unittest.TestCase): self.assertEqual(out, '?') +class SizeofTest(unittest.TestCase): + """Jython modified version of getsizeof""" + + def setUp(self): + self.P = struct.calcsize('P') + self.longdigit = sys.long_info.sizeof_digit + self.file = open(test.test_support.TESTFN, 'wb') + + def tearDown(self): + self.file.close() + test.test_support.unlink(test.test_support.TESTFN) + + check_sizeof = test.test_support.check_sizeof + + def test_default(self): + size = test.test_support.calcobjsize + self.assertEqual(sys.getsizeof(True, -1), size('l')) + + def test_objecttypes(self): + # check all types defined in Objects/ + size = test.test_support.calcobjsize + vsize = test.test_support.calcvobjsize + check = self.check_sizeof + # bool + check(True, size('l')) + # buffer + with test.test_support.check_py3k_warnings(): + check(buffer(''), size('1P2Pil')) + # builtin_function_or_method + check(len, size('3P')) + # bytearray_iterator + check(iter(bytearray()), size('2PP')) + # cell + def get_cell(): + x = 42 + def inner(): + return x + return inner + check(get_cell().func_closure[0], size('2P')) + # classobj (old-style class) + class class_oldstyle(): + def method(): + pass + check(class_oldstyle, size('6P')) + # instance (old-style class) + check(class_oldstyle(), size('3P')) + # instancemethod (old-style class) + check(class_oldstyle().method, size('3P')) + # complex + check(complex(0,1), size('2P2d')) + # code + check(get_cell().func_code, size('4i3Pi3P')) + # BaseException + check(BaseException(), size('3P')) + + def test_pythontypes(self): + # check all types defined in Python/ + size = test.test_support.calcobjsize + vsize = test.test_support.calcvobjsize + check = self.check_sizeof + # imp.NullImporter + import imp + check(imp.NullImporter(self.file.name), size('3P')) + try: + raise TypeError + except TypeError: + tb = sys.exc_info()[2] + # traceback + if tb != None: + check(tb, size('2P2i')) + + def test_main(): if test.test_support.is_jython: del SysModuleTest.test_lost_displayhook del SysModuleTest.test_refcount del SysModuleTest.test_setcheckinterval - test.test_support.run_unittest(SysModuleTest) + test.test_support.run_unittest(SysModuleTest, SizeofTest) if __name__ == "__main__": test_main() diff --git a/build.xml b/build.xml index 46d288f..0f15f74 100644 --- a/build.xml +++ b/build.xml @@ -155,6 +155,7 @@ oracle.jar=C:/workspace/HEAD/for_development/bisdevsrv28/jboss/server/infra/lib/ <pathelement path="${extlibs.dir}/guava-22.0-android.jar" /> <pathelement path="${extlibs.dir}/icu4j-59_1.jar" /> <pathelement path="${extlibs.dir}/jffi-1.2.15.jar"/> + <pathelement path="${extlibs.dir}/java-sizeof-0.0.5.jar"/> <pathelement path="${extlibs.dir}/jnr-ffi-2.1.5.jar"/> <pathelement path="${extlibs.dir}/jnr-netdb-1.1.6.jar"/> <pathelement path="${extlibs.dir}/jnr-posix-3.0.41.jar"/> @@ -577,8 +578,10 @@ The readme text for the next release will be like: <rule pattern="io.netty.**" result="org.python.netty.@1"/> <zipfileset src="extlibs/netty-transport-4.1.11.Final.jar" excludes="META-INF/**"/> <rule pattern="io.netty.**" result="org.python.netty.@1"/> - <!-- these stub jars are pre-built in https://github.com/jnr/jffi/tree/master/archive - and rarely if ever change --> + <zipfileset src="${extlibs.dir}/java-sizeof-0.0.5.jar"/> + <rule pattern="com.carrotsearch.sizeof.**" result="org.python.sizeof.@1"/> + <!-- these stub jars are pre-built in https://github.com/jnr/jffi/tree/master/archive + and rarely if ever change --> <zipfileset src="extlibs/jffi-aarch64-Linux.jar"/> <zipfileset src="extlibs/jffi-arm-Linux.jar"/> <zipfileset src="extlibs/jffi-Darwin.jar"/> diff --git a/src/org/python/core/PySystemState.java b/src/org/python/core/PySystemState.java index 6ec694c..335a70e 100644 --- a/src/org/python/core/PySystemState.java +++ b/src/org/python/core/PySystemState.java @@ -32,8 +32,8 @@ import java.util.concurrent.ConcurrentMap; import java.util.concurrent.locks.ReentrantLock; import java.util.jar.JarEntry; import java.util.jar.JarFile; - import jnr.posix.util.Platform; +import com.carrotsearch.sizeof.RamUsageEstimator; import org.python.Version; import org.python.core.adapter.ClassicPyObjectAdapter; @@ -434,6 +434,15 @@ public class PySystemState extends PyObject implements AutoCloseable, return recursionlimit; } + @SuppressWarnings("unused") + public long getsizeof(Object obj, long defaultVal) { + return getsizeof(obj); + } + + public long getsizeof(Object obj) { + return RamUsageEstimator.shallowSizeOf(obj); + } + public void setrecursionlimit(int recursionlimit) { if (recursionlimit <= 0) { throw Py.ValueError("Recursion limit must be positive"); diff --git a/src/org/python/modules/gc.java b/src/org/python/modules/gc.java index 633621e..997a97a 100644 --- a/src/org/python/modules/gc.java +++ b/src/org/python/modules/gc.java @@ -2558,13 +2558,30 @@ public class gc { } /** - * Not supported by Jython. + * Only works reliably if {@code monitorGlobal} is active, as it depends on + * monitored objects to search for referrers. It only finds referrers that + * properly implement the traverseproc mechanism (unless reflection-based + * traversion is activated and works stable). * Throws {@link org.python.core.Py#NotImplementedError}. * * @throws org.python.core.Py.NotImplementedError */ public static PyObject get_objects() { - throw Py.NotImplementedError("not applicable to Java GC"); + if (!isMonitoring()) { + throw Py.NotImplementedError( + "not applicable in Jython if gc module is not monitoring PyObjects"); + } + ArrayList<PyObject> resultList = new ArrayList<>(monitoredObjects.size()); + synchronized (monitoredObjects) { + for (WeakReferenceGC src: monitoredObjects) { + PyObject obj = src.get(); + if (isTraversable(obj)) { + resultList.add(obj); + } + } + } + resultList.trimToSize(); + return new PyList(resultList); } /**
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.
浙ICP备2022010568号-2