-
Notifications
You must be signed in to change notification settings - Fork 36
Open
Labels
Description
What pointer_attribute expects is CustomType not Array/BasePointer.
Source.Python/addons/source-python/packages/source-python/memory/helpers.py
Lines 235 to 237 in 0171b36
def __setitem__(self, index, value): | |
"""Set the value at the given index.""" | |
self._make_attribute(index).__set__(self, value) |
Source.Python/addons/source-python/packages/source-python/memory/manager.py
Lines 496 to 525 in 0171b36
def fset(ptr, value): | |
"""Set the pointer attribute value.""" | |
# Handle custom type | |
if not native_type: | |
# Set the pointer | |
ptr.set_pointer(value, offset) | |
# Make sure the value will not deallocate as long as it is | |
# part of this object | |
ptr._pointer_values[offset] = value | |
# Handle native type | |
else: | |
# Go down to "instance level" | |
instance_ptr = ptr.get_pointer(offset) | |
# Is there no space allocated? | |
if not instance_ptr: | |
# Allocate space for the value | |
instance_ptr = alloc(TYPE_SIZES[type_name.upper()]) | |
# Add the pointer to the set, so there will be a reference | |
# until the instance gets deleted | |
ptr._allocated_pointers.add(instance_ptr) | |
# Set the pointer | |
ptr.set_pointer(instance_ptr, offset) | |
# Set the value | |
getattr(instance_ptr, 'set_' + type_name)(value) |
And even if the Array inherits CustomType, the pointers set in the Array will be immediately discarded if not managed independently since the Array is dynamically created. (#490)
Code:
from memory.manager import CustomType
from memory.manager import TypeManager
type_manager = TypeManager()
class TestStaticPointerArray(CustomType, metaclass=type_manager):
_size = 4
static_vec_array = type_manager.static_pointer_array("Vector", 0, 1)
def test_static_pointer_array():
test = TestStaticPointerArray()
test.static_vec_array[0] = Vector(0.1, 0.1, 0.1)
print(test.static_vec_array[0])
test_static_pointer_array()
Output:
[SP] Caught an Exception:
Traceback (most recent call last):
File "../addons/source-python/packages/source-python/plugins/command.py", line 164, in load_plugin
plugin = self.manager.load(plugin_name)
File "../addons/source-python/packages/source-python/plugins/manager.py", line 209, in load
plugin._load()
File "../addons/source-python/packages/source-python/plugins/instance.py", line 74, in _load
self.module = import_module(self.import_name)
File "../addons/source-python/plugins/test/test.py", line 4703, in <module>
test_static_pointer_array()
File "../addons/source-python/plugins/test/test.py", line 4700, in test_static_pointer_array
test.static_vec_array[0] = Vector(0.1, 0.1, 0.1)
File "../addons/source-python/packages/source-python/memory/helpers.py", line 237, in __setitem__
self._make_attribute(index).__set__(self, value)
File "../addons/source-python/packages/source-python/memory/manager.py", line 505, in fset
ptr._pointer_values[offset] = value
AttributeError: 'Array' object has no attribute '_pointer_values'