338 lines
11 KiB
Python
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
|