zexus 1.6.2
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.
- package/LICENSE +0 -0
- package/README.md +2513 -0
- package/bin/zexus +2 -0
- package/bin/zpics +2 -0
- package/bin/zpm +2 -0
- package/bin/zx +2 -0
- package/bin/zx-deploy +2 -0
- package/bin/zx-dev +2 -0
- package/bin/zx-run +2 -0
- package/package.json +66 -0
- package/scripts/README.md +24 -0
- package/scripts/postinstall.js +44 -0
- package/shared_config.json +24 -0
- package/src/README.md +1525 -0
- package/src/tests/run_zexus_tests.py +117 -0
- package/src/tests/test_all_phases.zx +346 -0
- package/src/tests/test_blockchain_features.zx +306 -0
- package/src/tests/test_complexity_features.zx +321 -0
- package/src/tests/test_core_integration.py +185 -0
- package/src/tests/test_phase10_ecosystem.zx +177 -0
- package/src/tests/test_phase1_modifiers.zx +87 -0
- package/src/tests/test_phase2_plugins.zx +80 -0
- package/src/tests/test_phase3_security.zx +97 -0
- package/src/tests/test_phase4_vfs.zx +116 -0
- package/src/tests/test_phase5_types.zx +117 -0
- package/src/tests/test_phase6_metaprogramming.zx +125 -0
- package/src/tests/test_phase7_optimization.zx +132 -0
- package/src/tests/test_phase9_advanced_types.zx +157 -0
- package/src/tests/test_security_features.py +419 -0
- package/src/tests/test_security_features.zx +276 -0
- package/src/tests/test_simple_zx.zx +1 -0
- package/src/tests/test_verification_simple.zx +69 -0
- package/src/zexus/__init__.py +28 -0
- package/src/zexus/__main__.py +5 -0
- package/src/zexus/__pycache__/__init__.cpython-312.pyc +0 -0
- package/src/zexus/__pycache__/advanced_types.cpython-312.pyc +0 -0
- package/src/zexus/__pycache__/builtin_modules.cpython-312.pyc +0 -0
- package/src/zexus/__pycache__/capability_system.cpython-312.pyc +0 -0
- package/src/zexus/__pycache__/complexity_system.cpython-312.pyc +0 -0
- package/src/zexus/__pycache__/concurrency_system.cpython-312.pyc +0 -0
- package/src/zexus/__pycache__/config.cpython-312.pyc +0 -0
- package/src/zexus/__pycache__/dependency_injection.cpython-312.pyc +0 -0
- package/src/zexus/__pycache__/ecosystem.cpython-312.pyc +0 -0
- package/src/zexus/__pycache__/environment.cpython-312.pyc +0 -0
- package/src/zexus/__pycache__/error_reporter.cpython-312.pyc +0 -0
- package/src/zexus/__pycache__/hybrid_orchestrator.cpython-312.pyc +0 -0
- package/src/zexus/__pycache__/lexer.cpython-312.pyc +0 -0
- package/src/zexus/__pycache__/metaprogramming.cpython-312.pyc +0 -0
- package/src/zexus/__pycache__/module_cache.cpython-312.pyc +0 -0
- package/src/zexus/__pycache__/object.cpython-312.pyc +0 -0
- package/src/zexus/__pycache__/optimization.cpython-312.pyc +0 -0
- package/src/zexus/__pycache__/plugin_system.cpython-312.pyc +0 -0
- package/src/zexus/__pycache__/policy_engine.cpython-312.pyc +0 -0
- package/src/zexus/__pycache__/security.cpython-312.pyc +0 -0
- package/src/zexus/__pycache__/stdlib_integration.cpython-312.pyc +0 -0
- package/src/zexus/__pycache__/strategy_recovery.cpython-312.pyc +0 -0
- package/src/zexus/__pycache__/syntax_validator.cpython-312.pyc +0 -0
- package/src/zexus/__pycache__/type_system.cpython-312.pyc +0 -0
- package/src/zexus/__pycache__/virtual_filesystem.cpython-312.pyc +0 -0
- package/src/zexus/__pycache__/zexus_ast.cpython-312.pyc +0 -0
- package/src/zexus/__pycache__/zexus_token.cpython-312.pyc +0 -0
- package/src/zexus/advanced_types.py +401 -0
- package/src/zexus/blockchain/__init__.py +40 -0
- package/src/zexus/blockchain/__pycache__/__init__.cpython-312.pyc +0 -0
- package/src/zexus/blockchain/__pycache__/crypto.cpython-312.pyc +0 -0
- package/src/zexus/blockchain/__pycache__/ledger.cpython-312.pyc +0 -0
- package/src/zexus/blockchain/__pycache__/transaction.cpython-312.pyc +0 -0
- package/src/zexus/blockchain/crypto.py +463 -0
- package/src/zexus/blockchain/ledger.py +255 -0
- package/src/zexus/blockchain/transaction.py +267 -0
- package/src/zexus/builtin_modules.py +284 -0
- package/src/zexus/builtin_plugins.py +317 -0
- package/src/zexus/capability_system.py +372 -0
- package/src/zexus/cli/__init__.py +2 -0
- package/src/zexus/cli/__pycache__/__init__.cpython-312.pyc +0 -0
- package/src/zexus/cli/__pycache__/main.cpython-312.pyc +0 -0
- package/src/zexus/cli/main.py +707 -0
- package/src/zexus/cli/zpm.py +203 -0
- package/src/zexus/compare_interpreter_compiler.py +146 -0
- package/src/zexus/compiler/__init__.py +169 -0
- package/src/zexus/compiler/__pycache__/__init__.cpython-312.pyc +0 -0
- package/src/zexus/compiler/__pycache__/lexer.cpython-312.pyc +0 -0
- package/src/zexus/compiler/__pycache__/parser.cpython-312.pyc +0 -0
- package/src/zexus/compiler/__pycache__/zexus_ast.cpython-312.pyc +0 -0
- package/src/zexus/compiler/bytecode.py +266 -0
- package/src/zexus/compiler/compat_runtime.py +277 -0
- package/src/zexus/compiler/lexer.py +257 -0
- package/src/zexus/compiler/parser.py +779 -0
- package/src/zexus/compiler/semantic.py +118 -0
- package/src/zexus/compiler/zexus_ast.py +454 -0
- package/src/zexus/complexity_system.py +575 -0
- package/src/zexus/concurrency_system.py +493 -0
- package/src/zexus/config.py +201 -0
- package/src/zexus/crypto_bridge.py +19 -0
- package/src/zexus/dependency_injection.py +423 -0
- package/src/zexus/ecosystem.py +434 -0
- package/src/zexus/environment.py +101 -0
- package/src/zexus/environment_manager.py +119 -0
- package/src/zexus/error_reporter.py +314 -0
- package/src/zexus/evaluator/__init__.py +12 -0
- package/src/zexus/evaluator/__pycache__/__init__.cpython-312.pyc +0 -0
- package/src/zexus/evaluator/__pycache__/bytecode_compiler.cpython-312.pyc +0 -0
- package/src/zexus/evaluator/__pycache__/core.cpython-312.pyc +0 -0
- package/src/zexus/evaluator/__pycache__/expressions.cpython-312.pyc +0 -0
- package/src/zexus/evaluator/__pycache__/functions.cpython-312.pyc +0 -0
- package/src/zexus/evaluator/__pycache__/integration.cpython-312.pyc +0 -0
- package/src/zexus/evaluator/__pycache__/statements.cpython-312.pyc +0 -0
- package/src/zexus/evaluator/__pycache__/utils.cpython-312.pyc +0 -0
- package/src/zexus/evaluator/bytecode_compiler.py +700 -0
- package/src/zexus/evaluator/core.py +891 -0
- package/src/zexus/evaluator/expressions.py +827 -0
- package/src/zexus/evaluator/functions.py +3989 -0
- package/src/zexus/evaluator/integration.py +396 -0
- package/src/zexus/evaluator/statements.py +4303 -0
- package/src/zexus/evaluator/utils.py +126 -0
- package/src/zexus/evaluator_original.py +2041 -0
- package/src/zexus/external_bridge.py +16 -0
- package/src/zexus/find_affected_imports.sh +155 -0
- package/src/zexus/hybrid_orchestrator.py +152 -0
- package/src/zexus/input_validation.py +259 -0
- package/src/zexus/lexer.py +571 -0
- package/src/zexus/logging.py +89 -0
- package/src/zexus/lsp/__init__.py +9 -0
- package/src/zexus/lsp/completion_provider.py +207 -0
- package/src/zexus/lsp/definition_provider.py +22 -0
- package/src/zexus/lsp/hover_provider.py +71 -0
- package/src/zexus/lsp/server.py +269 -0
- package/src/zexus/lsp/symbol_provider.py +31 -0
- package/src/zexus/metaprogramming.py +321 -0
- package/src/zexus/module_cache.py +89 -0
- package/src/zexus/module_manager.py +107 -0
- package/src/zexus/object.py +973 -0
- package/src/zexus/optimization.py +424 -0
- package/src/zexus/parser/__init__.py +31 -0
- package/src/zexus/parser/__pycache__/__init__.cpython-312.pyc +0 -0
- package/src/zexus/parser/__pycache__/parser.cpython-312.pyc +0 -0
- package/src/zexus/parser/__pycache__/strategy_context.cpython-312.pyc +0 -0
- package/src/zexus/parser/__pycache__/strategy_structural.cpython-312.pyc +0 -0
- package/src/zexus/parser/integration.py +86 -0
- package/src/zexus/parser/parser.py +3977 -0
- package/src/zexus/parser/strategy_context.py +7254 -0
- package/src/zexus/parser/strategy_structural.py +1033 -0
- package/src/zexus/persistence.py +391 -0
- package/src/zexus/plugin_system.py +290 -0
- package/src/zexus/policy_engine.py +365 -0
- package/src/zexus/profiler/__init__.py +5 -0
- package/src/zexus/profiler/profiler.py +233 -0
- package/src/zexus/purity_system.py +398 -0
- package/src/zexus/runtime/__init__.py +20 -0
- package/src/zexus/runtime/async_runtime.py +324 -0
- package/src/zexus/search_old_imports.sh +65 -0
- package/src/zexus/security.py +1407 -0
- package/src/zexus/stack_trace.py +233 -0
- package/src/zexus/stdlib/__init__.py +27 -0
- package/src/zexus/stdlib/blockchain.py +341 -0
- package/src/zexus/stdlib/compression.py +167 -0
- package/src/zexus/stdlib/crypto.py +124 -0
- package/src/zexus/stdlib/datetime.py +163 -0
- package/src/zexus/stdlib/db_mongo.py +199 -0
- package/src/zexus/stdlib/db_mysql.py +162 -0
- package/src/zexus/stdlib/db_postgres.py +163 -0
- package/src/zexus/stdlib/db_sqlite.py +133 -0
- package/src/zexus/stdlib/encoding.py +230 -0
- package/src/zexus/stdlib/fs.py +195 -0
- package/src/zexus/stdlib/http.py +219 -0
- package/src/zexus/stdlib/http_server.py +248 -0
- package/src/zexus/stdlib/json_module.py +61 -0
- package/src/zexus/stdlib/math.py +360 -0
- package/src/zexus/stdlib/os_module.py +265 -0
- package/src/zexus/stdlib/regex.py +148 -0
- package/src/zexus/stdlib/sockets.py +253 -0
- package/src/zexus/stdlib/test_framework.zx +208 -0
- package/src/zexus/stdlib/test_runner.zx +119 -0
- package/src/zexus/stdlib_integration.py +341 -0
- package/src/zexus/strategy_recovery.py +256 -0
- package/src/zexus/syntax_validator.py +356 -0
- package/src/zexus/testing/zpics.py +407 -0
- package/src/zexus/testing/zpics_runtime.py +369 -0
- package/src/zexus/type_system.py +374 -0
- package/src/zexus/validation_system.py +569 -0
- package/src/zexus/virtual_filesystem.py +355 -0
- package/src/zexus/vm/__init__.py +8 -0
- package/src/zexus/vm/__pycache__/__init__.cpython-312.pyc +0 -0
- package/src/zexus/vm/__pycache__/async_optimizer.cpython-312.pyc +0 -0
- package/src/zexus/vm/__pycache__/bytecode.cpython-312.pyc +0 -0
- package/src/zexus/vm/__pycache__/cache.cpython-312.pyc +0 -0
- package/src/zexus/vm/__pycache__/jit.cpython-312.pyc +0 -0
- package/src/zexus/vm/__pycache__/memory_manager.cpython-312.pyc +0 -0
- package/src/zexus/vm/__pycache__/memory_pool.cpython-312.pyc +0 -0
- package/src/zexus/vm/__pycache__/optimizer.cpython-312.pyc +0 -0
- package/src/zexus/vm/__pycache__/parallel_vm.cpython-312.pyc +0 -0
- package/src/zexus/vm/__pycache__/peephole_optimizer.cpython-312.pyc +0 -0
- package/src/zexus/vm/__pycache__/profiler.cpython-312.pyc +0 -0
- package/src/zexus/vm/__pycache__/register_allocator.cpython-312.pyc +0 -0
- package/src/zexus/vm/__pycache__/register_vm.cpython-312.pyc +0 -0
- package/src/zexus/vm/__pycache__/ssa_converter.cpython-312.pyc +0 -0
- package/src/zexus/vm/__pycache__/vm.cpython-312.pyc +0 -0
- package/src/zexus/vm/async_optimizer.py +420 -0
- package/src/zexus/vm/bytecode.py +428 -0
- package/src/zexus/vm/bytecode_converter.py +297 -0
- package/src/zexus/vm/cache.py +532 -0
- package/src/zexus/vm/jit.py +720 -0
- package/src/zexus/vm/memory_manager.py +520 -0
- package/src/zexus/vm/memory_pool.py +511 -0
- package/src/zexus/vm/optimizer.py +478 -0
- package/src/zexus/vm/parallel_vm.py +899 -0
- package/src/zexus/vm/peephole_optimizer.py +452 -0
- package/src/zexus/vm/profiler.py +527 -0
- package/src/zexus/vm/register_allocator.py +462 -0
- package/src/zexus/vm/register_vm.py +520 -0
- package/src/zexus/vm/ssa_converter.py +757 -0
- package/src/zexus/vm/vm.py +1392 -0
- package/src/zexus/zexus_ast.py +1782 -0
- package/src/zexus/zexus_token.py +253 -0
- package/src/zexus/zpm/__init__.py +15 -0
- package/src/zexus/zpm/installer.py +116 -0
- package/src/zexus/zpm/package_manager.py +208 -0
- package/src/zexus/zpm/publisher.py +98 -0
- package/src/zexus/zpm/registry.py +110 -0
- package/src/zexus.egg-info/PKG-INFO +2235 -0
- package/src/zexus.egg-info/SOURCES.txt +876 -0
- package/src/zexus.egg-info/dependency_links.txt +1 -0
- package/src/zexus.egg-info/entry_points.txt +3 -0
- package/src/zexus.egg-info/not-zip-safe +1 -0
- package/src/zexus.egg-info/requires.txt +14 -0
- package/src/zexus.egg-info/top_level.txt +2 -0
- package/zexus.json +14 -0
|
@@ -0,0 +1,891 @@
|
|
|
1
|
+
# src/zexus/evaluator/core.py
|
|
2
|
+
import traceback
|
|
3
|
+
import asyncio
|
|
4
|
+
from .. import zexus_ast
|
|
5
|
+
from ..object import Environment, EvaluationError, Null, Boolean as BooleanObj, Map, EmbeddedCode, List, Action, LambdaFunction, String
|
|
6
|
+
from .utils import is_error, debug_log, EVAL_SUMMARY, NULL
|
|
7
|
+
from .expressions import ExpressionEvaluatorMixin
|
|
8
|
+
from .statements import StatementEvaluatorMixin
|
|
9
|
+
from .functions import FunctionEvaluatorMixin
|
|
10
|
+
from .integration import EvaluationContext, get_integration
|
|
11
|
+
|
|
12
|
+
# Import VM and bytecode compiler
|
|
13
|
+
try:
|
|
14
|
+
from ..vm.vm import VM
|
|
15
|
+
from .bytecode_compiler import EvaluatorBytecodeCompiler, should_use_vm_for_node
|
|
16
|
+
VM_AVAILABLE = True
|
|
17
|
+
except ImportError as e:
|
|
18
|
+
VM_AVAILABLE = False
|
|
19
|
+
VM = None
|
|
20
|
+
EvaluatorBytecodeCompiler = None
|
|
21
|
+
should_use_vm_for_node = lambda node: False
|
|
22
|
+
print(f"⚠️ VM not available in evaluator: {e}")
|
|
23
|
+
|
|
24
|
+
class Evaluator(ExpressionEvaluatorMixin, StatementEvaluatorMixin, FunctionEvaluatorMixin):
|
|
25
|
+
def __init__(self, trusted: bool = False, use_vm: bool = True):
|
|
26
|
+
# Initialize mixins (FunctionEvaluatorMixin sets up builtins)
|
|
27
|
+
FunctionEvaluatorMixin.__init__(self)
|
|
28
|
+
|
|
29
|
+
# Initialize 10-phase integration
|
|
30
|
+
self.integration_context = EvaluationContext("evaluator")
|
|
31
|
+
|
|
32
|
+
# Setup security context
|
|
33
|
+
if trusted:
|
|
34
|
+
self.integration_context.setup_for_trusted_code()
|
|
35
|
+
else:
|
|
36
|
+
self.integration_context.setup_for_untrusted_code()
|
|
37
|
+
|
|
38
|
+
# VM integration
|
|
39
|
+
self.use_vm = use_vm and VM_AVAILABLE
|
|
40
|
+
self.vm_instance = None
|
|
41
|
+
self.bytecode_compiler = None
|
|
42
|
+
|
|
43
|
+
# VM execution statistics
|
|
44
|
+
self.vm_stats = {
|
|
45
|
+
'bytecode_compiles': 0,
|
|
46
|
+
'vm_executions': 0,
|
|
47
|
+
'vm_fallbacks': 0,
|
|
48
|
+
'direct_evals': 0
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
# CONTINUE keyword support - error recovery mode
|
|
52
|
+
self.continue_on_error = False
|
|
53
|
+
self.error_log = [] # Store errors when continue_on_error is enabled
|
|
54
|
+
|
|
55
|
+
if self.use_vm and VM_AVAILABLE:
|
|
56
|
+
self._initialize_vm()
|
|
57
|
+
|
|
58
|
+
def eval_node(self, node, env, stack_trace=None):
|
|
59
|
+
if node is None:
|
|
60
|
+
debug_log("eval_node", "Node is None, returning NULL")
|
|
61
|
+
return NULL
|
|
62
|
+
|
|
63
|
+
stack_trace = stack_trace or []
|
|
64
|
+
node_type = type(node)
|
|
65
|
+
|
|
66
|
+
# Add to stack trace for better error reporting
|
|
67
|
+
current_frame = f" at {node_type.__name__}"
|
|
68
|
+
if hasattr(node, 'token') and node.token:
|
|
69
|
+
current_frame += f" (line {node.token.line})"
|
|
70
|
+
stack_trace.append(current_frame)
|
|
71
|
+
|
|
72
|
+
debug_log("eval_node", f"Processing {node_type.__name__}")
|
|
73
|
+
|
|
74
|
+
try:
|
|
75
|
+
# === STATEMENTS ===
|
|
76
|
+
if isinstance(node, zexus_ast.Program):
|
|
77
|
+
debug_log(" Program node", f"{len(node.statements)} statements")
|
|
78
|
+
return self.ceval_program(node.statements, env)
|
|
79
|
+
|
|
80
|
+
elif isinstance(node, zexus_ast.ExpressionStatement):
|
|
81
|
+
debug_log(" ExpressionStatement node")
|
|
82
|
+
return self.eval_node(node.expression, env, stack_trace)
|
|
83
|
+
|
|
84
|
+
elif isinstance(node, zexus_ast.BlockStatement):
|
|
85
|
+
debug_log(" BlockStatement node", f"{len(node.statements)} statements")
|
|
86
|
+
return self.eval_block_statement(node, env, stack_trace)
|
|
87
|
+
|
|
88
|
+
elif isinstance(node, zexus_ast.ReturnStatement):
|
|
89
|
+
debug_log(" ReturnStatement node")
|
|
90
|
+
return self.eval_return_statement(node, env, stack_trace)
|
|
91
|
+
|
|
92
|
+
elif isinstance(node, zexus_ast.ContinueStatement):
|
|
93
|
+
debug_log(" ContinueStatement node")
|
|
94
|
+
return self.eval_continue_statement(node, env, stack_trace)
|
|
95
|
+
|
|
96
|
+
elif isinstance(node, zexus_ast.BreakStatement):
|
|
97
|
+
debug_log(" BreakStatement node")
|
|
98
|
+
return self.eval_break_statement(node, env, stack_trace)
|
|
99
|
+
|
|
100
|
+
elif isinstance(node, zexus_ast.LetStatement):
|
|
101
|
+
return self.eval_let_statement(node, env, stack_trace)
|
|
102
|
+
|
|
103
|
+
elif isinstance(node, zexus_ast.ConstStatement):
|
|
104
|
+
return self.eval_const_statement(node, env, stack_trace)
|
|
105
|
+
|
|
106
|
+
elif isinstance(node, zexus_ast.DataStatement):
|
|
107
|
+
return self.eval_data_statement(node, env, stack_trace)
|
|
108
|
+
|
|
109
|
+
elif isinstance(node, zexus_ast.AssignmentExpression):
|
|
110
|
+
debug_log(" AssignmentExpression node")
|
|
111
|
+
return self.eval_assignment_expression(node, env, stack_trace)
|
|
112
|
+
|
|
113
|
+
elif isinstance(node, zexus_ast.TryCatchStatement):
|
|
114
|
+
return self.eval_try_catch_statement(node, env, stack_trace)
|
|
115
|
+
|
|
116
|
+
elif isinstance(node, zexus_ast.ThrowStatement):
|
|
117
|
+
debug_log(" ThrowStatement node")
|
|
118
|
+
return self.eval_throw_statement(node, env, stack_trace)
|
|
119
|
+
|
|
120
|
+
elif isinstance(node, zexus_ast.IfStatement):
|
|
121
|
+
debug_log(" IfStatement node")
|
|
122
|
+
return self.eval_if_statement(node, env, stack_trace)
|
|
123
|
+
|
|
124
|
+
elif isinstance(node, zexus_ast.WhileStatement):
|
|
125
|
+
debug_log(" WhileStatement node")
|
|
126
|
+
return self.eval_while_statement(node, env, stack_trace)
|
|
127
|
+
|
|
128
|
+
elif isinstance(node, zexus_ast.ForEachStatement):
|
|
129
|
+
debug_log(" ForEachStatement node", f"for each {node.item.value}")
|
|
130
|
+
return self.eval_foreach_statement(node, env, stack_trace)
|
|
131
|
+
|
|
132
|
+
elif isinstance(node, zexus_ast.WatchStatement):
|
|
133
|
+
debug_log(" WatchStatement node")
|
|
134
|
+
return self.eval_watch_statement(node, env, stack_trace)
|
|
135
|
+
|
|
136
|
+
elif isinstance(node, zexus_ast.SealStatement):
|
|
137
|
+
return self.eval_seal_statement(node, env, stack_trace)
|
|
138
|
+
|
|
139
|
+
elif isinstance(node, zexus_ast.RestrictStatement):
|
|
140
|
+
return self.eval_restrict_statement(node, env, stack_trace)
|
|
141
|
+
|
|
142
|
+
elif isinstance(node, zexus_ast.SandboxStatement):
|
|
143
|
+
return self.eval_sandbox_statement(node, env, stack_trace)
|
|
144
|
+
|
|
145
|
+
elif isinstance(node, zexus_ast.TrailStatement):
|
|
146
|
+
return self.eval_trail_statement(node, env, stack_trace)
|
|
147
|
+
|
|
148
|
+
elif isinstance(node, zexus_ast.TxStatement):
|
|
149
|
+
return self.eval_tx_statement(node, env, stack_trace)
|
|
150
|
+
|
|
151
|
+
elif isinstance(node, zexus_ast.EntityStatement):
|
|
152
|
+
return self.eval_entity_statement(node, env, stack_trace)
|
|
153
|
+
|
|
154
|
+
elif isinstance(node, zexus_ast.ContractStatement):
|
|
155
|
+
return self.eval_contract_statement(node, env, stack_trace)
|
|
156
|
+
|
|
157
|
+
elif isinstance(node, zexus_ast.ExportStatement):
|
|
158
|
+
return self.eval_export_statement(node, env, stack_trace)
|
|
159
|
+
|
|
160
|
+
elif isinstance(node, zexus_ast.UseStatement):
|
|
161
|
+
debug_log(" UseStatement node", node.file_path)
|
|
162
|
+
return self.eval_use_statement(node, env, stack_trace)
|
|
163
|
+
|
|
164
|
+
elif isinstance(node, zexus_ast.FromStatement):
|
|
165
|
+
debug_log(" FromStatement node", node.file_path)
|
|
166
|
+
return self.eval_from_statement(node, env, stack_trace)
|
|
167
|
+
|
|
168
|
+
elif isinstance(node, zexus_ast.VerifyStatement):
|
|
169
|
+
return self.eval_verify_statement(node, env, stack_trace)
|
|
170
|
+
|
|
171
|
+
elif isinstance(node, zexus_ast.ProtectStatement):
|
|
172
|
+
return self.eval_protect_statement(node, env, stack_trace)
|
|
173
|
+
|
|
174
|
+
elif isinstance(node, zexus_ast.MiddlewareStatement):
|
|
175
|
+
return self.eval_middleware_statement(node, env, stack_trace)
|
|
176
|
+
|
|
177
|
+
elif isinstance(node, zexus_ast.AuthStatement):
|
|
178
|
+
return self.eval_auth_statement(node, env, stack_trace)
|
|
179
|
+
|
|
180
|
+
elif isinstance(node, zexus_ast.ThrottleStatement):
|
|
181
|
+
return self.eval_throttle_statement(node, env, stack_trace)
|
|
182
|
+
|
|
183
|
+
elif isinstance(node, zexus_ast.CacheStatement):
|
|
184
|
+
return self.eval_cache_statement(node, env, stack_trace)
|
|
185
|
+
|
|
186
|
+
elif isinstance(node, zexus_ast.PrintStatement):
|
|
187
|
+
debug_log(" PrintStatement node")
|
|
188
|
+
return self.eval_print_statement(node, env, stack_trace)
|
|
189
|
+
|
|
190
|
+
elif isinstance(node, zexus_ast.ScreenStatement):
|
|
191
|
+
debug_log(" ScreenStatement node", node.name.value)
|
|
192
|
+
return self.eval_screen_statement(node, env, stack_trace)
|
|
193
|
+
|
|
194
|
+
elif isinstance(node, zexus_ast.EmbeddedCodeStatement):
|
|
195
|
+
debug_log(" EmbeddedCodeStatement node", node.name.value)
|
|
196
|
+
return self.eval_embedded_code_statement(node, env, stack_trace)
|
|
197
|
+
|
|
198
|
+
elif isinstance(node, zexus_ast.ComponentStatement):
|
|
199
|
+
debug_log(" ComponentStatement node", node.name.value)
|
|
200
|
+
return self.eval_component_statement(node, env, stack_trace)
|
|
201
|
+
|
|
202
|
+
elif isinstance(node, zexus_ast.ThemeStatement):
|
|
203
|
+
debug_log(" ThemeStatement node", node.name.value)
|
|
204
|
+
return self.eval_theme_statement(node, env, stack_trace)
|
|
205
|
+
|
|
206
|
+
elif isinstance(node, zexus_ast.DebugStatement):
|
|
207
|
+
debug_log(" DebugStatement node")
|
|
208
|
+
return self.eval_debug_statement(node, env, stack_trace)
|
|
209
|
+
|
|
210
|
+
elif isinstance(node, zexus_ast.ExternalDeclaration):
|
|
211
|
+
debug_log(" ExternalDeclaration node", node.name.value)
|
|
212
|
+
return self.eval_external_declaration(node, env, stack_trace)
|
|
213
|
+
|
|
214
|
+
elif isinstance(node, zexus_ast.ExactlyStatement):
|
|
215
|
+
debug_log(" ExactlyStatement node")
|
|
216
|
+
return self.eval_exactly_statement(node, env, stack_trace)
|
|
217
|
+
|
|
218
|
+
elif isinstance(node, zexus_ast.ActionStatement):
|
|
219
|
+
debug_log(" ActionStatement node", f"action {node.name.value}")
|
|
220
|
+
return self.eval_action_statement(node, env, stack_trace)
|
|
221
|
+
|
|
222
|
+
elif isinstance(node, zexus_ast.FunctionStatement):
|
|
223
|
+
debug_log(" FunctionStatement node", f"function {node.name.value}")
|
|
224
|
+
print(f"[CORE] Evaluating FunctionStatement: {node.name.value}, modifiers: {getattr(node, 'modifiers', [])}", flush=True)
|
|
225
|
+
result = self.eval_function_statement(node, env, stack_trace)
|
|
226
|
+
print(f"[CORE] FunctionStatement result: {result}", flush=True)
|
|
227
|
+
return result
|
|
228
|
+
|
|
229
|
+
elif isinstance(node, zexus_ast.NativeStatement):
|
|
230
|
+
debug_log(" NativeStatement node", f"native {node.function_name}")
|
|
231
|
+
return self.eval_native_statement(node, env, stack_trace)
|
|
232
|
+
|
|
233
|
+
elif isinstance(node, zexus_ast.GCStatement):
|
|
234
|
+
debug_log(" GCStatement node", f"gc {node.action}")
|
|
235
|
+
return self.eval_gc_statement(node, env, stack_trace)
|
|
236
|
+
|
|
237
|
+
elif isinstance(node, zexus_ast.InlineStatement):
|
|
238
|
+
debug_log(" InlineStatement node", f"inline {node.function_name}")
|
|
239
|
+
return self.eval_inline_statement(node, env, stack_trace)
|
|
240
|
+
|
|
241
|
+
elif isinstance(node, zexus_ast.BufferStatement):
|
|
242
|
+
debug_log(" BufferStatement node", f"buffer {node.buffer_name}")
|
|
243
|
+
return self.eval_buffer_statement(node, env, stack_trace)
|
|
244
|
+
|
|
245
|
+
elif isinstance(node, zexus_ast.SIMDStatement):
|
|
246
|
+
debug_log(" SIMDStatement node")
|
|
247
|
+
return self.eval_simd_statement(node, env, stack_trace)
|
|
248
|
+
|
|
249
|
+
elif isinstance(node, zexus_ast.DeferStatement):
|
|
250
|
+
debug_log(" DeferStatement node")
|
|
251
|
+
return self.eval_defer_statement(node, env, stack_trace)
|
|
252
|
+
|
|
253
|
+
elif isinstance(node, zexus_ast.PatternStatement):
|
|
254
|
+
debug_log(" PatternStatement node")
|
|
255
|
+
return self.eval_pattern_statement(node, env, stack_trace)
|
|
256
|
+
|
|
257
|
+
elif isinstance(node, zexus_ast.EnumStatement):
|
|
258
|
+
debug_log(" EnumStatement node", f"enum {node.name}")
|
|
259
|
+
return self.eval_enum_statement(node, env, stack_trace)
|
|
260
|
+
|
|
261
|
+
elif isinstance(node, zexus_ast.StreamStatement):
|
|
262
|
+
debug_log(" StreamStatement node", f"stream {node.stream_name}")
|
|
263
|
+
return self.eval_stream_statement(node, env, stack_trace)
|
|
264
|
+
|
|
265
|
+
elif isinstance(node, zexus_ast.WatchStatement):
|
|
266
|
+
debug_log(" WatchStatement node")
|
|
267
|
+
return self.eval_watch_statement(node, env, stack_trace)
|
|
268
|
+
|
|
269
|
+
elif isinstance(node, zexus_ast.LogStatement):
|
|
270
|
+
debug_log(" LogStatement node")
|
|
271
|
+
return self.eval_log_statement(node, env, stack_trace)
|
|
272
|
+
|
|
273
|
+
elif isinstance(node, zexus_ast.ImportLogStatement):
|
|
274
|
+
debug_log(" ImportLogStatement node", "log <<")
|
|
275
|
+
return self.eval_import_log_statement(node, env, stack_trace)
|
|
276
|
+
|
|
277
|
+
# === NEW SECURITY STATEMENTS ===
|
|
278
|
+
elif isinstance(node, zexus_ast.CapabilityStatement):
|
|
279
|
+
debug_log(" CapabilityStatement node", f"capability {node.name}")
|
|
280
|
+
return self.eval_capability_statement(node, env, stack_trace)
|
|
281
|
+
|
|
282
|
+
elif isinstance(node, zexus_ast.GrantStatement):
|
|
283
|
+
debug_log(" GrantStatement node", f"grant {node.entity_name}")
|
|
284
|
+
return self.eval_grant_statement(node, env, stack_trace)
|
|
285
|
+
|
|
286
|
+
elif isinstance(node, zexus_ast.RevokeStatement):
|
|
287
|
+
debug_log(" RevokeStatement node", f"revoke {node.entity_name}")
|
|
288
|
+
return self.eval_revoke_statement(node, env, stack_trace)
|
|
289
|
+
|
|
290
|
+
elif isinstance(node, zexus_ast.ValidateStatement):
|
|
291
|
+
debug_log(" ValidateStatement node")
|
|
292
|
+
return self.eval_validate_statement(node, env, stack_trace)
|
|
293
|
+
|
|
294
|
+
elif isinstance(node, zexus_ast.SanitizeStatement):
|
|
295
|
+
debug_log(" SanitizeStatement node")
|
|
296
|
+
return self.eval_sanitize_statement(node, env, stack_trace)
|
|
297
|
+
|
|
298
|
+
elif isinstance(node, zexus_ast.InjectStatement):
|
|
299
|
+
debug_log(" InjectStatement node")
|
|
300
|
+
return self.eval_inject_statement(node, env, stack_trace)
|
|
301
|
+
|
|
302
|
+
elif isinstance(node, zexus_ast.ImmutableStatement):
|
|
303
|
+
debug_log(" ImmutableStatement node", f"immutable {node.target}")
|
|
304
|
+
return self.eval_immutable_statement(node, env, stack_trace)
|
|
305
|
+
|
|
306
|
+
# === COMPLEXITY & LARGE PROJECT MANAGEMENT STATEMENTS ===
|
|
307
|
+
elif isinstance(node, zexus_ast.InterfaceStatement):
|
|
308
|
+
debug_log(" InterfaceStatement node", f"interface {node.name.value}")
|
|
309
|
+
return self.eval_interface_statement(node, env, stack_trace)
|
|
310
|
+
|
|
311
|
+
elif isinstance(node, zexus_ast.TypeAliasStatement):
|
|
312
|
+
debug_log(" TypeAliasStatement node", f"type_alias {node.name.value}")
|
|
313
|
+
return self.eval_type_alias_statement(node, env, stack_trace)
|
|
314
|
+
|
|
315
|
+
elif isinstance(node, zexus_ast.ModuleStatement):
|
|
316
|
+
debug_log(" ModuleStatement node", f"module {node.name.value}")
|
|
317
|
+
return self.eval_module_statement(node, env, stack_trace)
|
|
318
|
+
|
|
319
|
+
elif isinstance(node, zexus_ast.PackageStatement):
|
|
320
|
+
debug_log(" PackageStatement node", f"package {node.name.value}")
|
|
321
|
+
return self.eval_package_statement(node, env, stack_trace)
|
|
322
|
+
|
|
323
|
+
elif isinstance(node, zexus_ast.UsingStatement):
|
|
324
|
+
debug_log(" UsingStatement node", f"using {node.resource_name.value}")
|
|
325
|
+
return self.eval_using_statement(node, env, stack_trace)
|
|
326
|
+
|
|
327
|
+
# === EXPRESSIONS ===
|
|
328
|
+
# === CONCURRENCY & PERFORMANCE STATEMENTS ===
|
|
329
|
+
elif isinstance(node, zexus_ast.ChannelStatement):
|
|
330
|
+
debug_log(" ChannelStatement node", f"channel {node.name.value}")
|
|
331
|
+
return self.eval_channel_statement(node, env, stack_trace)
|
|
332
|
+
|
|
333
|
+
elif isinstance(node, zexus_ast.SendStatement):
|
|
334
|
+
debug_log(" SendStatement node", "send to channel")
|
|
335
|
+
return self.eval_send_statement(node, env, stack_trace)
|
|
336
|
+
|
|
337
|
+
elif isinstance(node, zexus_ast.ReceiveStatement):
|
|
338
|
+
debug_log(" ReceiveStatement node", "receive from channel")
|
|
339
|
+
return self.eval_receive_statement(node, env, stack_trace)
|
|
340
|
+
|
|
341
|
+
elif isinstance(node, zexus_ast.AtomicStatement):
|
|
342
|
+
debug_log(" AtomicStatement node", "atomic operation")
|
|
343
|
+
return self.eval_atomic_statement(node, env, stack_trace)
|
|
344
|
+
|
|
345
|
+
# === BLOCKCHAIN STATEMENTS ===
|
|
346
|
+
elif isinstance(node, zexus_ast.LedgerStatement):
|
|
347
|
+
debug_log(" LedgerStatement node", f"ledger {node.name.value}")
|
|
348
|
+
return self.eval_ledger_statement(node, env, stack_trace)
|
|
349
|
+
|
|
350
|
+
elif isinstance(node, zexus_ast.StateStatement):
|
|
351
|
+
debug_log(" StateStatement node", f"state {node.name.value}")
|
|
352
|
+
return self.eval_state_statement(node, env, stack_trace)
|
|
353
|
+
|
|
354
|
+
elif isinstance(node, zexus_ast.RequireStatement):
|
|
355
|
+
debug_log(" RequireStatement node", "require condition")
|
|
356
|
+
return self.eval_require_statement(node, env, stack_trace)
|
|
357
|
+
|
|
358
|
+
elif isinstance(node, zexus_ast.RevertStatement):
|
|
359
|
+
debug_log(" RevertStatement node", "revert transaction")
|
|
360
|
+
return self.eval_revert_statement(node, env, stack_trace)
|
|
361
|
+
|
|
362
|
+
elif isinstance(node, zexus_ast.LimitStatement):
|
|
363
|
+
debug_log(" LimitStatement node", "set gas limit")
|
|
364
|
+
return self.eval_limit_statement(node, env, stack_trace)
|
|
365
|
+
|
|
366
|
+
elif isinstance(node, zexus_ast.ProtocolStatement):
|
|
367
|
+
debug_log(" ProtocolStatement node", f"protocol {node.name}")
|
|
368
|
+
return self.eval_protocol_statement(node, env, stack_trace)
|
|
369
|
+
|
|
370
|
+
elif isinstance(node, zexus_ast.PersistentStatement):
|
|
371
|
+
debug_log(" PersistentStatement node", f"persistent {node.name}")
|
|
372
|
+
return self.eval_persistent_statement(node, env, stack_trace)
|
|
373
|
+
|
|
374
|
+
elif isinstance(node, zexus_ast.EmitStatement):
|
|
375
|
+
debug_log(" EmitStatement node", f"emit {node.event_name}")
|
|
376
|
+
return self.eval_emit_statement(node, env, stack_trace)
|
|
377
|
+
|
|
378
|
+
elif isinstance(node, zexus_ast.ModifierDeclaration):
|
|
379
|
+
debug_log(" ModifierDeclaration node", f"modifier {node.name}")
|
|
380
|
+
return self.eval_modifier_declaration(node, env, stack_trace)
|
|
381
|
+
|
|
382
|
+
# === EXPRESSIONS ===
|
|
383
|
+
elif isinstance(node, zexus_ast.Identifier):
|
|
384
|
+
debug_log(" Identifier node", node.value)
|
|
385
|
+
return self.eval_identifier(node, env)
|
|
386
|
+
|
|
387
|
+
elif isinstance(node, zexus_ast.IntegerLiteral):
|
|
388
|
+
debug_log(" IntegerLiteral node", node.value)
|
|
389
|
+
from ..object import Integer
|
|
390
|
+
return Integer(node.value)
|
|
391
|
+
|
|
392
|
+
elif node_type == zexus_ast.FloatLiteral or isinstance(node, zexus_ast.FloatLiteral):
|
|
393
|
+
debug_log(" FloatLiteral node", getattr(node, 'value', 'unknown'))
|
|
394
|
+
from ..object import Float
|
|
395
|
+
try:
|
|
396
|
+
val = getattr(node, 'value', None)
|
|
397
|
+
return Float(val)
|
|
398
|
+
except Exception:
|
|
399
|
+
return EvaluationError(f"Invalid float literal: {getattr(node, 'value', None)}")
|
|
400
|
+
|
|
401
|
+
elif isinstance(node, zexus_ast.StringLiteral):
|
|
402
|
+
debug_log(" StringLiteral node", node.value)
|
|
403
|
+
from ..object import String
|
|
404
|
+
# Process escape sequences in the string
|
|
405
|
+
value = node.value
|
|
406
|
+
value = value.replace('\\n', '\n')
|
|
407
|
+
value = value.replace('\\t', '\t')
|
|
408
|
+
value = value.replace('\\r', '\r')
|
|
409
|
+
value = value.replace('\\\\', '\\')
|
|
410
|
+
value = value.replace('\\"', '"')
|
|
411
|
+
value = value.replace("\\'", "'")
|
|
412
|
+
return String(value)
|
|
413
|
+
|
|
414
|
+
elif isinstance(node, zexus_ast.Boolean):
|
|
415
|
+
debug_log(" Boolean node", f"value: {node.value}")
|
|
416
|
+
from ..object import Boolean
|
|
417
|
+
return Boolean(node.value)
|
|
418
|
+
|
|
419
|
+
elif isinstance(node, zexus_ast.NullLiteral):
|
|
420
|
+
debug_log(" NullLiteral node")
|
|
421
|
+
return NULL
|
|
422
|
+
|
|
423
|
+
elif isinstance(node, zexus_ast.ThisExpression):
|
|
424
|
+
debug_log(" ThisExpression node")
|
|
425
|
+
return self.eval_this_expression(node, env, stack_trace)
|
|
426
|
+
|
|
427
|
+
elif isinstance(node, zexus_ast.InfixExpression):
|
|
428
|
+
debug_log(" InfixExpression node", f"{node.left} {node.operator} {node.right}")
|
|
429
|
+
return self.eval_infix_expression(node, env, stack_trace)
|
|
430
|
+
|
|
431
|
+
elif isinstance(node, zexus_ast.PrefixExpression):
|
|
432
|
+
debug_log(" PrefixExpression node", f"{node.operator} {node.right}")
|
|
433
|
+
return self.eval_prefix_expression(node, env, stack_trace)
|
|
434
|
+
|
|
435
|
+
elif isinstance(node, zexus_ast.IfExpression):
|
|
436
|
+
debug_log(" IfExpression node")
|
|
437
|
+
return self.eval_if_expression(node, env, stack_trace)
|
|
438
|
+
|
|
439
|
+
elif isinstance(node, zexus_ast.TernaryExpression):
|
|
440
|
+
debug_log(" TernaryExpression node")
|
|
441
|
+
return self.eval_ternary_expression(node, env, stack_trace)
|
|
442
|
+
|
|
443
|
+
elif isinstance(node, zexus_ast.NullishExpression):
|
|
444
|
+
debug_log(" NullishExpression node")
|
|
445
|
+
return self.eval_nullish_expression(node, env, stack_trace)
|
|
446
|
+
|
|
447
|
+
elif isinstance(node, zexus_ast.AwaitExpression):
|
|
448
|
+
debug_log(" AwaitExpression node")
|
|
449
|
+
return self.eval_await_expression(node, env, stack_trace)
|
|
450
|
+
|
|
451
|
+
elif isinstance(node, zexus_ast.FileImportExpression):
|
|
452
|
+
debug_log(" FileImportExpression node", "<< file import")
|
|
453
|
+
return self.eval_file_import_expression(node, env, stack_trace)
|
|
454
|
+
|
|
455
|
+
elif isinstance(node, zexus_ast.MethodCallExpression):
|
|
456
|
+
debug_log(" MethodCallExpression node", f"{node.object}.{node.method}")
|
|
457
|
+
return self.eval_method_call_expression(node, env, stack_trace)
|
|
458
|
+
|
|
459
|
+
elif isinstance(node, zexus_ast.CallExpression):
|
|
460
|
+
debug_log("🚀 CallExpression node", f"Calling {node.function}")
|
|
461
|
+
return self.eval_call_expression(node, env, stack_trace)
|
|
462
|
+
|
|
463
|
+
elif isinstance(node, zexus_ast.AsyncExpression):
|
|
464
|
+
debug_log("⚡ AsyncExpression node", f"Async execution of {node.expression}")
|
|
465
|
+
return self.eval_async_expression(node, env, stack_trace)
|
|
466
|
+
|
|
467
|
+
elif isinstance(node, zexus_ast.MatchExpression):
|
|
468
|
+
debug_log("🎯 MatchExpression node", "Pattern matching")
|
|
469
|
+
return self.eval_match_expression(node, env, stack_trace)
|
|
470
|
+
|
|
471
|
+
elif isinstance(node, zexus_ast.ListLiteral):
|
|
472
|
+
debug_log(" ListLiteral node", f"{len(node.elements)} elements")
|
|
473
|
+
elems = self.eval_expressions(node.elements, env)
|
|
474
|
+
if is_error(elems):
|
|
475
|
+
return elems
|
|
476
|
+
return List(elems)
|
|
477
|
+
|
|
478
|
+
elif isinstance(node, zexus_ast.MapLiteral):
|
|
479
|
+
debug_log(" MapLiteral node", f"{len(node.pairs)} pairs")
|
|
480
|
+
pairs = {}
|
|
481
|
+
for k, v in node.pairs:
|
|
482
|
+
# If the key is a bare identifier (e.g. io.read) treat it as a string key
|
|
483
|
+
if isinstance(k, zexus_ast.Identifier):
|
|
484
|
+
key_str = k.value
|
|
485
|
+
else:
|
|
486
|
+
key = self.eval_node(k, env, stack_trace)
|
|
487
|
+
if is_error(key):
|
|
488
|
+
return key
|
|
489
|
+
key_str = key.inspect()
|
|
490
|
+
|
|
491
|
+
val = self.eval_node(v, env, stack_trace)
|
|
492
|
+
if is_error(val):
|
|
493
|
+
return val
|
|
494
|
+
pairs[key_str] = val
|
|
495
|
+
return Map(pairs)
|
|
496
|
+
|
|
497
|
+
elif isinstance(node, zexus_ast.ActionLiteral):
|
|
498
|
+
debug_log(" ActionLiteral node")
|
|
499
|
+
return Action(node.parameters, node.body, env)
|
|
500
|
+
|
|
501
|
+
elif isinstance(node, zexus_ast.LambdaExpression):
|
|
502
|
+
debug_log(" LambdaExpression node")
|
|
503
|
+
return LambdaFunction(node.parameters, node.body, env)
|
|
504
|
+
|
|
505
|
+
elif isinstance(node, zexus_ast.EmbeddedLiteral):
|
|
506
|
+
debug_log(" EmbeddedLiteral node")
|
|
507
|
+
return EmbeddedCode("embedded_block", node.language, node.code)
|
|
508
|
+
|
|
509
|
+
elif isinstance(node, zexus_ast.PropertyAccessExpression):
|
|
510
|
+
debug_log(" PropertyAccessExpression node", f"{node.object}.{node.property}")
|
|
511
|
+
obj = self.eval_node(node.object, env, stack_trace)
|
|
512
|
+
if is_error(obj):
|
|
513
|
+
return obj
|
|
514
|
+
|
|
515
|
+
# Safely extract property name - property can be Identifier, IntegerLiteral, or other expression
|
|
516
|
+
# IMPORTANT: For Identifier nodes in index expressions (arr[i]), we need to evaluate them first!
|
|
517
|
+
if isinstance(node.property, zexus_ast.Identifier):
|
|
518
|
+
# This could be either a property name (obj.prop) or an index variable (arr[i])
|
|
519
|
+
# We need to check if it's being used as an index (numeric) or property (string)
|
|
520
|
+
# First try to evaluate it as an identifier (variable lookup)
|
|
521
|
+
prop_result = self.eval_identifier(node.property, env)
|
|
522
|
+
if not is_error(prop_result) and not isinstance(prop_result, type(NULL)):
|
|
523
|
+
# Successfully found a variable, use its value as the property/index
|
|
524
|
+
property_name = prop_result.value if hasattr(prop_result, 'value') else str(prop_result)
|
|
525
|
+
else:
|
|
526
|
+
# Not found as variable, treat as literal property name (for obj.prop syntax)
|
|
527
|
+
property_name = node.property.value
|
|
528
|
+
elif isinstance(node.property, zexus_ast.IntegerLiteral):
|
|
529
|
+
# Direct integer index like arr[0]
|
|
530
|
+
property_name = node.property.value
|
|
531
|
+
elif isinstance(node.property, zexus_ast.PropertyAccessExpression):
|
|
532
|
+
# Nested property access - evaluate it
|
|
533
|
+
prop_result = self.eval_node(node.property, env, stack_trace)
|
|
534
|
+
if is_error(prop_result):
|
|
535
|
+
return prop_result
|
|
536
|
+
property_name = prop_result.value if hasattr(prop_result, 'value') else str(prop_result)
|
|
537
|
+
else:
|
|
538
|
+
# Evaluate the property expression to get the key
|
|
539
|
+
prop_result = self.eval_node(node.property, env, stack_trace)
|
|
540
|
+
if is_error(prop_result):
|
|
541
|
+
return prop_result
|
|
542
|
+
property_name = prop_result.value if hasattr(prop_result, 'value') else str(prop_result)
|
|
543
|
+
|
|
544
|
+
if isinstance(obj, EmbeddedCode):
|
|
545
|
+
if property_name == "code":
|
|
546
|
+
return String(obj.code)
|
|
547
|
+
elif property_name == "language":
|
|
548
|
+
return String(obj.language)
|
|
549
|
+
|
|
550
|
+
# Enforcement: consult security restrictions before returning
|
|
551
|
+
try:
|
|
552
|
+
from ..security import get_security_context
|
|
553
|
+
ctx = get_security_context()
|
|
554
|
+
target = f"{getattr(node.object, 'value', str(node.object))}.{property_name}"
|
|
555
|
+
restriction = ctx.get_restriction(target)
|
|
556
|
+
except Exception:
|
|
557
|
+
restriction = None
|
|
558
|
+
|
|
559
|
+
# Handle Builtin objects (for static methods like TypeName.default())
|
|
560
|
+
from ..object import Builtin
|
|
561
|
+
if isinstance(obj, Builtin):
|
|
562
|
+
if hasattr(obj, 'static_methods') and property_name in obj.static_methods:
|
|
563
|
+
return obj.static_methods[property_name]
|
|
564
|
+
return NULL
|
|
565
|
+
|
|
566
|
+
# Handle Module objects
|
|
567
|
+
from ..complexity_system import Module
|
|
568
|
+
if isinstance(obj, Module):
|
|
569
|
+
val = obj.get(property_name)
|
|
570
|
+
if val is None:
|
|
571
|
+
return NULL
|
|
572
|
+
if restriction:
|
|
573
|
+
rule = restriction.get('restriction')
|
|
574
|
+
if rule == 'redact':
|
|
575
|
+
from ..object import String
|
|
576
|
+
return String('***REDACTED***')
|
|
577
|
+
if rule == 'admin-only':
|
|
578
|
+
is_admin = bool(env.get('__is_admin__')) if env and hasattr(env, 'get') else False
|
|
579
|
+
if not is_admin:
|
|
580
|
+
return EvaluationError('Access denied: admin required')
|
|
581
|
+
return val
|
|
582
|
+
|
|
583
|
+
# Handle Map objects
|
|
584
|
+
if isinstance(obj, Map):
|
|
585
|
+
from ..object import String
|
|
586
|
+
|
|
587
|
+
# Try string key first
|
|
588
|
+
val = obj.pairs.get(property_name, NULL)
|
|
589
|
+
if val == NULL:
|
|
590
|
+
# Try with String object key (for dataclasses and other String-keyed maps)
|
|
591
|
+
str_key = String(property_name)
|
|
592
|
+
val = obj.pairs.get(str_key, NULL)
|
|
593
|
+
|
|
594
|
+
# Check if this is a computed property
|
|
595
|
+
computed_props = obj.pairs.get(String("__computed__"))
|
|
596
|
+
if computed_props and isinstance(computed_props, dict) and property_name in computed_props:
|
|
597
|
+
# Evaluate computed property
|
|
598
|
+
computed_expr = computed_props[property_name]
|
|
599
|
+
|
|
600
|
+
# Create environment with all field values in scope
|
|
601
|
+
from ..environment import Environment
|
|
602
|
+
compute_env = Environment(outer=env)
|
|
603
|
+
compute_env.set('this', obj)
|
|
604
|
+
|
|
605
|
+
# Add all regular fields to environment
|
|
606
|
+
for key, value in obj.pairs.items():
|
|
607
|
+
if isinstance(key, String) and not key.value.startswith('__'):
|
|
608
|
+
compute_env.set(key.value, value)
|
|
609
|
+
|
|
610
|
+
# Evaluate the computed expression
|
|
611
|
+
result = self.eval_node(computed_expr, compute_env, stack_trace)
|
|
612
|
+
return result if not is_error(result) else NULL
|
|
613
|
+
|
|
614
|
+
# apply restriction if present
|
|
615
|
+
if restriction:
|
|
616
|
+
rule = restriction.get('restriction')
|
|
617
|
+
if rule == 'redact':
|
|
618
|
+
from ..object import String
|
|
619
|
+
return String('***REDACTED***')
|
|
620
|
+
if rule == 'admin-only':
|
|
621
|
+
# check environment flag for admin
|
|
622
|
+
is_admin = bool(env.get('__is_admin__')) if env and hasattr(env, 'get') else False
|
|
623
|
+
if not is_admin:
|
|
624
|
+
return EvaluationError('Access denied: admin required')
|
|
625
|
+
return val
|
|
626
|
+
|
|
627
|
+
if hasattr(obj, 'get') and callable(obj.get):
|
|
628
|
+
val = obj.get(property_name)
|
|
629
|
+
if restriction:
|
|
630
|
+
rule = restriction.get('restriction')
|
|
631
|
+
if rule == 'redact':
|
|
632
|
+
from ..object import String
|
|
633
|
+
return String('***REDACTED***')
|
|
634
|
+
if rule == 'admin-only':
|
|
635
|
+
is_admin = bool(env.get('__is_admin__')) if env and hasattr(env, 'get') else False
|
|
636
|
+
if not is_admin:
|
|
637
|
+
return EvaluationError('Access denied: admin required')
|
|
638
|
+
return val
|
|
639
|
+
|
|
640
|
+
return NULL
|
|
641
|
+
|
|
642
|
+
# === BLOCKCHAIN EXPRESSIONS ===
|
|
643
|
+
elif isinstance(node, zexus_ast.TXExpression):
|
|
644
|
+
debug_log(" TXExpression node", f"tx.{node.property_name}")
|
|
645
|
+
return self.eval_tx_expression(node, env, stack_trace)
|
|
646
|
+
|
|
647
|
+
elif isinstance(node, zexus_ast.HashExpression):
|
|
648
|
+
debug_log(" HashExpression node", "hash()")
|
|
649
|
+
return self.eval_hash_expression(node, env, stack_trace)
|
|
650
|
+
|
|
651
|
+
elif isinstance(node, zexus_ast.SignatureExpression):
|
|
652
|
+
debug_log(" SignatureExpression node", "signature()")
|
|
653
|
+
return self.eval_signature_expression(node, env, stack_trace)
|
|
654
|
+
|
|
655
|
+
elif isinstance(node, zexus_ast.VerifySignatureExpression):
|
|
656
|
+
debug_log(" VerifySignatureExpression node", "verify_sig()")
|
|
657
|
+
return self.eval_verify_signature_expression(node, env, stack_trace)
|
|
658
|
+
|
|
659
|
+
elif isinstance(node, zexus_ast.GasExpression):
|
|
660
|
+
debug_log(" GasExpression node", f"gas.{node.property_name}")
|
|
661
|
+
return self.eval_gas_expression(node, env, stack_trace)
|
|
662
|
+
|
|
663
|
+
# Fallback
|
|
664
|
+
debug_log(" Unknown node type", node_type)
|
|
665
|
+
return EvaluationError(f"Unknown node type: {node_type}", stack_trace=stack_trace)
|
|
666
|
+
|
|
667
|
+
except Exception as e:
|
|
668
|
+
# Enhanced error with stack trace
|
|
669
|
+
error_msg = f"Internal error: {str(e)}"
|
|
670
|
+
debug_log(" Exception in eval_node", error_msg)
|
|
671
|
+
traceback.print_exc()
|
|
672
|
+
return EvaluationError(error_msg, stack_trace=stack_trace[-5:]) # Last 5 frames
|
|
673
|
+
|
|
674
|
+
# Additional VM-related methods
|
|
675
|
+
def _initialize_vm(self):
|
|
676
|
+
"""Initialize VM components for bytecode execution"""
|
|
677
|
+
try:
|
|
678
|
+
# Create bytecode compiler with caching enabled
|
|
679
|
+
self.bytecode_compiler = EvaluatorBytecodeCompiler(
|
|
680
|
+
use_cache=True,
|
|
681
|
+
cache_size=1000
|
|
682
|
+
)
|
|
683
|
+
# Create VM instance with JIT enabled
|
|
684
|
+
self.vm_instance = VM(use_jit=True, jit_threshold=100)
|
|
685
|
+
debug_log("Evaluator", "VM integration initialized successfully (cache + JIT)")
|
|
686
|
+
except Exception as e:
|
|
687
|
+
debug_log("Evaluator", f"Failed to initialize VM: {e}")
|
|
688
|
+
self.use_vm = False
|
|
689
|
+
|
|
690
|
+
def _should_use_vm(self, node) -> bool:
|
|
691
|
+
"""
|
|
692
|
+
Determine if this node should be executed via VM.
|
|
693
|
+
Uses heuristics to decide when VM execution is beneficial.
|
|
694
|
+
"""
|
|
695
|
+
if not self.use_vm or not VM_AVAILABLE:
|
|
696
|
+
return False
|
|
697
|
+
|
|
698
|
+
# Check if the compiler can handle this node
|
|
699
|
+
if self.bytecode_compiler and not self.bytecode_compiler.can_compile(node):
|
|
700
|
+
return False
|
|
701
|
+
|
|
702
|
+
# Use external heuristics
|
|
703
|
+
return should_use_vm_for_node(node)
|
|
704
|
+
|
|
705
|
+
def _execute_via_vm(self, node, env, debug_mode=False):
|
|
706
|
+
"""
|
|
707
|
+
Compile node to bytecode and execute via VM.
|
|
708
|
+
Falls back to direct evaluation on error.
|
|
709
|
+
"""
|
|
710
|
+
try:
|
|
711
|
+
debug_log("VM Execution", f"Compiling {type(node).__name__} to bytecode")
|
|
712
|
+
|
|
713
|
+
# Compile to bytecode
|
|
714
|
+
bytecode = self.bytecode_compiler.compile(node, optimize=True)
|
|
715
|
+
|
|
716
|
+
if bytecode is None or self.bytecode_compiler.errors:
|
|
717
|
+
debug_log("VM Execution", f"Compilation failed: {self.bytecode_compiler.errors}")
|
|
718
|
+
self.vm_stats['vm_fallbacks'] += 1
|
|
719
|
+
return None # Signal fallback
|
|
720
|
+
|
|
721
|
+
self.vm_stats['bytecode_compiles'] += 1
|
|
722
|
+
|
|
723
|
+
# Convert environment to dict for VM
|
|
724
|
+
vm_env = self._env_to_dict(env)
|
|
725
|
+
|
|
726
|
+
# Add builtins to VM environment
|
|
727
|
+
vm_builtins = {}
|
|
728
|
+
if hasattr(self, 'builtins') and self.builtins:
|
|
729
|
+
vm_builtins = {k: v for k, v in self.builtins.items()}
|
|
730
|
+
|
|
731
|
+
# Use shared VM instance (has JIT, optimizer, etc.)
|
|
732
|
+
if not self.vm_instance:
|
|
733
|
+
self.vm_instance = VM(use_jit=True, jit_threshold=100)
|
|
734
|
+
|
|
735
|
+
self.vm_instance.builtins = vm_builtins
|
|
736
|
+
self.vm_instance.env = vm_env
|
|
737
|
+
result = self.vm_instance.execute(bytecode, debug=debug_mode)
|
|
738
|
+
|
|
739
|
+
self.vm_stats['vm_executions'] += 1
|
|
740
|
+
|
|
741
|
+
# Update environment with VM changes
|
|
742
|
+
self._update_env_from_dict(env, self.vm_instance.env)
|
|
743
|
+
|
|
744
|
+
# Convert VM result back to evaluator objects
|
|
745
|
+
return self._vm_result_to_evaluator(result)
|
|
746
|
+
|
|
747
|
+
except Exception as e:
|
|
748
|
+
debug_log("VM Execution", f"VM execution error: {e}")
|
|
749
|
+
self.vm_stats['vm_fallbacks'] += 1
|
|
750
|
+
return None # Signal fallback
|
|
751
|
+
|
|
752
|
+
def _env_to_dict(self, env):
|
|
753
|
+
"""Convert Environment object to dict for VM"""
|
|
754
|
+
result = {}
|
|
755
|
+
try:
|
|
756
|
+
from ..object import String, Integer, Float, Boolean, List, Map, NULL
|
|
757
|
+
|
|
758
|
+
def to_python(obj):
|
|
759
|
+
"""Convert evaluator object to Python primitive"""
|
|
760
|
+
if obj is NULL or obj is None:
|
|
761
|
+
return None
|
|
762
|
+
elif isinstance(obj, (String, Integer, Float, Boolean)):
|
|
763
|
+
return obj.value
|
|
764
|
+
elif isinstance(obj, List):
|
|
765
|
+
return [to_python(e) for e in obj.elements]
|
|
766
|
+
elif isinstance(obj, Map):
|
|
767
|
+
return {k: to_python(v) for k, v in obj.pairs.items()}
|
|
768
|
+
else:
|
|
769
|
+
# Return as-is for complex objects
|
|
770
|
+
return obj
|
|
771
|
+
|
|
772
|
+
# Get all variables from environment
|
|
773
|
+
if hasattr(env, 'store') and isinstance(env.store, dict):
|
|
774
|
+
for k, v in env.store.items():
|
|
775
|
+
result[k] = to_python(v)
|
|
776
|
+
|
|
777
|
+
# Get outer environment if available
|
|
778
|
+
if hasattr(env, 'outer') and env.outer:
|
|
779
|
+
outer_dict = self._env_to_dict(env.outer)
|
|
780
|
+
# Don't overwrite inner scope
|
|
781
|
+
for k, v in outer_dict.items():
|
|
782
|
+
if k not in result:
|
|
783
|
+
result[k] = v
|
|
784
|
+
except Exception as e:
|
|
785
|
+
debug_log("_env_to_dict", f"Error: {e}")
|
|
786
|
+
|
|
787
|
+
return result
|
|
788
|
+
|
|
789
|
+
def _update_env_from_dict(self, env, vm_env: dict):
|
|
790
|
+
"""Update Environment object from VM's dict"""
|
|
791
|
+
try:
|
|
792
|
+
for key, value in vm_env.items():
|
|
793
|
+
# Convert VM result back to evaluator object
|
|
794
|
+
evaluator_value = self._vm_result_to_evaluator(value)
|
|
795
|
+
# Update environment
|
|
796
|
+
if hasattr(env, 'set'):
|
|
797
|
+
env.set(key, evaluator_value)
|
|
798
|
+
elif hasattr(env, 'store'):
|
|
799
|
+
env.store[key] = evaluator_value
|
|
800
|
+
except Exception as e:
|
|
801
|
+
debug_log("_update_env_from_dict", f"Error: {e}")
|
|
802
|
+
|
|
803
|
+
def _vm_result_to_evaluator(self, result):
|
|
804
|
+
"""Convert VM result to evaluator object"""
|
|
805
|
+
from ..object import String, Integer, Float, Boolean, List, Map, NULL
|
|
806
|
+
|
|
807
|
+
if result is None:
|
|
808
|
+
return NULL
|
|
809
|
+
elif isinstance(result, bool):
|
|
810
|
+
return Boolean(result)
|
|
811
|
+
elif isinstance(result, int):
|
|
812
|
+
return Integer(result)
|
|
813
|
+
elif isinstance(result, float):
|
|
814
|
+
return Float(result)
|
|
815
|
+
elif isinstance(result, str):
|
|
816
|
+
return String(result)
|
|
817
|
+
elif isinstance(result, list):
|
|
818
|
+
return List([self._vm_result_to_evaluator(e) for e in result])
|
|
819
|
+
elif isinstance(result, dict):
|
|
820
|
+
converted = {k: self._vm_result_to_evaluator(v) for k, v in result.items()}
|
|
821
|
+
return Map(converted)
|
|
822
|
+
else:
|
|
823
|
+
# Return as-is for complex objects
|
|
824
|
+
return result
|
|
825
|
+
|
|
826
|
+
def eval_with_vm_support(self, node, env, stack_trace=None, debug_mode=False):
|
|
827
|
+
"""
|
|
828
|
+
Evaluate node with optional VM execution.
|
|
829
|
+
Tries VM first if beneficial, falls back to direct evaluation.
|
|
830
|
+
"""
|
|
831
|
+
# Check if we should use VM
|
|
832
|
+
if self._should_use_vm(node):
|
|
833
|
+
result = self._execute_via_vm(node, env, debug_mode)
|
|
834
|
+
if result is not None:
|
|
835
|
+
return result
|
|
836
|
+
# Fall through to direct evaluation
|
|
837
|
+
|
|
838
|
+
# Direct evaluation
|
|
839
|
+
self.vm_stats['direct_evals'] += 1
|
|
840
|
+
return self.eval_node(node, env, stack_trace)
|
|
841
|
+
|
|
842
|
+
def get_vm_stats(self) -> dict:
|
|
843
|
+
"""Return VM execution statistics"""
|
|
844
|
+
return self.vm_stats.copy()
|
|
845
|
+
|
|
846
|
+
|
|
847
|
+
def get_full_vm_statistics(self):
|
|
848
|
+
"""Get comprehensive statistics from all VM components"""
|
|
849
|
+
stats = {
|
|
850
|
+
'evaluator': self.vm_stats.copy(),
|
|
851
|
+
'cache': None,
|
|
852
|
+
'jit': None,
|
|
853
|
+
'optimizer': None
|
|
854
|
+
}
|
|
855
|
+
|
|
856
|
+
# Cache statistics
|
|
857
|
+
if self.bytecode_compiler and self.bytecode_compiler.cache:
|
|
858
|
+
stats['cache'] = self.bytecode_compiler.get_cache_stats()
|
|
859
|
+
|
|
860
|
+
# JIT statistics
|
|
861
|
+
if self.vm_instance:
|
|
862
|
+
stats['jit'] = self.vm_instance.get_jit_stats()
|
|
863
|
+
|
|
864
|
+
return stats
|
|
865
|
+
|
|
866
|
+
# Global Entry Point
|
|
867
|
+
def evaluate(program, env, debug_mode=False, use_vm=True):
|
|
868
|
+
if debug_mode:
|
|
869
|
+
env.enable_debug()
|
|
870
|
+
|
|
871
|
+
# Instantiate the Modular Evaluator with VM support
|
|
872
|
+
evaluator = Evaluator(use_vm=use_vm)
|
|
873
|
+
|
|
874
|
+
# Merge any module-level builtin injections (tests may add async helpers, etc.)
|
|
875
|
+
try:
|
|
876
|
+
from . import builtins as injected_builtins
|
|
877
|
+
if isinstance(injected_builtins, dict):
|
|
878
|
+
evaluator.builtins.update(injected_builtins)
|
|
879
|
+
except Exception:
|
|
880
|
+
pass
|
|
881
|
+
|
|
882
|
+
# Try VM-accelerated execution for the whole program if beneficial
|
|
883
|
+
if use_vm and VM_AVAILABLE:
|
|
884
|
+
result = evaluator.eval_with_vm_support(program, env, debug_mode=debug_mode)
|
|
885
|
+
else:
|
|
886
|
+
result = evaluator.eval_node(program, env)
|
|
887
|
+
|
|
888
|
+
if debug_mode:
|
|
889
|
+
env.disable_debug()
|
|
890
|
+
|
|
891
|
+
return result
|