PyDecisionGraph 0.3.2.post1__cp315-cp315-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- decision_graph/__infra__.pxd +1 -0
- decision_graph/__init__.pxd +1 -0
- decision_graph/__init__.py +39 -0
- decision_graph/decision_tree/__init__.pxd +2 -0
- decision_graph/decision_tree/__init__.py +85 -0
- decision_graph/decision_tree/bake/__infra__.pxd +502 -0
- decision_graph/decision_tree/bake/__init__.pxd +502 -0
- decision_graph/decision_tree/bake/__init__.py +29 -0
- decision_graph/decision_tree/bake/c_action.cp315-win_amd64.pyd +0 -0
- decision_graph/decision_tree/bake/c_action.h +324 -0
- decision_graph/decision_tree/bake/c_action.pxd +54 -0
- decision_graph/decision_tree/bake/c_action.pyi +126 -0
- decision_graph/decision_tree/bake/c_action.pyx +65 -0
- decision_graph/decision_tree/bake/c_allocator_protocol.cp315-win_amd64.pyd +0 -0
- decision_graph/decision_tree/bake/c_allocator_protocol.pxd +24 -0
- decision_graph/decision_tree/bake/c_allocator_protocol.pyi +61 -0
- decision_graph/decision_tree/bake/c_allocator_protocol.pyx +109 -0
- decision_graph/decision_tree/bake/c_bake.cp315-win_amd64.pyd +0 -0
- decision_graph/decision_tree/bake/c_bake.h +629 -0
- decision_graph/decision_tree/bake/c_bake.pxd +52 -0
- decision_graph/decision_tree/bake/c_bake.pyi +151 -0
- decision_graph/decision_tree/bake/c_bake.pyx +142 -0
- decision_graph/decision_tree/bake/c_collections.cp315-win_amd64.pyd +0 -0
- decision_graph/decision_tree/bake/c_collections.h +692 -0
- decision_graph/decision_tree/bake/c_collections.pxd +52 -0
- decision_graph/decision_tree/bake/c_collections.pyi +193 -0
- decision_graph/decision_tree/bake/c_collections.pyx +161 -0
- decision_graph/decision_tree/bake/c_const.cp315-win_amd64.pyd +0 -0
- decision_graph/decision_tree/bake/c_const.h +395 -0
- decision_graph/decision_tree/bake/c_const.pxd +56 -0
- decision_graph/decision_tree/bake/c_const.pyi +305 -0
- decision_graph/decision_tree/bake/c_const.pyx +278 -0
- decision_graph/decision_tree/bake/c_edge.cp315-win_amd64.pyd +0 -0
- decision_graph/decision_tree/bake/c_edge.h +511 -0
- decision_graph/decision_tree/bake/c_edge.pxd +117 -0
- decision_graph/decision_tree/bake/c_edge.pyi +192 -0
- decision_graph/decision_tree/bake/c_edge.pyx +270 -0
- decision_graph/decision_tree/bake/c_eval.h +848 -0
- decision_graph/decision_tree/bake/c_eval.pxd +40 -0
- decision_graph/decision_tree/bake/c_expr.cp315-win_amd64.pyd +0 -0
- decision_graph/decision_tree/bake/c_expr.h +1900 -0
- decision_graph/decision_tree/bake/c_expr.pxd +129 -0
- decision_graph/decision_tree/bake/c_expr.pyi +280 -0
- decision_graph/decision_tree/bake/c_expr.pyx +272 -0
- decision_graph/decision_tree/bake/c_hierarchy.cp315-win_amd64.pyd +0 -0
- decision_graph/decision_tree/bake/c_hierarchy.h +731 -0
- decision_graph/decision_tree/bake/c_hierarchy.pxd +71 -0
- decision_graph/decision_tree/bake/c_hierarchy.pyi +409 -0
- decision_graph/decision_tree/bake/c_hierarchy.pyx +277 -0
- decision_graph/decision_tree/bake/c_logic_group.cp315-win_amd64.pyd +0 -0
- decision_graph/decision_tree/bake/c_logic_group.h +1226 -0
- decision_graph/decision_tree/bake/c_logic_group.pxd +162 -0
- decision_graph/decision_tree/bake/c_logic_group.pyi +264 -0
- decision_graph/decision_tree/bake/c_logic_group.pyx +308 -0
- decision_graph/decision_tree/bake/c_node.cp315-win_amd64.pyd +0 -0
- decision_graph/decision_tree/bake/c_node.h +2660 -0
- decision_graph/decision_tree/bake/c_node.pxd +381 -0
- decision_graph/decision_tree/bake/c_node.pyi +438 -0
- decision_graph/decision_tree/bake/c_node.pyx +639 -0
- decision_graph/decision_tree/bake/c_reconstruct.cp315-win_amd64.pyd +0 -0
- decision_graph/decision_tree/bake/c_reconstruct.pxd +63 -0
- decision_graph/decision_tree/bake/c_reconstruct.pyi +60 -0
- decision_graph/decision_tree/bake/c_reconstruct.pyx +252 -0
- decision_graph/decision_tree/bake/c_var.cp315-win_amd64.pyd +0 -0
- decision_graph/decision_tree/bake/c_var.h +2054 -0
- decision_graph/decision_tree/bake/c_var.pxd +205 -0
- decision_graph/decision_tree/bake/c_var.pyi +271 -0
- decision_graph/decision_tree/bake/c_var.pyx +228 -0
- decision_graph/decision_tree/capi/__infra__.pxd +33 -0
- decision_graph/decision_tree/capi/__init__.pxd +33 -0
- decision_graph/decision_tree/capi/__init__.py +57 -0
- decision_graph/decision_tree/capi/c_abc.cp315-win_amd64.pyd +0 -0
- decision_graph/decision_tree/capi/c_abc.pxd +246 -0
- decision_graph/decision_tree/capi/c_abc.pyi +770 -0
- decision_graph/decision_tree/capi/c_abc.pyx +1532 -0
- decision_graph/decision_tree/capi/c_collection.cp315-win_amd64.pyd +0 -0
- decision_graph/decision_tree/capi/c_collection.pxd +22 -0
- decision_graph/decision_tree/capi/c_collection.pyi +245 -0
- decision_graph/decision_tree/capi/c_collection.pyx +138 -0
- decision_graph/decision_tree/capi/c_node.cp315-win_amd64.pyd +0 -0
- decision_graph/decision_tree/capi/c_node.pxd +95 -0
- decision_graph/decision_tree/capi/c_node.pyi +492 -0
- decision_graph/decision_tree/capi/c_node.pyx +551 -0
- decision_graph/decision_tree/exc.py +189 -0
- decision_graph/decision_tree/native/__init__.py +57 -0
- decision_graph/decision_tree/native/abc.py +1167 -0
- decision_graph/decision_tree/native/collection.py +134 -0
- decision_graph/decision_tree/native/node.py +521 -0
- decision_graph/includes/decision_graph/decision_tree/bake/c_action.c +16320 -0
- decision_graph/includes/decision_graph/decision_tree/bake/c_action.h +324 -0
- decision_graph/includes/decision_graph/decision_tree/bake/c_allocator_protocol.c +12473 -0
- decision_graph/includes/decision_graph/decision_tree/bake/c_bake.c +16485 -0
- decision_graph/includes/decision_graph/decision_tree/bake/c_bake.h +629 -0
- decision_graph/includes/decision_graph/decision_tree/bake/c_collections.c +17381 -0
- decision_graph/includes/decision_graph/decision_tree/bake/c_collections.h +692 -0
- decision_graph/includes/decision_graph/decision_tree/bake/c_const.c +20815 -0
- decision_graph/includes/decision_graph/decision_tree/bake/c_const.h +395 -0
- decision_graph/includes/decision_graph/decision_tree/bake/c_edge.c +20696 -0
- decision_graph/includes/decision_graph/decision_tree/bake/c_edge.h +511 -0
- decision_graph/includes/decision_graph/decision_tree/bake/c_eval.h +848 -0
- decision_graph/includes/decision_graph/decision_tree/bake/c_expr.c +22065 -0
- decision_graph/includes/decision_graph/decision_tree/bake/c_expr.h +1900 -0
- decision_graph/includes/decision_graph/decision_tree/bake/c_hierarchy.c +23267 -0
- decision_graph/includes/decision_graph/decision_tree/bake/c_hierarchy.h +731 -0
- decision_graph/includes/decision_graph/decision_tree/bake/c_logic_group.c +22434 -0
- decision_graph/includes/decision_graph/decision_tree/bake/c_logic_group.h +1226 -0
- decision_graph/includes/decision_graph/decision_tree/bake/c_node.c +28385 -0
- decision_graph/includes/decision_graph/decision_tree/bake/c_node.h +2660 -0
- decision_graph/includes/decision_graph/decision_tree/bake/c_reconstruct.c +15955 -0
- decision_graph/includes/decision_graph/decision_tree/bake/c_var.c +16881 -0
- decision_graph/includes/decision_graph/decision_tree/bake/c_var.h +2054 -0
- decision_graph/includes/decision_graph/decision_tree/capi/c_abc.c +59196 -0
- decision_graph/includes/decision_graph/decision_tree/capi/c_collection.c +19967 -0
- decision_graph/includes/decision_graph/decision_tree/capi/c_node.c +39229 -0
- decision_graph/logic_group/__init__.py +25 -0
- decision_graph/logic_group/base.py +100 -0
- decision_graph/logic_group/pending_request.py +384 -0
- decision_graph/webui/__init__.py +24 -0
- decision_graph/webui/bake/__init__.py +65 -0
- decision_graph/webui/bake/app.py +488 -0
- decision_graph/webui/bake/static/d3.v7.min.js +2 -0
- decision_graph/webui/bake/static/script.js +1440 -0
- decision_graph/webui/bake/static/style.css +920 -0
- decision_graph/webui/bake/templates/index.html +183 -0
- decision_graph/webui/bake/templates/offline.html +184 -0
- decision_graph/webui/capi/__init__.py +54 -0
- decision_graph/webui/capi/app.py +366 -0
- decision_graph/webui/capi/main.py +53 -0
- decision_graph/webui/capi/static/d3.v7.min.js +2 -0
- decision_graph/webui/capi/static/script.js +1026 -0
- decision_graph/webui/capi/static/style.css +656 -0
- decision_graph/webui/capi/templates/index.html +93 -0
- decision_graph/webui/capi/templates/offline.html +94 -0
- decision_graph/webui/native/__init__.py +54 -0
- decision_graph/webui/native/app.py +366 -0
- decision_graph/webui/native/main.py +53 -0
- decision_graph/webui/native/static/d3.v7.min.js +2 -0
- decision_graph/webui/native/static/script.js +1026 -0
- decision_graph/webui/native/static/style.css +656 -0
- decision_graph/webui/native/templates/index.html +93 -0
- decision_graph/webui/native/templates/offline.html +94 -0
- pydecisiongraph-0.3.2.post1.dist-info/METADATA +136 -0
- pydecisiongraph-0.3.2.post1.dist-info/RECORD +148 -0
- pydecisiongraph-0.3.2.post1.dist-info/WHEEL +5 -0
- pydecisiongraph-0.3.2.post1.dist-info/licenses/LICENSE +373 -0
- pydecisiongraph-0.3.2.post1.dist-info/top_level.txt +2 -0
- tests/bake_c_evaluator.cp315-win_amd64.pyd +0 -0
- tests/bake_eval_probe.cp315-win_amd64.pyd +0 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
from libc.stdint cimport uintptr_t
|
|
2
|
+
|
|
3
|
+
from .c_action cimport ActionNode, CancelAction, ClearAction, LongAction, NoAction, ShortAction
|
|
4
|
+
from .c_collections cimport AttrExpression
|
|
5
|
+
from .c_const cimport ConstantNode, VariableNode
|
|
6
|
+
from .c_expr cimport BinaryExpression, ExpressionNode, TernaryExpression, UnaryExpression
|
|
7
|
+
from .c_hierarchy cimport BreakpointNode, RootLogicNode
|
|
8
|
+
from .c_node cimport LogicNode, NODE_REGISTRY, PlaceholderNode, dcg_node
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
cdef inline void c_dcg_node_attach_header(LogicNode node, dcg_node* header, bint owner):
|
|
12
|
+
cdef uintptr_t parent_address = 0
|
|
13
|
+
|
|
14
|
+
node.header = header
|
|
15
|
+
node.owner = owner
|
|
16
|
+
node.parent = None
|
|
17
|
+
if header.parent:
|
|
18
|
+
parent_address = <uintptr_t> header.parent
|
|
19
|
+
if parent_address in NODE_REGISTRY:
|
|
20
|
+
node.parent = NODE_REGISTRY[parent_address]
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
# === Variant Reconstruct ===
|
|
24
|
+
|
|
25
|
+
cdef ConstantNode c_dcg_node_reconstruct_const(dcg_node* header, bint owner=?)
|
|
26
|
+
|
|
27
|
+
cdef VariableNode c_dcg_node_reconstruct_variable(dcg_node* header, bint owner=?)
|
|
28
|
+
|
|
29
|
+
cdef AttrExpression c_dcg_node_reconstruct_attr(dcg_node* header, bint owner=?)
|
|
30
|
+
|
|
31
|
+
cdef ExpressionNode c_dcg_node_reconstruct_expr(dcg_node* header, bint owner=?)
|
|
32
|
+
|
|
33
|
+
cdef UnaryExpression c_dcg_node_reconstruct_unary(dcg_node* header, bint owner=?)
|
|
34
|
+
|
|
35
|
+
cdef BinaryExpression c_dcg_node_reconstruct_binary(dcg_node* header, bint owner=?)
|
|
36
|
+
|
|
37
|
+
cdef TernaryExpression c_dcg_node_reconstruct_ternary(dcg_node* header, bint owner=?)
|
|
38
|
+
|
|
39
|
+
cdef ActionNode c_dcg_node_reconstruct_action(dcg_node* header, bint owner=?)
|
|
40
|
+
|
|
41
|
+
cdef NoAction c_dcg_node_reconstruct_noaction(dcg_node* header, bint owner=?)
|
|
42
|
+
|
|
43
|
+
cdef LongAction c_dcg_node_reconstruct_longaction(dcg_node* header, bint owner=?)
|
|
44
|
+
|
|
45
|
+
cdef ShortAction c_dcg_node_reconstruct_shortaction(dcg_node* header, bint owner=?)
|
|
46
|
+
|
|
47
|
+
cdef CancelAction c_dcg_node_reconstruct_cancelaction(dcg_node* header, bint owner=?)
|
|
48
|
+
|
|
49
|
+
cdef ClearAction c_dcg_node_reconstruct_clearaction(dcg_node* header, bint owner=?)
|
|
50
|
+
|
|
51
|
+
cdef PlaceholderNode c_dcg_node_reconstruct_placeholder(dcg_node* header, bint owner=?)
|
|
52
|
+
|
|
53
|
+
cdef RootLogicNode c_dcg_node_reconstruct_root(dcg_node* header, bint owner=?)
|
|
54
|
+
|
|
55
|
+
cdef BreakpointNode c_dcg_node_reconstruct_breakpoint(dcg_node* header, bint owner=?)
|
|
56
|
+
|
|
57
|
+
# === Dispatch ===
|
|
58
|
+
|
|
59
|
+
cdef LogicNode c_dcg_node_reconstruct(dcg_node* header, bint owner=?)
|
|
60
|
+
|
|
61
|
+
cpdef LogicNode c_dcg_node_reconstruct_from_address(uintptr_t address, bint owner=?)
|
|
62
|
+
|
|
63
|
+
cpdef LogicNode c_dcg_node_root_from_address(uintptr_t address, bint owner=?)
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"""The way back: a node in C to the wrappers that stand for the graph it is in.
|
|
2
|
+
|
|
3
|
+
A graph is built from Python but lives in C, so a caller holding nothing but an
|
|
4
|
+
address - a process reading a graph out of memory another process shared, a
|
|
5
|
+
callback naming a node the C layer grew - needs the Python side back before
|
|
6
|
+
anything can be inspected or rendered.
|
|
7
|
+
|
|
8
|
+
A reconstruction restores the neighbourhood, not just the block: the node as the
|
|
9
|
+
class its type names, its children and their subtrees with the edges they hang
|
|
10
|
+
by, its parent and through it the whole graph up to the root, and what a family
|
|
11
|
+
carries beyond the edges - an expression's operands, a read's store, a
|
|
12
|
+
breakpoint's group.
|
|
13
|
+
|
|
14
|
+
Every wrapper the walk builds is registered, which is what makes one block one
|
|
15
|
+
Python object and what lets the walk terminate: a child asking for its parent
|
|
16
|
+
lands on the wrapper that is already there.
|
|
17
|
+
|
|
18
|
+
The variants themselves - one function per class, and the dispatch over them -
|
|
19
|
+
are ``cdef``, and not module attributes: this stub is the module's Python face.
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
from .c_node import LogicNode
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def c_dcg_node_reconstruct_from_address(address: int, owner: bool = False) -> LogicNode:
|
|
26
|
+
"""The wrapper for the node at an address, with its graph restored.
|
|
27
|
+
|
|
28
|
+
Args:
|
|
29
|
+
address: Address of the C node block. Zero is refused.
|
|
30
|
+
owner: Whether the wrapper for THAT node may free its block; the
|
|
31
|
+
wrappers the walk adds around it own nothing.
|
|
32
|
+
|
|
33
|
+
Returns:
|
|
34
|
+
The wrapper for the node, with its graph restored around it.
|
|
35
|
+
|
|
36
|
+
Raises:
|
|
37
|
+
ValueError: When the address is zero.
|
|
38
|
+
"""
|
|
39
|
+
...
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def c_dcg_node_root_from_address(address: int, owner: bool = False) -> LogicNode:
|
|
43
|
+
"""The graph's entry point above a node: its root, reconstructed.
|
|
44
|
+
|
|
45
|
+
A node reached in the middle of a graph is not the graph, and what a caller
|
|
46
|
+
with only an address usually wants is the top of it. The root is found in C,
|
|
47
|
+
by the parent chain, and reconstructed like any other node - which also means
|
|
48
|
+
everything between it and the address comes back on the way.
|
|
49
|
+
|
|
50
|
+
Args:
|
|
51
|
+
address: Address of a node in the graph.
|
|
52
|
+
owner: Whether the wrapper for the ROOT may free its block.
|
|
53
|
+
|
|
54
|
+
Returns:
|
|
55
|
+
The root of the graph the node is in.
|
|
56
|
+
|
|
57
|
+
Raises:
|
|
58
|
+
ValueError: When the address is zero.
|
|
59
|
+
"""
|
|
60
|
+
...
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
from libc.stdio cimport fflush, fprintf, stderr
|
|
2
|
+
|
|
3
|
+
from .c_const cimport dcg_variable_node
|
|
4
|
+
from .c_edge cimport EDGE_REGISTRY, NodeEdgeCondition
|
|
5
|
+
from .c_expr cimport dcg_expression_node
|
|
6
|
+
from .c_hierarchy cimport NodeEvalPathView, dcg_breakpoint_node, dcg_root_node
|
|
7
|
+
from .c_logic_group cimport GROUP_REGISTRY, dcg_logic_group
|
|
8
|
+
from .c_node cimport c_dcg_node_root, dcg_node_type
|
|
9
|
+
from .c_var cimport c_dcg_var_pyunpack
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
# ========== The Variants ==========
|
|
13
|
+
|
|
14
|
+
cdef ConstantNode c_dcg_node_reconstruct_const(dcg_node* header, bint owner=False):
|
|
15
|
+
cdef ConstantNode node = ConstantNode.__new__(ConstantNode)
|
|
16
|
+
c_dcg_node_attach_header(node, header, owner)
|
|
17
|
+
node.c_register_node()
|
|
18
|
+
return node
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
cdef VariableNode c_dcg_node_reconstruct_variable(dcg_node* header, bint owner=False):
|
|
22
|
+
cdef VariableNode node = VariableNode.__new__(VariableNode)
|
|
23
|
+
c_dcg_node_attach_header(node, header, owner)
|
|
24
|
+
node.c_register_node()
|
|
25
|
+
return node
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
cdef AttrExpression c_dcg_node_reconstruct_attr(dcg_node* header, bint owner=False):
|
|
29
|
+
cdef AttrExpression node = AttrExpression.__new__(AttrExpression)
|
|
30
|
+
cdef dcg_logic_group* group = (<dcg_variable_node*> header).logic_group
|
|
31
|
+
|
|
32
|
+
c_dcg_node_attach_header(node, header, owner)
|
|
33
|
+
node.c_register_node()
|
|
34
|
+
if group:
|
|
35
|
+
node.logic_group = <object> GROUP_REGISTRY[<uintptr_t> group]
|
|
36
|
+
return node
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
cdef void c_dcg_node_restore_operands(ExpressionNode node, dcg_expression_node* header):
|
|
40
|
+
cdef size_t i
|
|
41
|
+
cdef dcg_node** operands = header.components
|
|
42
|
+
cdef object value = None
|
|
43
|
+
|
|
44
|
+
node.c_components_alloc(header.n_args)
|
|
45
|
+
for i in range(header.n_args):
|
|
46
|
+
if operands and operands[i]:
|
|
47
|
+
node.c_components_assign(i, c_dcg_node_reconstruct(operands[i], False))
|
|
48
|
+
continue
|
|
49
|
+
|
|
50
|
+
value = c_dcg_var_pyunpack(&header.args[i])
|
|
51
|
+
if value is not None:
|
|
52
|
+
node.c_components_assign(i, ConstantNode(value))
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
cdef ExpressionNode c_dcg_node_reconstruct_expr(dcg_node* header, bint owner=False):
|
|
56
|
+
cdef ExpressionNode node = ExpressionNode.__new__(ExpressionNode)
|
|
57
|
+
c_dcg_node_attach_header(node, header, owner)
|
|
58
|
+
node.c_register_node()
|
|
59
|
+
c_dcg_node_restore_operands(node, <dcg_expression_node*> header)
|
|
60
|
+
return node
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
cdef UnaryExpression c_dcg_node_reconstruct_unary(dcg_node* header, bint owner=False):
|
|
64
|
+
cdef UnaryExpression node = UnaryExpression.__new__(UnaryExpression)
|
|
65
|
+
c_dcg_node_attach_header(node, header, owner)
|
|
66
|
+
node.c_register_node()
|
|
67
|
+
c_dcg_node_restore_operands(node, <dcg_expression_node*> header)
|
|
68
|
+
return node
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
cdef BinaryExpression c_dcg_node_reconstruct_binary(dcg_node* header, bint owner=False):
|
|
72
|
+
cdef BinaryExpression node = BinaryExpression.__new__(BinaryExpression)
|
|
73
|
+
c_dcg_node_attach_header(node, header, owner)
|
|
74
|
+
node.c_register_node()
|
|
75
|
+
c_dcg_node_restore_operands(node, <dcg_expression_node*> header)
|
|
76
|
+
return node
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
cdef TernaryExpression c_dcg_node_reconstruct_ternary(dcg_node* header, bint owner=False):
|
|
80
|
+
cdef TernaryExpression node = TernaryExpression.__new__(TernaryExpression)
|
|
81
|
+
c_dcg_node_attach_header(node, header, owner)
|
|
82
|
+
node.c_register_node()
|
|
83
|
+
c_dcg_node_restore_operands(node, <dcg_expression_node*> header)
|
|
84
|
+
return node
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
cdef ActionNode c_dcg_node_reconstruct_action(dcg_node* header, bint owner=False):
|
|
88
|
+
cdef ActionNode node = ActionNode.__new__(ActionNode)
|
|
89
|
+
c_dcg_node_attach_header(node, header, owner)
|
|
90
|
+
node.c_register_node()
|
|
91
|
+
return node
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
cdef NoAction c_dcg_node_reconstruct_noaction(dcg_node* header, bint owner=False):
|
|
95
|
+
cdef NoAction node = NoAction.__new__(NoAction)
|
|
96
|
+
c_dcg_node_attach_header(node, header, owner)
|
|
97
|
+
node.c_register_node()
|
|
98
|
+
return node
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
cdef LongAction c_dcg_node_reconstruct_longaction(dcg_node* header, bint owner=False):
|
|
102
|
+
cdef LongAction node = LongAction.__new__(LongAction)
|
|
103
|
+
c_dcg_node_attach_header(node, header, owner)
|
|
104
|
+
node.c_register_node()
|
|
105
|
+
return node
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
cdef ShortAction c_dcg_node_reconstruct_shortaction(dcg_node* header, bint owner=False):
|
|
109
|
+
cdef ShortAction node = ShortAction.__new__(ShortAction)
|
|
110
|
+
c_dcg_node_attach_header(node, header, owner)
|
|
111
|
+
node.c_register_node()
|
|
112
|
+
return node
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
cdef CancelAction c_dcg_node_reconstruct_cancelaction(dcg_node* header, bint owner=False):
|
|
116
|
+
cdef CancelAction node = CancelAction.__new__(CancelAction)
|
|
117
|
+
c_dcg_node_attach_header(node, header, owner)
|
|
118
|
+
node.c_register_node()
|
|
119
|
+
return node
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
cdef ClearAction c_dcg_node_reconstruct_clearaction(dcg_node* header, bint owner=False):
|
|
123
|
+
cdef ClearAction node = ClearAction.__new__(ClearAction)
|
|
124
|
+
c_dcg_node_attach_header(node, header, owner)
|
|
125
|
+
node.c_register_node()
|
|
126
|
+
return node
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
cdef PlaceholderNode c_dcg_node_reconstruct_placeholder(dcg_node* header, bint owner=False):
|
|
130
|
+
cdef PlaceholderNode node = PlaceholderNode.__new__(PlaceholderNode)
|
|
131
|
+
c_dcg_node_attach_header(node, header, owner)
|
|
132
|
+
node.c_register_node()
|
|
133
|
+
return node
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
cdef RootLogicNode c_dcg_node_reconstruct_root(dcg_node* header, bint owner=False):
|
|
137
|
+
cdef RootLogicNode node = RootLogicNode.__new__(RootLogicNode)
|
|
138
|
+
cdef dcg_root_node* root = <dcg_root_node*> header
|
|
139
|
+
c_dcg_node_attach_header(node, header, owner)
|
|
140
|
+
node.eval_path = NodeEvalPathView.c_from_header(&root.eval_path)
|
|
141
|
+
node.c_register_node()
|
|
142
|
+
return node
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
cdef BreakpointNode c_dcg_node_reconstruct_breakpoint(dcg_node* header, bint owner=False):
|
|
146
|
+
cdef BreakpointNode node = BreakpointNode.__new__(BreakpointNode)
|
|
147
|
+
cdef dcg_logic_group* group = (<dcg_breakpoint_node*> header).break_from
|
|
148
|
+
|
|
149
|
+
c_dcg_node_attach_header(node, header, owner)
|
|
150
|
+
node.c_register_node()
|
|
151
|
+
if group:
|
|
152
|
+
node.break_from = <object> GROUP_REGISTRY[<uintptr_t> group]
|
|
153
|
+
return node
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
# ========== The Walk ==========
|
|
157
|
+
|
|
158
|
+
cdef void c_dcg_node_restore_edges(LogicNode node, dcg_node* header):
|
|
159
|
+
cdef dcg_node* child = header.children
|
|
160
|
+
cdef LogicNode child_node
|
|
161
|
+
cdef NodeEdgeCondition condition
|
|
162
|
+
|
|
163
|
+
while child:
|
|
164
|
+
condition = <NodeEdgeCondition> EDGE_REGISTRY[<uintptr_t> child.condition_to_parent]
|
|
165
|
+
child_node = c_dcg_node_reconstruct(child, False)
|
|
166
|
+
|
|
167
|
+
node.children[condition] = child_node
|
|
168
|
+
child_node.parent = node
|
|
169
|
+
child_node.condition_to_parent = condition
|
|
170
|
+
|
|
171
|
+
child = child.next_sibling
|
|
172
|
+
|
|
173
|
+
if header.parent:
|
|
174
|
+
node.parent = c_dcg_node_reconstruct(header.parent, False)
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
cdef LogicNode c_dcg_node_reconstruct(dcg_node* header, bint owner=False):
|
|
178
|
+
if not header:
|
|
179
|
+
raise ValueError('A NULL header is not a node: there is nothing to reconstruct.')
|
|
180
|
+
|
|
181
|
+
cdef uintptr_t address = <uintptr_t> header
|
|
182
|
+
if address in NODE_REGISTRY:
|
|
183
|
+
return NODE_REGISTRY[address]
|
|
184
|
+
|
|
185
|
+
cdef dcg_node_type ntype = header.ntype
|
|
186
|
+
cdef LogicNode node
|
|
187
|
+
|
|
188
|
+
# The input family: the literals, then the read.
|
|
189
|
+
if ntype == dcg_node_type.DCG_NODE_INPUT or ntype == dcg_node_type.DCG_NODE_TRUE or ntype == dcg_node_type.DCG_NODE_FALSE or ntype == dcg_node_type.DCG_NODE_DOUBLE or ntype == dcg_node_type.DCG_NODE_STRING or ntype == dcg_node_type.DCG_NODE_INT:
|
|
190
|
+
node = c_dcg_node_reconstruct_const(header, owner)
|
|
191
|
+
elif ntype == dcg_node_type.DCG_NODE_VARIABLE:
|
|
192
|
+
# A read names the group it reads and a plain variable names none, so
|
|
193
|
+
# the node's own state is what tells the two classes apart - the type
|
|
194
|
+
# they share cannot.
|
|
195
|
+
node = c_dcg_node_reconstruct_attr(header, owner) if (<dcg_variable_node*> header).logic_group else c_dcg_node_reconstruct_variable(header, owner)
|
|
196
|
+
# The operator family, by arity.
|
|
197
|
+
elif ntype == dcg_node_type.DCG_NODE_OP:
|
|
198
|
+
node = c_dcg_node_reconstruct_expr(header, owner)
|
|
199
|
+
elif ntype == dcg_node_type.DCG_NODE_UNARY:
|
|
200
|
+
node = c_dcg_node_reconstruct_unary(header, owner)
|
|
201
|
+
elif ntype == dcg_node_type.DCG_NODE_BINARY:
|
|
202
|
+
node = c_dcg_node_reconstruct_binary(header, owner)
|
|
203
|
+
elif ntype == dcg_node_type.DCG_NODE_TERNARY:
|
|
204
|
+
node = c_dcg_node_reconstruct_ternary(header, owner)
|
|
205
|
+
# The action family, by kind.
|
|
206
|
+
elif ntype == dcg_node_type.DCG_NODE_ACTION:
|
|
207
|
+
node = c_dcg_node_reconstruct_action(header, owner)
|
|
208
|
+
elif ntype == dcg_node_type.DCG_NODE_NOACTION:
|
|
209
|
+
node = c_dcg_node_reconstruct_noaction(header, owner)
|
|
210
|
+
elif ntype == dcg_node_type.DCG_NODE_LONGACTION:
|
|
211
|
+
node = c_dcg_node_reconstruct_longaction(header, owner)
|
|
212
|
+
elif ntype == dcg_node_type.DCG_NODE_SHORTACTION:
|
|
213
|
+
node = c_dcg_node_reconstruct_shortaction(header, owner)
|
|
214
|
+
elif ntype == dcg_node_type.DCG_NODE_CANCELACTION:
|
|
215
|
+
node = c_dcg_node_reconstruct_cancelaction(header, owner)
|
|
216
|
+
elif ntype == dcg_node_type.DCG_NODE_CLEARACTION:
|
|
217
|
+
node = c_dcg_node_reconstruct_clearaction(header, owner)
|
|
218
|
+
elif ntype == dcg_node_type.DCG_NODE_PLACEHOLDER:
|
|
219
|
+
node = c_dcg_node_reconstruct_placeholder(header, owner)
|
|
220
|
+
# The special family.
|
|
221
|
+
elif ntype == dcg_node_type.DCG_NODE_ROOT:
|
|
222
|
+
node = c_dcg_node_reconstruct_root(header, owner)
|
|
223
|
+
elif ntype == dcg_node_type.DCG_NODE_BREAKPOINT:
|
|
224
|
+
node = c_dcg_node_reconstruct_breakpoint(header, owner)
|
|
225
|
+
else:
|
|
226
|
+
# Nothing claims the type, and the difference matters. Two cases reach
|
|
227
|
+
# here with a reason, and both are answered by the generic view: a family
|
|
228
|
+
# head with no variant of its own (DCG_NODE_SPECIAL), and a CALL, whose
|
|
229
|
+
# callee is composed into the node's display text and stored nowhere - a
|
|
230
|
+
# rebuilt call node would not know what it calls. A variant nothing
|
|
231
|
+
# claims is a type this module was never taught, and that is reported
|
|
232
|
+
# rather than silently wrapped as something it is not.
|
|
233
|
+
if ntype != dcg_node_type.DCG_NODE_SPECIAL and ntype != dcg_node_type.DCG_NODE_CALL:
|
|
234
|
+
fprintf(
|
|
235
|
+
stderr, "[DCG] c_dcg_node_reconstruct: node type 0x%x has no reconstruction variant - wrapping it as the base node\n", <unsigned int> ntype
|
|
236
|
+
)
|
|
237
|
+
fflush(stderr)
|
|
238
|
+
node = LogicNode.c_from_header(header, owner)
|
|
239
|
+
node.c_register_node()
|
|
240
|
+
|
|
241
|
+
c_dcg_node_restore_edges(node, header)
|
|
242
|
+
return node
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
# ========== The Proxies ==========
|
|
246
|
+
|
|
247
|
+
cpdef LogicNode c_dcg_node_reconstruct_from_address(uintptr_t address, bint owner=False):
|
|
248
|
+
return c_dcg_node_reconstruct(<dcg_node*> address, owner)
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
cpdef LogicNode c_dcg_node_root_from_address(uintptr_t address, bint owner=False):
|
|
252
|
+
return c_dcg_node_reconstruct(c_dcg_node_root(<dcg_node*> address), owner)
|
|
Binary file
|