- 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)
73 lines
1.8 KiB
Plaintext
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)
|