Skip to content

Commit ec30bb7

Browse files
committed
mem: drop struct access compatibility wrappers
No in-tree runtime code still depends on Memory.access or the allocator-side access shim. Keeping those wrappers in alloc.py only preserved an extra API layer around typed structs and hid whether callers were still using the old path. Remove Memory.access, MemoryAlloc.access, and the internal struct access compatibility adapter. Keep Memory wrappers for ownership and labels, but make struct allocations expose only the typed struct object. Update the allocator tests to check the direct binding behaviour instead of the removed compatibility surface.
1 parent 8368a2f commit ec30bb7

2 files changed

Lines changed: 14 additions & 92 deletions

File tree

amitools/vamos/mem/alloc.py

Lines changed: 7 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,13 @@
11
from amitools.vamos.error import *
22
from amitools.vamos.log import log_mem_alloc
33
from amitools.vamos.label import LabelRange, LabelStruct, LabelLib
4-
from amitools.vamos.astructs.astruct import AmigaStruct
5-
from amitools.vamos.astructs.pointer import BCPLPointerType
64

75

86
class Memory:
9-
def __init__(self, addr, size, label, access, struct=None):
7+
def __init__(self, addr, size, label, struct=None):
108
self.addr = addr
119
self.size = size
1210
self.label = label
13-
self.access = access
1411
self.struct = struct
1512

1613
def __str__(self):
@@ -20,75 +17,6 @@ def __str__(self):
2017
return "[@%06x +%06x %06x]" % (self.addr, self.size, self.addr + self.size)
2118

2219

23-
class _StructAccessCompat:
24-
"""Temporary compatibility adapter for Memory.access.
25-
26-
New code should use the typed ``Memory.struct`` object directly.
27-
"""
28-
29-
_field_path_cache = {}
30-
31-
def __init__(self, struct_def, struct):
32-
self._struct_def = struct_def
33-
self.struct = struct
34-
35-
def w_s(self, name, val):
36-
field, field_def = self._get_field_for_name(name)
37-
if issubclass(field_def.type, BCPLPointerType):
38-
field.set_ref_addr(val)
39-
else:
40-
field.set(val)
41-
42-
def r_s(self, name):
43-
field, field_def = self._get_field_for_name(name)
44-
if issubclass(field_def.type, BCPLPointerType):
45-
return field.get_ref_addr()
46-
return field.get()
47-
48-
def s_get_addr(self, name):
49-
field, _ = self._get_field_for_name(name)
50-
return field.get_addr()
51-
52-
def get_size(self):
53-
return self.struct.get_byte_size()
54-
55-
@classmethod
56-
def _get_cached_field_path(cls, struct_def, name):
57-
cache = cls._field_path_cache.setdefault(struct_def, {})
58-
path = cache.get(name)
59-
if path is not None:
60-
return path
61-
sdef = struct_def.sdef
62-
idx_path = []
63-
field_def = None
64-
for field_name in name.split("."):
65-
field_def = sdef.find_field_def_by_name(field_name)
66-
if not field_def:
67-
raise KeyError(struct_def, name)
68-
idx_path.append(field_def.index)
69-
field_type = field_def.type.get_alias_type()
70-
if issubclass(field_type, AmigaStruct):
71-
sdef = field_type.sdef
72-
else:
73-
sdef = None
74-
path = (tuple(idx_path), field_def)
75-
cache[name] = path
76-
return path
77-
78-
def _get_field_for_name(self, name):
79-
struct = self.struct
80-
field = None
81-
idx_path, field_def = self._get_cached_field_path(self._struct_def, name)
82-
for idx in idx_path:
83-
assert struct is not None
84-
field = struct.sfields.get_field_by_index(idx)
85-
if isinstance(field, AmigaStruct):
86-
struct = field
87-
else:
88-
struct = None
89-
return field, field_def
90-
91-
9220
class MemoryChunk:
9321
def __init__(self, addr, size):
9422
self.addr = addr
@@ -126,8 +54,6 @@ def __init__(self, mem, addr=0, size=0, label_mgr=None):
12654
self.addr = addr
12755
self.size = size
12856
self.label_mgr = label_mgr
129-
# compat link
130-
self.access = mem
13157

13258
self.addrs = {}
13359
self.mem_objs = {}
@@ -397,7 +323,7 @@ def alloc_memory(self, size, label=None, except_on_failure=True):
397323
self.label_mgr.add_label(label_obj)
398324
else:
399325
label_obj = None
400-
mem = Memory(addr, size, label_obj, self.mem)
326+
mem = Memory(addr, size, label_obj)
401327
log_mem_alloc.info("alloc memory: %s", mem)
402328
self.mem_objs[addr] = mem
403329
return mem
@@ -420,22 +346,20 @@ def alloc_struct(self, struct, size=None, label=None):
420346
else:
421347
label_obj = None
422348
struct_obj = struct(self.mem, addr)
423-
access = _StructAccessCompat(struct, struct_obj)
424-
mem = Memory(addr, size, label_obj, access, struct_obj)
349+
mem = Memory(addr, size, label_obj, struct_obj)
425350
log_mem_alloc.info("alloc struct: %s", mem)
426351
self.mem_objs[addr] = mem
427352
return mem
428353

429354
def map_struct(self, addr, struct, label=None):
430355
size = struct.get_size()
431356
struct_obj = struct(self.mem, addr)
432-
access = _StructAccessCompat(struct, struct_obj)
433357
if label and self.label_mgr:
434358
label_obj = LabelStruct(label, addr, struct)
435359
self.label_mgr.add_label(label_obj)
436360
else:
437361
label_obj = None
438-
mem = Memory(addr, size, label_obj, access, struct_obj)
362+
mem = Memory(addr, size, label_obj, struct_obj)
439363
log_mem_alloc.info("map struct: %s", mem)
440364
return mem
441365

@@ -462,8 +386,7 @@ def alloc_lib(self, lib_struct, pos_size=0, neg_size=0, fd=None, label=None):
462386
else:
463387
label_obj = None
464388
struct_obj = lib_struct(self.mem, base_addr)
465-
access = _StructAccessCompat(lib_struct, struct_obj)
466-
mem = Memory(addr, size, label_obj, access, struct_obj)
389+
mem = Memory(addr, size, label_obj, struct_obj)
467390
log_mem_alloc.info("alloc lib: %s", mem)
468391
self.mem_objs[addr] = mem
469392
return mem
@@ -485,7 +408,7 @@ def alloc_cstr(self, cstr, label=None):
485408
else:
486409
label_obj = None
487410
self.mem.w_cstr(addr, cstr)
488-
mem = Memory(addr, size, label_obj, self.mem)
411+
mem = Memory(addr, size, label_obj)
489412
log_mem_alloc.info("alloc c_str: %s", mem)
490413
self.mem_objs[addr] = mem
491414
return mem
@@ -507,7 +430,7 @@ def alloc_bstr(self, bstr, label=None):
507430
else:
508431
label_obj = None
509432
self.mem.w_bstr(addr, bstr)
510-
mem = Memory(addr, size, label_obj, self.mem)
433+
mem = Memory(addr, size, label_obj)
511434
log_mem_alloc.info("alloc b_str: %s", mem)
512435
self.mem_objs[addr] = mem
513436
return mem

test/unit/mem_alloc.py

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,22 +22,20 @@ def mem_alloc_nonbase4_test():
2222
assert alloc.is_all_free()
2323

2424

25-
def mem_alloc_struct_access_compat_test():
25+
def mem_alloc_struct_binding_test():
2626
mem = MockMemory()
2727
alloc = MemoryAlloc(mem)
2828
cli = alloc.alloc_struct(CLIStruct, label="CLI")
2929

3030
assert isinstance(cli.struct, CLIStruct)
31-
assert cli.access.struct is cli.struct
31+
assert not hasattr(cli, "access")
3232

33-
cli.access.w_s("cli_DefaultStack", 42)
34-
cli.access.w_s("cli_CurrentInput", 0x120)
33+
cli.struct.cli_DefaultStack.val = 42
34+
cli.struct.cli_CurrentInput.aptr = 0x120
3535

36-
assert cli.access.r_s("cli_DefaultStack") == 42
37-
assert cli.access.r_s("cli_CurrentInput") == 0x120
3836
assert cli.struct.cli_DefaultStack.val == 42
3937
assert cli.struct.cli_CurrentInput.aptr == 0x120
40-
assert mem.r32(cli.access.s_get_addr("cli_CurrentInput")) == 0x120 >> 2
38+
assert mem.r32(cli.struct.cli_CurrentInput.addr) == 0x120 >> 2
4139

4240

4341
def mem_alloc_lib_struct_addr_test():
@@ -46,7 +44,8 @@ def mem_alloc_lib_struct_addr_test():
4644
lib = alloc.alloc_lib(LibraryStruct, neg_size=32, label="Library")
4745

4846
assert isinstance(lib.struct, LibraryStruct)
47+
assert not hasattr(lib, "access")
4948
assert lib.struct.addr == lib.addr + 32
5049

51-
lib.access.w_s("lib_Node.ln_Type", NodeType.NT_LIBRARY)
50+
lib.struct.lib_Node.ln_Type.val = NodeType.NT_LIBRARY
5251
assert lib.struct.lib_Node.ln_Type.val == NodeType.NT_LIBRARY

0 commit comments

Comments
 (0)