R14:rawptr[X] -> X*(41 文件 / 2037 行改动),X 含模块限定名与嵌套下标(rawptr[GSList[NameEntry]] -> GSList[NameEntry]*)。保留 6 处 rawptr[t.CPtr](规范例外:存纯裸指针);# 注释与字符串里的 rawptr[...] 属元语法描述,未动。 R16(保守子集):t.CConst | str/bytes -> const str/bytes,t.CConst | char | t.CPtr -> const str;typedef 右值位置豁免(const str 在该处无法注册,与 R1 同源)。 验证:TPC 自举三重重编 SUCCESS;TransPyV.exe 全量 77/77 顺序回归通过。
314 lines
11 KiB
Plaintext
314 lines
11 KiB
Plaintext
import t, c
|
|
from stdint import *
|
|
import memhub
|
|
import string
|
|
from .base import (
|
|
AST, ASTKind,
|
|
_init_ast, _copy_str, _set_parent_list,
|
|
_emit, _emit_str, _emit_int, _dump_list,
|
|
)
|
|
|
|
|
|
# ============================================================
|
|
# ExceptHandler Node
|
|
# ============================================================
|
|
class ExceptHandler(AST):
|
|
"""ExceptHandler(type: AST, name: str)"""
|
|
type: AST*
|
|
name: str
|
|
|
|
def __new__(self, pool: memhub.MemManager*, type: AST*, name: str):
|
|
ptr: ExceptHandler* = pool.alloc(ExceptHandler.__sizeof__())
|
|
if ptr: string.memset(ptr, 0, ExceptHandler.__sizeof__())
|
|
return ptr
|
|
|
|
def __init__(self, pool: memhub.MemManager*, type: AST*, name: str):
|
|
_init_ast(self, pool, 0, 0)
|
|
self.type = type
|
|
self.name = _copy_str(pool, name)
|
|
|
|
def kind(self) -> int:
|
|
return ASTKind.ExceptHandler
|
|
|
|
def type_name(self) -> str:
|
|
return "ExceptHandler"
|
|
|
|
def dump(self, buf: bytes, size: sizet, pos: sizet) -> sizet:
|
|
pos = _emit(buf, size, pos, "ExceptHandler(type=")
|
|
if self.type is not None:
|
|
pos = self.type.dump(buf, size, pos)
|
|
else:
|
|
pos = _emit(buf, size, pos, "None")
|
|
pos = _emit(buf, size, pos, ", name='")
|
|
pos = _emit_str(buf, size, pos, self.name)
|
|
pos = _emit(buf, size, pos, "', body=")
|
|
pos = _dump_list(self.children, buf, size, pos)
|
|
pos = _emit(buf, size, pos, ")")
|
|
return pos
|
|
|
|
|
|
# ============================================================
|
|
# Arguments Node
|
|
# ============================================================
|
|
class Arguments(AST):
|
|
"""Arguments(args: list[AST | CPtr], vararg: AST, kwarg: AST,
|
|
defaults: list[AST | CPtr], kw_defaults: list[AST | CPtr])"""
|
|
args: list[AST*]*
|
|
vararg: AST*
|
|
kwarg: AST*
|
|
defaults: list[AST*]*
|
|
kw_defaults: list[AST*]*
|
|
|
|
def __new__(self, pool: memhub.MemManager*,
|
|
args: list[AST*]*,
|
|
vararg: AST*, kwarg: AST*,
|
|
defaults: list[AST*]*,
|
|
kw_defaults: list[AST*]*):
|
|
ptr: Arguments* = pool.alloc(Arguments.__sizeof__())
|
|
if ptr: string.memset(ptr, 0, Arguments.__sizeof__())
|
|
return ptr
|
|
|
|
def __init__(self, pool: memhub.MemManager*,
|
|
args: list[AST*]*,
|
|
vararg: AST*, kwarg: AST*,
|
|
defaults: list[AST*]*,
|
|
kw_defaults: list[AST*]*):
|
|
_init_ast(self, pool, 0, 0)
|
|
self.args = args
|
|
self.vararg = vararg
|
|
self.kwarg = kwarg
|
|
self.defaults = defaults
|
|
self.kw_defaults = kw_defaults
|
|
_set_parent_list(args, self)
|
|
_set_parent_list(defaults, self)
|
|
_set_parent_list(kw_defaults, self)
|
|
|
|
def kind(self) -> int:
|
|
return ASTKind.Arguments
|
|
|
|
def type_name(self) -> str:
|
|
return "Arguments"
|
|
|
|
def dump(self, buf: bytes, size: sizet,
|
|
pos: sizet) -> sizet:
|
|
pos = _emit(buf, size, pos, "Arguments(args=")
|
|
pos = _dump_list(self.args, buf, size, pos)
|
|
pos = _emit(buf, size, pos, ", vararg=")
|
|
if self.vararg is not None:
|
|
pos = self.vararg.dump(buf, size, pos)
|
|
else:
|
|
pos = _emit(buf, size, pos, "None")
|
|
pos = _emit(buf, size, pos, ", kwarg=")
|
|
if self.kwarg is not None:
|
|
pos = self.kwarg.dump(buf, size, pos)
|
|
else:
|
|
pos = _emit(buf, size, pos, "None")
|
|
pos = _emit(buf, size, pos, ", defaults=")
|
|
pos = _dump_list(self.defaults, buf, size, pos)
|
|
pos = _emit(buf, size, pos, ", kw_defaults=")
|
|
pos = _dump_list(self.kw_defaults, buf, size, pos)
|
|
pos = _emit(buf, size, pos, ")")
|
|
return pos
|
|
|
|
|
|
# ============================================================
|
|
# Arg Node
|
|
# ============================================================
|
|
class Arg(AST):
|
|
"""Arg(arg: str, annotation: AST)"""
|
|
arg: str
|
|
annotation: AST*
|
|
|
|
def __new__(self, pool: memhub.MemManager*, arg: str, annotation: AST*):
|
|
ptr: Arg* = pool.alloc(Arg.__sizeof__())
|
|
if ptr: string.memset(ptr, 0, Arg.__sizeof__())
|
|
return ptr
|
|
|
|
def __init__(self, pool: memhub.MemManager*, arg: str, annotation: AST*):
|
|
_init_ast(self, pool, 0, 0)
|
|
self.arg = _copy_str(pool, arg)
|
|
self.annotation = annotation
|
|
|
|
def kind(self) -> int:
|
|
return ASTKind.Arg
|
|
|
|
def type_name(self) -> str:
|
|
return "Arg"
|
|
|
|
def dump(self, buf: bytes, size: sizet, pos: sizet) -> sizet:
|
|
pos = _emit(buf, size, pos, "Arg(arg='")
|
|
pos = _emit_str(buf, size, pos, self.arg)
|
|
pos = _emit(buf, size, pos, "', annotation=")
|
|
if self.annotation is not None:
|
|
pos = self.annotation.dump(buf, size, pos)
|
|
else:
|
|
pos = _emit(buf, size, pos, "None")
|
|
pos = _emit(buf, size, pos, ")")
|
|
return pos
|
|
|
|
|
|
# ============================================================
|
|
# Keyword Node
|
|
# ============================================================
|
|
class Keyword(AST):
|
|
"""Keyword(arg: str, value: AST)"""
|
|
arg: str
|
|
value: AST*
|
|
|
|
def __new__(self, pool: memhub.MemManager*, arg: str, value: AST*):
|
|
ptr: Keyword* = pool.alloc(Keyword.__sizeof__())
|
|
if ptr: string.memset(ptr, 0, Keyword.__sizeof__())
|
|
return ptr
|
|
|
|
def __init__(self, pool: memhub.MemManager*, arg: str, value: AST*):
|
|
_init_ast(self, pool, 0, 0)
|
|
self.arg = _copy_str(pool, arg)
|
|
self.value = value
|
|
|
|
def kind(self) -> int:
|
|
return ASTKind.Keyword
|
|
|
|
def type_name(self) -> str:
|
|
return "Keyword"
|
|
|
|
def dump(self, buf: bytes, size: sizet, pos: sizet) -> sizet:
|
|
pos = _emit(buf, size, pos, "Keyword(arg='")
|
|
pos = _emit_str(buf, size, pos, self.arg)
|
|
pos = _emit(buf, size, pos, "', value=")
|
|
if self.value is not None:
|
|
pos = self.value.dump(buf, size, pos)
|
|
else:
|
|
pos = _emit(buf, size, pos, "None")
|
|
pos = _emit(buf, size, pos, ")")
|
|
return pos
|
|
|
|
|
|
# ============================================================
|
|
# Alias Node
|
|
# ============================================================
|
|
class Alias(AST):
|
|
"""Alias(name: str, asname: str)"""
|
|
name: str
|
|
asname: str
|
|
|
|
def __new__(self, pool: memhub.MemManager*, name: str, asname: str):
|
|
ptr: Alias* = pool.alloc(Alias.__sizeof__())
|
|
if ptr: string.memset(ptr, 0, Alias.__sizeof__())
|
|
return ptr
|
|
|
|
def __init__(self, pool: memhub.MemManager*,
|
|
name: str, asname: str):
|
|
_init_ast(self, pool, 0, 0)
|
|
self.name = _copy_str(pool, name)
|
|
self.asname = _copy_str(pool, asname)
|
|
|
|
def kind(self) -> int:
|
|
return ASTKind.Alias
|
|
|
|
def type_name(self) -> str:
|
|
return "Alias"
|
|
|
|
def dump(self, buf: bytes, size: sizet, pos: sizet) -> sizet:
|
|
pos = _emit(buf, size, pos, "Alias(name='")
|
|
pos = _emit_str(buf, size, pos, self.name)
|
|
pos = _emit(buf, size, pos, "', asname='")
|
|
pos = _emit_str(buf, size, pos, self.asname)
|
|
pos = _emit(buf, size, pos, "')")
|
|
return pos
|
|
|
|
|
|
# ============================================================
|
|
# WithItem Node
|
|
# ============================================================
|
|
|
|
class WithItem(AST):
|
|
"""WithItem(context_expr: AST, optional_vars: AST)"""
|
|
context_expr: AST*
|
|
optional_vars: AST*
|
|
|
|
def __new__(self, pool: memhub.MemManager*, context_expr: AST*, optional_vars: AST*):
|
|
ptr: WithItem* = pool.alloc(WithItem.__sizeof__())
|
|
if ptr: string.memset(ptr, 0, WithItem.__sizeof__())
|
|
return ptr
|
|
|
|
def __init__(self, pool: memhub.MemManager*,
|
|
context_expr: AST*, optional_vars: AST*):
|
|
_init_ast(self, pool, 0, 0)
|
|
self.context_expr = context_expr
|
|
self.optional_vars = optional_vars
|
|
|
|
def kind(self) -> int:
|
|
return ASTKind.WithItem
|
|
|
|
def type_name(self) -> str:
|
|
return "WithItem"
|
|
|
|
def dump(self, buf: bytes, size: sizet, pos: sizet) -> sizet:
|
|
pos = _emit(buf, size, pos, "WithItem(context_expr=")
|
|
if self.context_expr is not None:
|
|
pos = self.context_expr.dump(buf, size, pos)
|
|
else:
|
|
pos = _emit(buf, size, pos, "None")
|
|
pos = _emit(buf, size, pos, ", optional_vars=")
|
|
if self.optional_vars is not None:
|
|
pos = self.optional_vars.dump(buf, size, pos)
|
|
else:
|
|
pos = _emit(buf, size, pos, "None")
|
|
pos = _emit(buf, size, pos, ")")
|
|
return pos
|
|
|
|
|
|
# ============================================================
|
|
# Comprehension Node
|
|
# ============================================================
|
|
|
|
class Comprehension(AST):
|
|
"""Comprehension(target: AST, iter: AST, ifs: list[AST | CPtr], is_async: CInt)"""
|
|
target: AST*
|
|
iter: AST*
|
|
ifs: list[AST*]*
|
|
is_async: int
|
|
|
|
def __new__(self, pool: memhub.MemManager*,
|
|
target: AST*, iter: AST*,
|
|
ifs: list[AST*]*, is_async: int):
|
|
ptr: Comprehension* = pool.alloc(Comprehension.__sizeof__())
|
|
if ptr:
|
|
string.memset(ptr, 0, Comprehension.__sizeof__())
|
|
return ptr
|
|
|
|
def __init__(self, pool: memhub.MemManager*,
|
|
target: AST*, iter: AST*,
|
|
ifs: list[AST*]*, is_async: int):
|
|
_init_ast(self, pool, 0, 0)
|
|
self.target = target
|
|
self.iter = iter
|
|
self.ifs = ifs
|
|
self.is_async = is_async
|
|
_set_parent_list(ifs, self)
|
|
|
|
def kind(self) -> int:
|
|
return ASTKind.Comprehension
|
|
|
|
def type_name(self) -> str:
|
|
return "Comprehension"
|
|
|
|
def dump(self, buf: bytes, size: sizet,
|
|
pos: sizet) -> sizet:
|
|
pos = _emit(buf, size, pos, "Comprehension(target=")
|
|
if self.target is not None:
|
|
pos = self.target.dump(buf, size, pos)
|
|
else:
|
|
pos = _emit(buf, size, pos, "None")
|
|
pos = _emit(buf, size, pos, ", iter=")
|
|
if self.iter is not None:
|
|
pos = self.iter.dump(buf, size, pos)
|
|
else:
|
|
pos = _emit(buf, size, pos, "None")
|
|
pos = _emit(buf, size, pos, ", ifs=")
|
|
pos = _dump_list(self.ifs, buf, size, pos)
|
|
pos = _emit(buf, size, pos, ", is_async=")
|
|
pos = _emit_int(buf, size, pos, int64(self.is_async))
|
|
pos = _emit(buf, size, pos, ")")
|
|
return pos
|