Files
ViperC/App/lib/lsp/LspPools.vp
T
TermiNexus c42ae889d1 feat(lsp): Gate 1 文档同步、UTF-16 位置与工作区
- LspPositions:UTF-8 字节列 / UTF-16 code unit 转换,支持 LF/CRLF/emoji
- LspDocuments:didOpen/didChange/didClose/didSave,增量与全量替换,双池复用
- LspWorkspace:file URI 解码、project.vpj 向上查找、source_dir/includes
- LspServer:请求池 mark/reset、textDocumentSync、viper/lspStats 与 viper/lspDocument
- probe --gate1:文档编辑、UTF-16 代理对、10k 次编辑与池稳定性
- 依赖 includes/memhub 的 NewMemBuddy 堆构造工厂(单独提交 fa7591e)
2026-10-26 14:23:12 +08:00

73 lines
1.8 KiB
Plaintext

from stdint import *
import stdlib
import string
import memhub
class LspPool:
owner: memhub.MemManager*
arena: bytes
mb: memhub.MemBuddy*
size: sizet
def __new__(self, owner: memhub.MemManager*, size: sizet) -> rawptr:
p: LspPool* = (LspPool*)(owner.alloc(LspPool.__sizeof__()))
if p:
string.memset(p, 0, LspPool.__sizeof__())
return rawptr(p)
def __init__(self, owner: memhub.MemManager*, size: sizet):
self.owner = owner
self.size = size
self.arena = stdlib.malloc(size)
self.mb = None
if self.arena is not None:
self.mb = memhub.NewMemBuddy(self.arena, size, 0, 0)
def IsValid(self) -> bool:
return self.mb is not None
def Reset(self) -> int:
if self.mb is None:
return -1
return self.mb.reset()
def Destroy(self) -> int:
if self.arena is not None:
stdlib.free(self.arena)
if self.mb is not None:
stdlib.free(self.mb)
self.arena = None
self.mb = None
return 0
def UsedBytes(self) -> sizet:
if self.mb is None:
return 0
return self.mb.used_bytes()
def FreeBytes(self) -> sizet:
if self.mb is None:
return 0
return self.mb.free_bytes()
def Create(owner: memhub.MemManager*, size: sizet) -> LspPool*:
p: LspPool* = LspPool(owner, size)
if p is None or not p.IsValid():
if p is not None:
p.Destroy()
return None
return p
def DupStr(pool: memhub.MemManager*, s: str) -> str:
if s is None:
return None
n: sizet = string.strlen(s)
buf: bytes = pool.alloc(n + 1)
if buf is None:
return None
string.memcpy(buf, s, n + 1)
return str(buf)