Files
TransPyC/includes/ast/astaux.py
2026-07-18 19:25:40 +08:00

338 lines
11 KiB
Python

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 节点
# ============================================================
class ExceptHandler(AST):
"""ExceptHandler(type: AST, name: str)"""
type: AST | t.CPtr
name: str
def __new__(self, pool: memhub.MemManager | t.CPtr,
type: AST | t.CPtr, name: str):
ptr: ExceptHandler | t.CPtr = pool.alloc(ExceptHandler.__sizeof__())
if ptr:
string.memset(ptr, 0, ExceptHandler.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr,
type: AST | t.CPtr, name: str):
_init_ast(self, pool, 0, 0)
self.type = type
self.name = _copy_str(pool, name)
def kind(self) -> t.CInt:
return ASTKind.ExceptHandler
def type_name(self) -> str:
return "ExceptHandler"
def dump(self, buf: bytes, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
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 节点
# ============================================================
class Arguments(AST):
"""Arguments(args: list[AST | CPtr], vararg: AST, kwarg: AST,
defaults: list[AST | CPtr], kw_defaults: list[AST | CPtr])"""
args: list[AST | t.CPtr] | t.CPtr
vararg: AST | t.CPtr
kwarg: AST | t.CPtr
defaults: list[AST | t.CPtr] | t.CPtr
kw_defaults: list[AST | t.CPtr] | t.CPtr
def __new__(self, pool: memhub.MemManager | t.CPtr,
args: list[AST | t.CPtr] | t.CPtr,
vararg: AST | t.CPtr, kwarg: AST | t.CPtr,
defaults: list[AST | t.CPtr] | t.CPtr,
kw_defaults: list[AST | t.CPtr] | t.CPtr):
ptr: Arguments | t.CPtr = pool.alloc(Arguments.__sizeof__())
if ptr:
string.memset(ptr, 0, Arguments.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr,
args: list[AST | t.CPtr] | t.CPtr,
vararg: AST | t.CPtr, kwarg: AST | t.CPtr,
defaults: list[AST | t.CPtr] | t.CPtr,
kw_defaults: list[AST | t.CPtr] | t.CPtr):
_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) -> t.CInt:
return ASTKind.Arguments
def type_name(self) -> str:
return "Arguments"
def dump(self, buf: bytes, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
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 节点
# ============================================================
class Arg(AST):
"""Arg(arg: str, annotation: AST)"""
arg: str
annotation: AST | t.CPtr
def __new__(self, pool: memhub.MemManager | t.CPtr,
arg: str, annotation: AST | t.CPtr):
ptr: Arg | t.CPtr = pool.alloc(Arg.__sizeof__())
if ptr:
string.memset(ptr, 0, Arg.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr,
arg: str, annotation: AST | t.CPtr):
_init_ast(self, pool, 0, 0)
self.arg = _copy_str(pool, arg)
self.annotation = annotation
def kind(self) -> t.CInt:
return ASTKind.Arg
def type_name(self) -> str:
return "Arg"
def dump(self, buf: bytes, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
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 节点
# ============================================================
class Keyword(AST):
"""Keyword(arg: str, value: AST)"""
arg: str
value: AST | t.CPtr
def __new__(self, pool: memhub.MemManager | t.CPtr,
arg: str, value: AST | t.CPtr):
ptr: Keyword | t.CPtr = pool.alloc(Keyword.__sizeof__())
if ptr:
string.memset(ptr, 0, Keyword.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr,
arg: str, value: AST | t.CPtr):
_init_ast(self, pool, 0, 0)
self.arg = _copy_str(pool, arg)
self.value = value
def kind(self) -> t.CInt:
return ASTKind.Keyword
def type_name(self) -> str:
return "Keyword"
def dump(self, buf: bytes, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
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 节点
# ============================================================
class Alias(AST):
"""Alias(name: str, asname: str)"""
name: str
asname: str
def __new__(self, pool: memhub.MemManager | t.CPtr,
name: str, asname: str):
ptr: Alias | t.CPtr = pool.alloc(Alias.__sizeof__())
if ptr:
string.memset(ptr, 0, Alias.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr,
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) -> t.CInt:
return ASTKind.Alias
def type_name(self) -> str:
return "Alias"
def dump(self, buf: bytes, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
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 节点
# ============================================================
class WithItem(AST):
"""WithItem(context_expr: AST, optional_vars: AST)"""
context_expr: AST | t.CPtr
optional_vars: AST | t.CPtr
def __new__(self, pool: memhub.MemManager | t.CPtr,
context_expr: AST | t.CPtr, optional_vars: AST | t.CPtr):
ptr: WithItem | t.CPtr = pool.alloc(WithItem.__sizeof__())
if ptr:
string.memset(ptr, 0, WithItem.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr,
context_expr: AST | t.CPtr, optional_vars: AST | t.CPtr):
_init_ast(self, pool, 0, 0)
self.context_expr = context_expr
self.optional_vars = optional_vars
def kind(self) -> t.CInt:
return ASTKind.WithItem
def type_name(self) -> str:
return "WithItem"
def dump(self, buf: bytes, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
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 节点
# ============================================================
class Comprehension(AST):
"""Comprehension(target: AST, iter: AST, ifs: list[AST | CPtr], is_async: CInt)"""
target: AST | t.CPtr
iter: AST | t.CPtr
ifs: list[AST | t.CPtr] | t.CPtr
is_async: t.CInt
def __new__(self, pool: memhub.MemManager | t.CPtr,
target: AST | t.CPtr, iter: AST | t.CPtr,
ifs: list[AST | t.CPtr] | t.CPtr, is_async: t.CInt):
ptr: Comprehension | t.CPtr = pool.alloc(Comprehension.__sizeof__())
if ptr:
string.memset(ptr, 0, Comprehension.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr,
target: AST | t.CPtr, iter: AST | t.CPtr,
ifs: list[AST | t.CPtr] | t.CPtr, is_async: t.CInt):
_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) -> t.CInt:
return ASTKind.Comprehension
def type_name(self) -> str:
return "Comprehension"
def dump(self, buf: bytes, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
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, t.CInt64T(self.is_async))
pos = _emit(buf, size, pos, ")")
return pos