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

1151 lines
37 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import t, c
from stdint import *
import memhub
import string
from .base import (
AST, ASTKind, ASTCtx, OpKind,
_init_ast, _copy_str, _set_parent_list,
_emit, _emit_str, _emit_int, _dump_list,
FLAG_IS_ASYNC,
)
# ============================================================
# Module 节点
# ============================================================
@t.CVTable
class Module(AST):
"""Module(children: list[AST | t.CPtr])"""
def __new__(self, pool: memhub.MemManager | t.CPtr):
ptr: Module | t.CPtr = pool.alloc(Module.__sizeof__())
if ptr:
string.memset(ptr, 0, Module.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr):
_init_ast(self, pool, 0, 0)
def kind(self) -> t.CInt:
return ASTKind.Module
def type_name(self) -> str:
return "Module"
def dump(self, buf: t.CChar | t.CPtr, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
pos = _emit(buf, size, pos, "Module(body=")
pos = _dump_list(self.children, buf, size, pos)
pos = _emit(buf, size, pos, ")")
return pos
# ============================================================
# Assign 节点
# ============================================================
class Assign(AST):
"""Assign(targets: list[AST | t.CPtr], value: AST)"""
targets: list[AST | t.CPtr] | t.CPtr
value: AST | t.CPtr
def __new__(self, pool: memhub.MemManager | t.CPtr,
targets: list[AST | t.CPtr] | t.CPtr, value: AST | t.CPtr):
ptr: Assign | t.CPtr = pool.alloc(Assign.__sizeof__())
if ptr:
string.memset(ptr, 0, Assign.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr,
targets: list[AST | t.CPtr] | t.CPtr, value: AST | t.CPtr):
_init_ast(self, pool, 0, 0)
self.targets = targets
self.value = value
_set_parent_list(targets, self)
def kind(self) -> t.CInt:
return ASTKind.Assign
def type_name(self) -> str:
return "Assign"
def dump(self, buf: t.CChar | t.CPtr, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
pos = _emit(buf, size, pos, "Assign(targets=")
pos = _dump_list(self.targets, buf, size, pos)
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
# ============================================================
# If 节点
# ============================================================
class If(AST):
"""If(test: AST, orelse: list[AST | t.CPtr])"""
test: AST | t.CPtr
orelse: list[AST | t.CPtr] | t.CPtr
def __new__(self, pool: memhub.MemManager | t.CPtr,
test: AST | t.CPtr,
orelse: list[AST | t.CPtr] | t.CPtr):
ptr: If | t.CPtr = pool.alloc(If.__sizeof__())
if ptr:
string.memset(ptr, 0, If.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr,
test: AST | t.CPtr,
orelse: list[AST | t.CPtr] | t.CPtr):
_init_ast(self, pool, 0, 0)
self.test = test
self.orelse = orelse
_set_parent_list(orelse, self)
def kind(self) -> t.CInt:
return ASTKind.If
def type_name(self) -> str:
return "If"
def dump(self, buf: t.CChar | t.CPtr, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
pos = _emit(buf, size, pos, "If(test=")
if self.test is not None:
pos = self.test.dump(buf, size, pos)
else:
pos = _emit(buf, size, pos, "None")
pos = _emit(buf, size, pos, ", body=")
pos = _dump_list(self.children, buf, size, pos)
pos = _emit(buf, size, pos, ", orelse=")
pos = _dump_list(self.orelse, buf, size, pos)
pos = _emit(buf, size, pos, ")")
return pos
# ============================================================
# For 节点
# ============================================================
class For(AST):
"""For(target: AST, iter: AST, orelse: list[AST | t.CPtr], is_async: CInt)"""
target: AST | t.CPtr
iter: AST | t.CPtr
orelse: list[AST | t.CPtr] | t.CPtr
flags: t.CInt
def __new__(self, pool: memhub.MemManager | t.CPtr,
target: AST | t.CPtr, iter: AST | t.CPtr,
orelse: list[AST | t.CPtr] | t.CPtr,
is_async: t.CInt):
ptr: For | t.CPtr = pool.alloc(For.__sizeof__())
if ptr:
string.memset(ptr, 0, For.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr,
target: AST | t.CPtr, iter: AST | t.CPtr,
orelse: list[AST | t.CPtr] | t.CPtr,
is_async: t.CInt):
_init_ast(self, pool, 0, 0)
self.target = target
self.iter = iter
self.orelse = orelse
if is_async:
self.flags = FLAG_IS_ASYNC
else:
self.flags = 0
_set_parent_list(orelse, self)
def kind(self) -> t.CInt:
return ASTKind.For
def type_name(self) -> str:
return "For"
def dump(self, buf: t.CChar | t.CPtr, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
pos = _emit(buf, size, pos, "For(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, ", body=")
pos = _dump_list(self.children, buf, size, pos)
pos = _emit(buf, size, pos, ")")
return pos
# ============================================================
# While 节点
# ============================================================
class While(AST):
"""While(test: AST, orelse: list[AST | t.CPtr])"""
test: AST | t.CPtr
orelse: list[AST | t.CPtr] | t.CPtr
def __new__(self, pool: memhub.MemManager | t.CPtr,
test: AST | t.CPtr,
orelse: list[AST | t.CPtr] | t.CPtr):
ptr: While | t.CPtr = pool.alloc(While.__sizeof__())
if ptr:
string.memset(ptr, 0, While.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr,
test: AST | t.CPtr,
orelse: list[AST | t.CPtr] | t.CPtr):
_init_ast(self, pool, 0, 0)
self.test = test
self.orelse = orelse
_set_parent_list(orelse, self)
def kind(self) -> t.CInt:
return ASTKind.While
def type_name(self) -> str:
return "While"
def dump(self, buf: t.CChar | t.CPtr, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
pos = _emit(buf, size, pos, "While(test=")
if self.test is not None:
pos = self.test.dump(buf, size, pos)
else:
pos = _emit(buf, size, pos, "None")
pos = _emit(buf, size, pos, ", body=")
pos = _dump_list(self.children, buf, size, pos)
pos = _emit(buf, size, pos, ")")
return pos
# ============================================================
# Return 节点
# ============================================================
class Return(AST):
"""Return(value: AST | None)"""
value: AST | t.CPtr
def __new__(self, pool: memhub.MemManager | t.CPtr, value: AST | t.CPtr):
ptr: Return | t.CPtr = pool.alloc(Return.__sizeof__())
if ptr:
string.memset(ptr, 0, Return.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr, value: AST | t.CPtr):
_init_ast(self, pool, 0, 0)
self.value = value
def kind(self) -> t.CInt:
return ASTKind.Return
def type_name(self) -> str:
return "Return"
def dump(self, buf: t.CChar | t.CPtr, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
pos = _emit(buf, size, pos, "Return(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
# ============================================================
# Expr 节点(表达式语句)
# ============================================================
class Expr(AST):
"""Expr(value: AST)"""
value: AST | t.CPtr
def __new__(self, pool: memhub.MemManager | t.CPtr, value: AST | t.CPtr):
ptr: Expr | t.CPtr = pool.alloc(Expr.__sizeof__())
if ptr:
string.memset(ptr, 0, Expr.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr, value: AST | t.CPtr):
_init_ast(self, pool, 0, 0)
self.value = value
def kind(self) -> t.CInt:
return ASTKind.Expr
def type_name(self) -> str:
return "Expr"
def dump(self, buf: t.CChar | t.CPtr, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
pos = _emit(buf, size, pos, "Expr(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
# ============================================================
# FunctionDef 节点
# ============================================================
class FunctionDef(AST):
"""FunctionDef(name: str, args: AST,
decorator_list: list[AST | t.CPtr], returns: AST, flags: CInt)"""
name: str
args: AST | t.CPtr
decorator_list: list[AST | t.CPtr] | t.CPtr
returns: AST | t.CPtr
flags: t.CInt
def __new__(self, pool: memhub.MemManager | t.CPtr,
name: str, args: AST | t.CPtr,
decorator_list: list[AST | t.CPtr] | t.CPtr,
returns: AST | t.CPtr, is_async: t.CInt):
ptr: FunctionDef | t.CPtr = pool.alloc(FunctionDef.__sizeof__())
if ptr:
string.memset(ptr, 0, FunctionDef.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr,
name: str, args: AST | t.CPtr,
decorator_list: list[AST | t.CPtr] | t.CPtr,
returns: AST | t.CPtr, is_async: t.CInt):
_init_ast(self, pool, 0, 0)
self.name = _copy_str(pool, name)
self.args = args
self.decorator_list = decorator_list
self.returns = returns
if is_async:
self.flags = FLAG_IS_ASYNC
else:
self.flags = 0
_set_parent_list(decorator_list, self)
def kind(self) -> t.CInt:
return ASTKind.FunctionDef
def type_name(self) -> str:
return "FunctionDef"
def dump(self, buf: t.CChar | t.CPtr, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
pos = _emit(buf, size, pos, "FunctionDef(name='")
pos = _emit_str(buf, size, pos, self.name)
pos = _emit(buf, size, pos, "', args=")
if self.args is not None:
pos = self.args.dump(buf, size, pos)
else:
pos = _emit(buf, size, pos, "None")
pos = _emit(buf, size, pos, ", body=")
pos = _dump_list(self.children, buf, size, pos)
pos = _emit(buf, size, pos, ", decorator_list=")
pos = _dump_list(self.decorator_list, buf, size, pos)
pos = _emit(buf, size, pos, ", returns=")
if self.returns is not None:
pos = self.returns.dump(buf, size, pos)
else:
pos = _emit(buf, size, pos, "None")
pos = _emit(buf, size, pos, ")")
return pos
# ============================================================
# Expression 节点
# ============================================================
class Expression(AST):
"""Expression(body: AST)"""
body: AST | t.CPtr
def __new__(self, pool: memhub.MemManager | t.CPtr,
body: AST | t.CPtr):
ptr: Expression | t.CPtr = pool.alloc(Expression.__sizeof__())
if ptr:
string.memset(ptr, 0, Expression.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr,
body: AST | t.CPtr):
_init_ast(self, pool, 0, 0)
self.body = body
def kind(self) -> t.CInt:
return ASTKind.Expression
def type_name(self) -> str:
return "Expression"
def dump(self, buf: t.CChar | t.CPtr, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
pos = _emit(buf, size, pos, "Expression(body=")
if self.body is not None:
pos = self.body.dump(buf, size, pos)
else:
pos = _emit(buf, size, pos, "None")
pos = _emit(buf, size, pos, ")")
return pos
# ============================================================
# Interactive 节点
# ============================================================
class Interactive(AST):
"""Interactive(body: AST)"""
body: AST | t.CPtr
def __new__(self, pool: memhub.MemManager | t.CPtr,
body: AST | t.CPtr):
ptr: Interactive | t.CPtr = pool.alloc(Interactive.__sizeof__())
if ptr:
string.memset(ptr, 0, Interactive.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr,
body: AST | t.CPtr):
_init_ast(self, pool, 0, 0)
self.body = body
def kind(self) -> t.CInt:
return ASTKind.Interactive
def type_name(self) -> str:
return "Interactive"
def dump(self, buf: t.CChar | t.CPtr, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
pos = _emit(buf, size, pos, "Interactive(body=")
if self.body is not None:
pos = self.body.dump(buf, size, pos)
else:
pos = _emit(buf, size, pos, "None")
pos = _emit(buf, size, pos, ")")
return pos
# ============================================================
# FunctionType 节点
# ============================================================
class FunctionType(AST):
"""FunctionType(argtypes: list[AST | t.CPtr], returns: AST)"""
argtypes: list[AST | t.CPtr] | t.CPtr
returns: AST | t.CPtr
def __new__(self, pool: memhub.MemManager | t.CPtr,
argtypes: list[AST | t.CPtr] | t.CPtr,
returns: AST | t.CPtr):
ptr: FunctionType | t.CPtr = pool.alloc(FunctionType.__sizeof__())
if ptr:
string.memset(ptr, 0, FunctionType.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr,
argtypes: list[AST | t.CPtr] | t.CPtr,
returns: AST | t.CPtr):
_init_ast(self, pool, 0, 0)
self.argtypes = argtypes
self.returns = returns
def kind(self) -> t.CInt:
return ASTKind.FunctionType
def type_name(self) -> str:
return "FunctionType"
def dump(self, buf: t.CChar | t.CPtr, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
pos = _emit(buf, size, pos, "FunctionType(argtypes=")
pos = _dump_list(self.argtypes, buf, size, pos)
pos = _emit(buf, size, pos, ", returns=")
if self.returns is not None:
pos = self.returns.dump(buf, size, pos)
else:
pos = _emit(buf, size, pos, "None")
pos = _emit(buf, size, pos, ")")
return pos
# ============================================================
# ClassDef 节点
# ============================================================
class ClassDef(AST):
"""ClassDef(name: str, bases: list[AST | t.CPtr], keywords: list[AST | t.CPtr],
decorator_list: list[AST | t.CPtr], type_params: list[str] | t.CPtr)
type_params: 泛型类型参数名列表PEP 695 class list[T]: 中的 [T]
None 表示非泛型类。"""
name: str
bases: list[AST | t.CPtr] | t.CPtr
keywords: list[AST | t.CPtr] | t.CPtr
decorator_list: list[AST | t.CPtr] | t.CPtr
type_params: list[str] | t.CPtr
def __new__(self, pool: memhub.MemManager | t.CPtr,
name: str,
bases: list[AST | t.CPtr] | t.CPtr,
keywords: list[AST | t.CPtr] | t.CPtr,
decorator_list: list[AST | t.CPtr] | t.CPtr,
type_params: list[str] | t.CPtr = None):
ptr: ClassDef | t.CPtr = pool.alloc(ClassDef.__sizeof__())
if ptr:
string.memset(ptr, 0, ClassDef.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr,
name: str,
bases: list[AST | t.CPtr] | t.CPtr,
keywords: list[AST | t.CPtr] | t.CPtr,
decorator_list: list[AST | t.CPtr] | t.CPtr,
type_params: list[str] | t.CPtr = None):
_init_ast(self, pool, 0, 0)
self.name = _copy_str(pool, name)
self.bases = bases
self.keywords = keywords
self.decorator_list = decorator_list
self.type_params = type_params
_set_parent_list(decorator_list, self)
def kind(self) -> t.CInt:
return ASTKind.ClassDef
def type_name(self) -> str:
return "ClassDef"
def dump(self, buf: t.CChar | t.CPtr, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
pos = _emit(buf, size, pos, "ClassDef(name='")
pos = _emit_str(buf, size, pos, self.name)
pos = _emit(buf, size, pos, "', bases=")
pos = _dump_list(self.bases, buf, size, pos)
pos = _emit(buf, size, pos, ", keywords=")
pos = _dump_list(self.keywords, buf, size, pos)
pos = _emit(buf, size, pos, ", body=")
pos = _dump_list(self.children, buf, size, pos)
pos = _emit(buf, size, pos, ", decorator_list=")
pos = _dump_list(self.decorator_list, buf, size, pos)
pos = _emit(buf, size, pos, ")")
return pos
# ============================================================
# Delete 节点
# ============================================================
class Delete(AST):
"""Delete(targets: list[AST | t.CPtr])"""
targets: list[AST | t.CPtr] | t.CPtr
def __new__(self, pool: memhub.MemManager | t.CPtr,
targets: list[AST | t.CPtr] | t.CPtr):
ptr: Delete | t.CPtr = pool.alloc(Delete.__sizeof__())
if ptr:
string.memset(ptr, 0, Delete.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr,
targets: list[AST | t.CPtr] | t.CPtr):
_init_ast(self, pool, 0, 0)
self.targets = targets
_set_parent_list(targets, self)
def kind(self) -> t.CInt:
return ASTKind.Delete
def type_name(self) -> str:
return "Delete"
def dump(self, buf: t.CChar | t.CPtr, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
pos = _emit(buf, size, pos, "Delete(targets=")
pos = _dump_list(self.targets, buf, size, pos)
pos = _emit(buf, size, pos, ")")
return pos
# ============================================================
# AugAssign 节点
# ============================================================
class AugAssign(AST):
"""AugAssign(target: AST, op: CInt, value: AST)"""
target: AST | t.CPtr
op: t.CInt
value: AST | t.CPtr
def __new__(self, pool: memhub.MemManager | t.CPtr,
target: AST | t.CPtr, op: t.CInt, value: AST | t.CPtr):
ptr: AugAssign | t.CPtr = pool.alloc(AugAssign.__sizeof__())
if ptr:
string.memset(ptr, 0, AugAssign.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr,
target: AST | t.CPtr, op: t.CInt, value: AST | t.CPtr):
_init_ast(self, pool, 0, 0)
self.target = target
self.op = op
self.value = value
def kind(self) -> t.CInt:
return ASTKind.AugAssign
def type_name(self) -> str:
return "AugAssign"
def dump(self, buf: t.CChar | t.CPtr, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
pos = _emit(buf, size, pos, "AugAssign(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, ", op=")
pos = _emit(buf, size, pos, _op_name(self.op))
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
# ============================================================
# AnnAssign 节点
# ============================================================
class AnnAssign(AST):
"""AnnAssign(target: AST, annotation: AST, value: AST, simple: CInt)"""
target: AST | t.CPtr
annotation: AST | t.CPtr
value: AST | t.CPtr
simple: t.CInt
def __new__(self, pool: memhub.MemManager | t.CPtr,
target: AST | t.CPtr, annotation: AST | t.CPtr,
value: AST | t.CPtr, simple: t.CInt):
ptr: AnnAssign | t.CPtr = pool.alloc(AnnAssign.__sizeof__())
if ptr:
string.memset(ptr, 0, AnnAssign.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr,
target: AST | t.CPtr, annotation: AST | t.CPtr,
value: AST | t.CPtr, simple: t.CInt):
_init_ast(self, pool, 0, 0)
self.target = target
self.annotation = annotation
self.value = value
self.simple = simple
def kind(self) -> t.CInt:
return ASTKind.AnnAssign
def type_name(self) -> str:
return "AnnAssign"
def dump(self, buf: t.CChar | t.CPtr, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
pos = _emit(buf, size, pos, "AnnAssign(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, ", 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, ", 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, ", simple=")
pos = _emit_int(buf, size, pos, t.CInt64T(self.simple))
pos = _emit(buf, size, pos, ")")
return pos
# ============================================================
# With 节点
# ============================================================
class With(AST):
"""With(items: list[AST | t.CPtr], is_async: CInt)"""
items: list[AST | t.CPtr] | t.CPtr
flags: t.CInt
def __new__(self, pool: memhub.MemManager | t.CPtr,
items: list[AST | t.CPtr] | t.CPtr,
is_async: t.CInt):
ptr: With | t.CPtr = pool.alloc(With.__sizeof__())
if ptr:
string.memset(ptr, 0, With.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr,
items: list[AST | t.CPtr] | t.CPtr,
is_async: t.CInt):
_init_ast(self, pool, 0, 0)
self.items = items
if is_async:
self.flags = FLAG_IS_ASYNC
else:
self.flags = 0
_set_parent_list(items, self)
def kind(self) -> t.CInt:
return ASTKind.With
def type_name(self) -> str:
return "With"
def dump(self, buf: t.CChar | t.CPtr, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
pos = _emit(buf, size, pos, "With(items=")
pos = _dump_list(self.items, buf, size, pos)
pos = _emit(buf, size, pos, ", body=")
pos = _dump_list(self.children, buf, size, pos)
pos = _emit(buf, size, pos, ")")
return pos
# ============================================================
# Raise 节点
# ============================================================
class Raise(AST):
"""Raise(exc: AST, cause: AST)"""
exc: AST | t.CPtr
cause: AST | t.CPtr
def __new__(self, pool: memhub.MemManager | t.CPtr,
exc: AST | t.CPtr, cause: AST | t.CPtr):
ptr: Raise | t.CPtr = pool.alloc(Raise.__sizeof__())
if ptr:
string.memset(ptr, 0, Raise.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr,
exc: AST | t.CPtr, cause: AST | t.CPtr):
_init_ast(self, pool, 0, 0)
self.exc = exc
self.cause = cause
def kind(self) -> t.CInt:
return ASTKind.Raise
def type_name(self) -> str:
return "Raise"
def dump(self, buf: t.CChar | t.CPtr, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
pos = _emit(buf, size, pos, "Raise(exc=")
if self.exc is not None:
pos = self.exc.dump(buf, size, pos)
else:
pos = _emit(buf, size, pos, "None")
pos = _emit(buf, size, pos, ", cause=")
if self.cause is not None:
pos = self.cause.dump(buf, size, pos)
else:
pos = _emit(buf, size, pos, "None")
pos = _emit(buf, size, pos, ")")
return pos
# ============================================================
# Try 节点
# ============================================================
class Try(AST):
"""Try(handlers: list[AST | t.CPtr],
orelse: list[AST | t.CPtr], finalbody: list[AST | t.CPtr])"""
handlers: list[AST | t.CPtr] | t.CPtr
orelse: list[AST | t.CPtr] | t.CPtr
finalbody: list[AST | t.CPtr] | t.CPtr
def __new__(self, pool: memhub.MemManager | t.CPtr,
handlers: list[AST | t.CPtr] | t.CPtr,
orelse: list[AST | t.CPtr] | t.CPtr,
finalbody: list[AST | t.CPtr] | t.CPtr):
ptr: Try | t.CPtr = pool.alloc(Try.__sizeof__())
if ptr:
string.memset(ptr, 0, Try.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr,
handlers: list[AST | t.CPtr] | t.CPtr,
orelse: list[AST | t.CPtr] | t.CPtr,
finalbody: list[AST | t.CPtr] | t.CPtr):
_init_ast(self, pool, 0, 0)
self.handlers = handlers
self.orelse = orelse
self.finalbody = finalbody
_set_parent_list(handlers, self)
_set_parent_list(orelse, self)
_set_parent_list(finalbody, self)
def kind(self) -> t.CInt:
return ASTKind.Try
def type_name(self) -> str:
return "Try"
def dump(self, buf: t.CChar | t.CPtr, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
pos = _emit(buf, size, pos, "Try(body=")
pos = _dump_list(self.children, buf, size, pos)
pos = _emit(buf, size, pos, ", handlers=")
pos = _dump_list(self.handlers, buf, size, pos)
pos = _emit(buf, size, pos, ", orelse=")
pos = _dump_list(self.orelse, buf, size, pos)
pos = _emit(buf, size, pos, ", finalbody=")
pos = _dump_list(self.finalbody, buf, size, pos)
pos = _emit(buf, size, pos, ")")
return pos
# ============================================================
# Assert 节点
# ============================================================
class Assert(AST):
"""Assert(test: AST, msg: AST)"""
test: AST | t.CPtr
msg: AST | t.CPtr
def __new__(self, pool: memhub.MemManager | t.CPtr,
test: AST | t.CPtr, msg: AST | t.CPtr):
ptr: Assert | t.CPtr = pool.alloc(Assert.__sizeof__())
if ptr:
string.memset(ptr, 0, Assert.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr,
test: AST | t.CPtr, msg: AST | t.CPtr):
_init_ast(self, pool, 0, 0)
self.test = test
self.msg = msg
def kind(self) -> t.CInt:
return ASTKind.Assert
def type_name(self) -> str:
return "Assert"
def dump(self, buf: t.CChar | t.CPtr, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
pos = _emit(buf, size, pos, "Assert(test=")
if self.test is not None:
pos = self.test.dump(buf, size, pos)
else:
pos = _emit(buf, size, pos, "None")
pos = _emit(buf, size, pos, ", msg=")
if self.msg is not None:
pos = self.msg.dump(buf, size, pos)
else:
pos = _emit(buf, size, pos, "None")
pos = _emit(buf, size, pos, ")")
return pos
# ============================================================
# Global 节点
# ============================================================
class Global(AST):
"""Global(names: list[AST | t.CPtr])"""
names: list[AST | t.CPtr] | t.CPtr
def __new__(self, pool: memhub.MemManager | t.CPtr,
names: list[AST | t.CPtr] | t.CPtr):
ptr: Global | t.CPtr = pool.alloc(Global.__sizeof__())
if ptr:
string.memset(ptr, 0, Global.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr,
names: list[AST | t.CPtr] | t.CPtr):
_init_ast(self, pool, 0, 0)
self.names = names
_set_parent_list(names, self)
def kind(self) -> t.CInt:
return ASTKind.Global
def type_name(self) -> str:
return "Global"
def dump(self, buf: t.CChar | t.CPtr, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
pos = _emit(buf, size, pos, "Global(names=")
pos = _dump_list(self.names, buf, size, pos)
pos = _emit(buf, size, pos, ")")
return pos
# ============================================================
# Nonlocal 节点
# ============================================================
class Nonlocal(AST):
"""Nonlocal(names: list[AST | t.CPtr])"""
names: list[AST | t.CPtr] | t.CPtr
def __new__(self, pool: memhub.MemManager | t.CPtr,
names: list[AST | t.CPtr] | t.CPtr):
ptr: Nonlocal | t.CPtr = pool.alloc(Nonlocal.__sizeof__())
if ptr:
string.memset(ptr, 0, Nonlocal.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr,
names: list[AST | t.CPtr] | t.CPtr):
_init_ast(self, pool, 0, 0)
self.names = names
_set_parent_list(names, self)
def kind(self) -> t.CInt:
return ASTKind.Nonlocal
def type_name(self) -> str:
return "Nonlocal"
def dump(self, buf: t.CChar | t.CPtr, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
pos = _emit(buf, size, pos, "Nonlocal(names=")
pos = _dump_list(self.names, buf, size, pos)
pos = _emit(buf, size, pos, ")")
return pos
# ============================================================
# Pass 节点
# ============================================================
class Pass(AST):
"""Pass()"""
def __new__(self, pool: memhub.MemManager | t.CPtr):
ptr: Pass | t.CPtr = pool.alloc(Pass.__sizeof__())
if ptr:
string.memset(ptr, 0, Pass.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr):
_init_ast(self, pool, 0, 0)
def kind(self) -> t.CInt:
return ASTKind.Pass
def type_name(self) -> str:
return "Pass"
def dump(self, buf: t.CChar | t.CPtr, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
pos = _emit(buf, size, pos, "Pass()")
return pos
# ============================================================
# Break 节点
# ============================================================
class Break(AST):
"""Break()"""
def __new__(self, pool: memhub.MemManager | t.CPtr):
ptr: Break | t.CPtr = pool.alloc(Break.__sizeof__())
if ptr:
string.memset(ptr, 0, Break.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr):
_init_ast(self, pool, 0, 0)
def kind(self) -> t.CInt:
return ASTKind.Break
def type_name(self) -> str:
return "Break"
def dump(self, buf: t.CChar | t.CPtr, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
pos = _emit(buf, size, pos, "Break()")
return pos
# ============================================================
# Continue 节点
# ============================================================
class Continue(AST):
"""Continue()"""
def __new__(self, pool: memhub.MemManager | t.CPtr):
ptr: Continue | t.CPtr = pool.alloc(Continue.__sizeof__())
if ptr:
string.memset(ptr, 0, Continue.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr):
_init_ast(self, pool, 0, 0)
def kind(self) -> t.CInt:
return ASTKind.Continue
def type_name(self) -> str:
return "Continue"
def dump(self, buf: t.CChar | t.CPtr, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
pos = _emit(buf, size, pos, "Continue()")
return pos
# ============================================================
# Import 节点
# ============================================================
class Import(AST):
"""Import(names: list[AST | t.CPtr])"""
names: list[AST | t.CPtr] | t.CPtr
def __new__(self, pool: memhub.MemManager | t.CPtr,
names: list[AST | t.CPtr] | t.CPtr):
ptr: Import | t.CPtr = pool.alloc(Import.__sizeof__())
if ptr:
string.memset(ptr, 0, Import.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr,
names: list[AST | t.CPtr] | t.CPtr):
_init_ast(self, pool, 0, 0)
self.names = names
_set_parent_list(names, self)
def kind(self) -> t.CInt:
return ASTKind.Import
def type_name(self) -> str:
return "Import"
def dump(self, buf: t.CChar | t.CPtr, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
pos = _emit(buf, size, pos, "Import(names=")
pos = _dump_list(self.names, buf, size, pos)
pos = _emit(buf, size, pos, ")")
return pos
# ============================================================
# ImportFrom 节点
# ============================================================
class ImportFrom(AST):
"""ImportFrom(module: str, names: list[AST | t.CPtr], level: CInt)"""
module: str
names: list[AST | t.CPtr] | t.CPtr
level: t.CInt
def __new__(self, pool: memhub.MemManager | t.CPtr,
module: str,
names: list[AST | t.CPtr] | t.CPtr,
level: t.CInt):
ptr: ImportFrom | t.CPtr = pool.alloc(ImportFrom.__sizeof__())
if ptr:
string.memset(ptr, 0, ImportFrom.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr,
module: str,
names: list[AST | t.CPtr] | t.CPtr,
level: t.CInt):
_init_ast(self, pool, 0, 0)
self.module = _copy_str(pool, module)
self.names = names
self.level = level
_set_parent_list(names, self)
def kind(self) -> t.CInt:
return ASTKind.ImportFrom
def type_name(self) -> str:
return "ImportFrom"
def dump(self, buf: t.CChar | t.CPtr, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
pos = _emit(buf, size, pos, "ImportFrom(module='")
pos = _emit_str(buf, size, pos, self.module)
pos = _emit(buf, size, pos, "', names=")
pos = _dump_list(self.names, buf, size, pos)
pos = _emit(buf, size, pos, ", level=")
pos = _emit_int(buf, size, pos, t.CInt64T(self.level))
pos = _emit(buf, size, pos, ")")
return pos
# ============================================================
# Match 节点
# ============================================================
class Match(AST):
"""Match(subject: AST, cases: list[AST | t.CPtr])"""
subject: AST | t.CPtr
cases: list[AST | t.CPtr] | t.CPtr
def __new__(self, pool: memhub.MemManager | t.CPtr,
subject: AST | t.CPtr,
cases: list[AST | t.CPtr] | t.CPtr):
ptr: Match | t.CPtr = pool.alloc(Match.__sizeof__())
if ptr:
string.memset(ptr, 0, Match.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr,
subject: AST | t.CPtr,
cases: list[AST | t.CPtr] | t.CPtr):
_init_ast(self, pool, 0, 0)
self.subject = subject
self.cases = cases
_set_parent_list(cases, self)
def kind(self) -> t.CInt:
return ASTKind.Match
def type_name(self) -> str:
return "Match"
def dump(self, buf: t.CChar | t.CPtr, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
pos = _emit(buf, size, pos, "Match(subject=")
if self.subject is not None:
pos = self.subject.dump(buf, size, pos)
else:
pos = _emit(buf, size, pos, "None")
pos = _emit(buf, size, pos, ", cases=")
pos = _dump_list(self.cases, buf, size, pos)
pos = _emit(buf, size, pos, ")")
return pos