From bb05e112ec01c2a3b6ba17e5daca5dba1285e30c Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Thu, 1 Oct 2026 18:00:57 +0800 Subject: [PATCH] =?UTF-8?q?refactor(=5Flist):=20=E5=85=83=E7=B4=A0?= =?UTF-8?q?=E5=9C=B0=E5=9D=80=E8=BF=90=E7=AE=97=E5=8E=BB=E6=8E=89=20uint64?= =?UTF-8?q?=20=E5=BE=80=E8=BF=94=EF=BC=8C=E6=94=B9=E7=94=A8=20i8*=20?= =?UTF-8?q?=E6=8C=87=E9=92=88=E5=8A=A0=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit rawptr 即 i8*,指针加法按 pointee(1 字节) 缩放,与 uint64(ptr)+n 再强转回指针逐字等价。 元素步长仍显式由 __elem_size__ 给出,故不能改成下标访问(list[int](pool,8) / list[str](tp,64) 依赖显式步长)。 承接 0f92426 中遗留的裸指针 uint64 手动计算待重新处理。 --- _list.vp | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/_list.vp b/_list.vp index ff5e35d..6aae831 100644 --- a/_list.vp +++ b/_list.vp @@ -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]