refactor(_list): 元素地址运算去掉 uint64 往返,改用 i8* 指针加法

rawptr 即 i8*,指针加法按 pointee(1 字节) 缩放,与 uint64(ptr)+n 再强转回指针逐字等价。
元素步长仍显式由 __elem_size__ 给出,故不能改成下标访问(list[int](pool,8) / list[str](tp,64) 依赖显式步长)。
承接 0f92426 中遗留的裸指针 uint64 手动计算待重新处理。
This commit is contained in:
TermiNexus committed 2026-10-01 18:00:57 +08:00
1 parent 3c29b9bd13
commit bb05e112ec
1 file changed
+15 -7
+15 -7
View File
@@ -50,29 +50,37 @@ class list[T]:
string.memcpy(new_data, self.__data__, self.__count__ * self.__elem_size__)
self.__data__ = new_data
self.__capacity__ = new_cap
elem_ptr: T* = T*(uint64(self.__data__) + self.__count__ * self.__elem_size__)
# 元素地址:`T*(self.__data__ + i * elem_size)`。
# · rawptr 就是 i8*,i8* 上的 `+` 按 **1 字节**缩放(ExprGenOps 的指针算术分流
# → ExprGenBase.translate_ptr_arith 按 pointee 大小缩放)⇒ 与原先
# `uint64(ptr) + n` 再强转回指针**逐字等价**,故去掉整数往返。
# · 步长仍由 __elem_size__ **显式**给出,不能改成下标访问(`__data__[i]` 会按
# sizeof(T) 缩放):list[int](pool, 8) / list[str](pool, 64) 这类"按显式步长
# 当字节缓冲"的用法依赖它。
# 下面 get/set/__getitem__/__setitem__/pop/__next__ 同此式,不再重复注释。
elem_ptr: T* = T*(self.__data__ + self.__count__ * self.__elem_size__)
elem_ptr[0] = item
self.__count__ += 1
def get(self, index: sizet) -> T:
elem_ptr: T* = T*(uint64(self.__data__) + index * self.__elem_size__)
elem_ptr: T* = T*(self.__data__ + index * self.__elem_size__)
return elem_ptr[0]
def __getitem__(self, index: sizet) -> T:
elem_ptr: T* = T*(uint64(self.__data__) + index * self.__elem_size__)
elem_ptr: T* = T*(self.__data__ + index * self.__elem_size__)
return elem_ptr[0]
def set(self, index: sizet, value: T):
elem_ptr: T* = T*(uint64(self.__data__) + index * self.__elem_size__)
elem_ptr: T* = T*(self.__data__ + index * self.__elem_size__)
elem_ptr[0] = value
def __setitem__(self, index: sizet, value: T):
elem_ptr: T* = T*(uint64(self.__data__) + index * self.__elem_size__)
elem_ptr: T* = T*(self.__data__ + index * self.__elem_size__)
elem_ptr[0] = value
def pop(self) -> T:
self.__count__ -= 1
elem_ptr: T* = T*(uint64(self.__data__) + self.__count__ * self.__elem_size__)
elem_ptr: T* = T*(self.__data__ + self.__count__ * self.__elem_size__)
return elem_ptr[0]
def clear(self):
@@ -87,5 +95,5 @@ class list[T]:
raise StopIteration
idx: sizet = self.__iter_index__
self.__iter_index__ = idx + 1
elem_ptr: T* = T*(uint64(self.__data__) + idx * self.__elem_size__)
elem_ptr: T* = T*(self.__data__ + idx * self.__elem_size__)
return elem_ptr[0]