Commit Graph

372 Commits

Author SHA1 Message Date
rdb 14f3cb0e40 tests: Add unit test for static property 2024-09-19 20:25:45 +02:00
John C. Allwein e7604cb163 event: fix result refcount leak when awaiting AsyncFuture
Raising the StopIteration exception left the underlying
result with an elevated refcount which prevented it from
being cleaned up.
2024-09-14 15:59:05 -06:00
John C. Allwein cfe3885c0e event: use the persistent python wrapper when appending task object (#1681) 2024-09-14 20:25:08 +02:00
rdb fc394e4c59 glgsg: Pass in osg_FrameNumber input via ShaderMatSpec mechanism 2024-08-23 21:08:50 +02:00
rdb 99225dfaef shader: Unify ShaderPtrSpec and ShaderMatSpec mechanisms 2024-08-23 16:29:42 +02:00
rdb dfc85b8a68 tests: Make shadowViewMatrix test less sensitive 2024-08-23 16:28:10 +02:00
rdb a8ca06ea47 tests: Don't fail Dial test if tkinter failed to import 2024-08-23 14:20:38 +02:00
rdb e2ad8f2a2f tests: Test additional properties of light source struct 2024-08-23 14:20:35 +02:00
rdb d5d0b80dd3 tests: Add unit tests for GLSL light, material, fog structs 2024-08-23 12:35:01 +02:00
John C. Allwein 21b39da65d pythonTask: fix refcount leak of non-panda Future::done
A missing Py_DECREF on the future's "done" method
caused both the bound method and the underlying
self instance of the future to be leaked when
awaiting non-panda futures (such as _asyncio.Future).

This change includes a simple new test addition
to catch this in the future.
2024-08-08 21:51:03 -06:00
rdb ad57762e9f Merge branch 'release/1.10.x' 2024-08-07 22:34:08 +02:00
rdb 8c8cbeea98 linmath: For repr, use as much precision as needed for roundtrip
Will use as few digits as is necessary to ensure that round-tripping the same number with pstrtod will result in the same vector.  This prevents eg. 3.3 formatting as 3.29999995 while still ensuring that two floats that are not equal (other than nan) are guaranteed to have a different string representation.

Uses a hacky pftoa function that can be abandoned as soon as we adopt C++17, which has to_chars that does what we need

Fixes #1671
2024-08-07 17:24:11 +02:00
rdb b6ec48b27c Fix invalid metadata version 2.0 (should be 2.1) 2024-05-28 22:28:37 +02:00
rdb 96e2e7d357 tests: Remove testing for AssertionError
This crashes with `assert-abort` and doesn't work with release builds
2024-03-29 20:57:36 +01:00
rdb e5bd00f91f task: Implement garbage collector support for PythonTask
This adds persistent wrapper support (introduced by the previous commit) to PythonTask, which makes it possible for reference cycles involving tasks to be found and destroyed.

The major caveat is that it always creates a reference cycle.  This can be broken automatically if there is no more Python reference to it by the time the last C++ reference is dropped, but the other way around requires the garbage collector.

For tasks, I think this it is generally the case that the last reference is in C++, since tasks are usually created and then handed off to the C++ task manager, and for applications that don't want to rely on the GC, it is easy to work around.  If this turns out to be a problem, though, we can add a special garbage collection pass to the task manager.
2024-03-29 20:51:45 +01:00
rdb 38692dd525 interrogate: Support subclassing C++ objects from Python
This change enables persistent Python wrapper objects for Python subclasses of typed, reference counted C++ objects.  That means that these objects will store a reference to `self` on the C++ object, and interrogate will always return that instead of making a new Python wrapper every time it is returned from C++.

Practically, this means that you could subclass eg. PandaNode, Event, Fog, what have you, and store these in the scene graph - the Python data in the subclass will be retained and Panda will return your subclass when you ask for the object back rather than creating a new wrapper object without your original data.

To do this, Interrogate generates a proxy class inheriting from the C++ type with additional room to store a `self` pointer and a TypeHandle (which is returned by an overridden `get_type()`).  This TypeHandle is automatically created by registering the Python subclass with the typing system.  The proxy class is only used when the constructor detects that it's constructing for a subtype, so that regular uses of the C++ type are not affected by this mechanism.

(The registration with the typing system could use some improvement.  There's no regard for namespacing right now, in particular.  Furthermore, we could move the registration to an `__init_subclass__()` method, with parameters to specify an existing TypeHandle or to customize the type name.)

This creates a reference cycle, which must be cleared somehow.  One way this happens is by overriding `unref()` in the proxy, which checks that if the Python and C++ reference counts are both 1, this must be the circular reference, and then it breaks the cycle.  Note that this will _only_ work if all other Python references have been cleared before the last C++ reference goes away.  For the other case, we need to rely on Python's garbage collector, so these classes also implement tp_traverse and tp_clear.

This commit also therefore re-enables Python garbage collector support (ie. defining `__traverse__()`), which was previously disabled due to the problems caused by multiple Python wrappers referring to the same C++ object.  To avoid these problems, Panda will only cooperate with Python's GC if the C++ reference count is 1, in which case we can trivially prove that the last reference must be from the Python wrapper.  Note that this explains why we need persistent wrappers for traversal to work--if there are multiple Python wrappers pointing to the C++ object, and they are all participating in a reference cycle, the reference count cannot be 1, and cycle detection does not work.  By default, the GC is only enabled for Python subclasses, but a class may define `__traverse__()` in order to opt-in, keeping the previous limitation in mind.

There is a second mechanism introduced by this commit: classes may define a public `__self__` member of type `PyObject *` if they want to use persistent objects even if they aren't being subclassed.  This allows these classes to participate in Python's GC and avoid the situation above.

The cycle detection is implemented for PandaNode's Python tags, but this is very incomplete, since the traversal doesn't recurse into children and it won't work if there is more than one wrapper object that is part of a cycle, since PandaNode by default doesn't use persistent wrappers.  This problem may need more attention later.

Fixes #1410
2024-03-29 20:51:34 +01:00
rdb b605e1240c tests: Add unit test to check new panda3d.net module 2024-03-02 13:41:23 +01:00
rdb 84ed141b2a Squash merge webgl-port branch into master
Adds support for emscripten as a build target / platform, and adds a WebGL renderer back-end
2024-01-25 15:37:38 +01:00
rdb ecc1e30ef6 Merge branch 'release/1.10.x' 2024-01-23 16:56:38 +01:00
rdb 8c74919a8b dgui: Make copy of mutable default value
Fixes #1587
2024-01-23 14:51:44 +01:00
rdb 9145b6c729 Merge branch 'release/1.10.x' 2024-01-04 16:36:03 +01:00
rdb edf4b7d448 tests: Also skip Cg unit tests on arm64 reporting as aarch64
[skip ci]
2023-10-22 12:24:33 +02:00
rdb 4bdf85348f tests: Don't expect mypy to be on the system PATH 2023-10-22 10:39:41 +02:00
WMOkiishi 0380a60e58 tests: Fix mypy test (#1551) 2023-10-22 10:34:46 +02:00
rdb 277460061e Merge branch 'release/1.10.x' 2023-10-15 23:02:47 +02:00
rdb 3059f8f76b tests: Add site.py file for deploy-stub test 2023-10-15 16:23:02 +02:00
rdb cb7f25f59c tests: Fix an issue running tests with some Python 3.4 setups 2023-10-15 16:21:30 +02:00
rdb 479774477b tests: Compat w/ older pytest by using tmpdir instead of tmp_path 2023-10-15 14:48:01 +02:00
rdb a6ab238abc Merge branch 'release/1.10.x' into incoming 2023-10-14 21:35:00 +02:00
rdb 1db6dbc166 tests: Don't cache loaded test model 2023-10-14 21:24:22 +02:00
rdb 476374b814 tests: Don't run tkpanels.Placer test without Tk already inited
Necessary for being able to run test suite on macOS
2023-10-14 20:07:35 +02:00
rdb f9c213fcbb tests: Run runtime executable generated by FreezeTool test 2023-10-14 17:35:16 +02:00
rdb b2465c3b38 tests: Fix running tests on Windows and with Python 2.7 2023-10-14 17:31:35 +02:00
rdb 972c0009ac workflow: Add setuptools as requirement when testing Python 3.12 2023-10-14 11:29:02 +02:00
rdb c1c035d5c9 showbase: Switch Loader entry point detection to importlib.metadata
Only in Python 3.8 and up, where this module is available, otherwise it falls back to pkg_resources

Add unit test for custom entry point loaders
2023-10-14 11:27:46 +02:00
rdb f24a18f45e tests: Add unit test for Freezer.generateRuntimeFromStub 2023-10-14 09:55:37 +02:00
rdb e01cb590de Merge branch 'release/1.10.x' 2023-10-13 23:24:48 +02:00
WMOkiishi 098fe634a5 task: Annotate core functions (#1548) 2023-10-13 21:20:20 +02:00
rdb 2a5228b05f Fix compatibility with Python 3.12 by removing use of imp module
Some modules (such as VFSImporter, and various modules in direct.p3d that depend on it) are still unavailable.
2023-10-13 13:21:34 +02:00
rdb 225b577ccd tests: Skip Cg tests on arm64 machines 2023-10-13 10:55:17 +02:00
Mitchell Stokes 893f5ce492 Fix assert on Py_SIZE(long) when using Python 3.12
Starting with Python 3.12, passing a PyLong into Py_SIZE() triggers an
assertion. PyLong (and the whole C API) is transitioning to be more
opaque and expose fewer implementation details.
2023-10-13 10:54:33 +02:00
WMOkiishi 1ca0e3f1ea directnotify: annotate types (#1527) 2023-10-09 09:46:32 +02:00
Christopher He cbfd8f4545 collide: Add CollisionHeightfield solid (#691) 2023-08-05 21:14:52 +02:00
rdb c203b0f786 tests: Don't require tkinter to be able to run test suite 2023-08-05 10:29:32 +02:00
WMOkiishi 32edfa43fd direct: Get direct to pass a mypy check
Closes #1476
2023-08-04 14:31:44 +02:00
rdb f80cd08993 Remove support for EOL Python versions 3.6 and 3.7 2023-08-04 14:20:59 +02:00
rdb a68ecb9765 Merge branch 'release/1.10.x' 2023-08-04 14:07:41 +02:00
rdb 3f3819e7fa tests: Further expand on tools tests 2023-08-03 13:21:38 +02:00
rdb 4537540820 tests: Look for tools in proper location without relying on PATH 2023-08-02 16:45:40 +02:00
rdb 1cb2554c48 tests: Test that tools run when testing wheels
Intended to catch issues like #1504
2023-08-02 16:36:04 +02:00