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.
Files changed (227) hide show
  1. package/LICENSE +0 -0
  2. package/README.md +2513 -0
  3. package/bin/zexus +2 -0
  4. package/bin/zpics +2 -0
  5. package/bin/zpm +2 -0
  6. package/bin/zx +2 -0
  7. package/bin/zx-deploy +2 -0
  8. package/bin/zx-dev +2 -0
  9. package/bin/zx-run +2 -0
  10. package/package.json +66 -0
  11. package/scripts/README.md +24 -0
  12. package/scripts/postinstall.js +44 -0
  13. package/shared_config.json +24 -0
  14. package/src/README.md +1525 -0
  15. package/src/tests/run_zexus_tests.py +117 -0
  16. package/src/tests/test_all_phases.zx +346 -0
  17. package/src/tests/test_blockchain_features.zx +306 -0
  18. package/src/tests/test_complexity_features.zx +321 -0
  19. package/src/tests/test_core_integration.py +185 -0
  20. package/src/tests/test_phase10_ecosystem.zx +177 -0
  21. package/src/tests/test_phase1_modifiers.zx +87 -0
  22. package/src/tests/test_phase2_plugins.zx +80 -0
  23. package/src/tests/test_phase3_security.zx +97 -0
  24. package/src/tests/test_phase4_vfs.zx +116 -0
  25. package/src/tests/test_phase5_types.zx +117 -0
  26. package/src/tests/test_phase6_metaprogramming.zx +125 -0
  27. package/src/tests/test_phase7_optimization.zx +132 -0
  28. package/src/tests/test_phase9_advanced_types.zx +157 -0
  29. package/src/tests/test_security_features.py +419 -0
  30. package/src/tests/test_security_features.zx +276 -0
  31. package/src/tests/test_simple_zx.zx +1 -0
  32. package/src/tests/test_verification_simple.zx +69 -0
  33. package/src/zexus/__init__.py +28 -0
  34. package/src/zexus/__main__.py +5 -0
  35. package/src/zexus/__pycache__/__init__.cpython-312.pyc +0 -0
  36. package/src/zexus/__pycache__/advanced_types.cpython-312.pyc +0 -0
  37. package/src/zexus/__pycache__/builtin_modules.cpython-312.pyc +0 -0
  38. package/src/zexus/__pycache__/capability_system.cpython-312.pyc +0 -0
  39. package/src/zexus/__pycache__/complexity_system.cpython-312.pyc +0 -0
  40. package/src/zexus/__pycache__/concurrency_system.cpython-312.pyc +0 -0
  41. package/src/zexus/__pycache__/config.cpython-312.pyc +0 -0
  42. package/src/zexus/__pycache__/dependency_injection.cpython-312.pyc +0 -0
  43. package/src/zexus/__pycache__/ecosystem.cpython-312.pyc +0 -0
  44. package/src/zexus/__pycache__/environment.cpython-312.pyc +0 -0
  45. package/src/zexus/__pycache__/error_reporter.cpython-312.pyc +0 -0
  46. package/src/zexus/__pycache__/hybrid_orchestrator.cpython-312.pyc +0 -0
  47. package/src/zexus/__pycache__/lexer.cpython-312.pyc +0 -0
  48. package/src/zexus/__pycache__/metaprogramming.cpython-312.pyc +0 -0
  49. package/src/zexus/__pycache__/module_cache.cpython-312.pyc +0 -0
  50. package/src/zexus/__pycache__/object.cpython-312.pyc +0 -0
  51. package/src/zexus/__pycache__/optimization.cpython-312.pyc +0 -0
  52. package/src/zexus/__pycache__/plugin_system.cpython-312.pyc +0 -0
  53. package/src/zexus/__pycache__/policy_engine.cpython-312.pyc +0 -0
  54. package/src/zexus/__pycache__/security.cpython-312.pyc +0 -0
  55. package/src/zexus/__pycache__/stdlib_integration.cpython-312.pyc +0 -0
  56. package/src/zexus/__pycache__/strategy_recovery.cpython-312.pyc +0 -0
  57. package/src/zexus/__pycache__/syntax_validator.cpython-312.pyc +0 -0
  58. package/src/zexus/__pycache__/type_system.cpython-312.pyc +0 -0
  59. package/src/zexus/__pycache__/virtual_filesystem.cpython-312.pyc +0 -0
  60. package/src/zexus/__pycache__/zexus_ast.cpython-312.pyc +0 -0
  61. package/src/zexus/__pycache__/zexus_token.cpython-312.pyc +0 -0
  62. package/src/zexus/advanced_types.py +401 -0
  63. package/src/zexus/blockchain/__init__.py +40 -0
  64. package/src/zexus/blockchain/__pycache__/__init__.cpython-312.pyc +0 -0
  65. package/src/zexus/blockchain/__pycache__/crypto.cpython-312.pyc +0 -0
  66. package/src/zexus/blockchain/__pycache__/ledger.cpython-312.pyc +0 -0
  67. package/src/zexus/blockchain/__pycache__/transaction.cpython-312.pyc +0 -0
  68. package/src/zexus/blockchain/crypto.py +463 -0
  69. package/src/zexus/blockchain/ledger.py +255 -0
  70. package/src/zexus/blockchain/transaction.py +267 -0
  71. package/src/zexus/builtin_modules.py +284 -0
  72. package/src/zexus/builtin_plugins.py +317 -0
  73. package/src/zexus/capability_system.py +372 -0
  74. package/src/zexus/cli/__init__.py +2 -0
  75. package/src/zexus/cli/__pycache__/__init__.cpython-312.pyc +0 -0
  76. package/src/zexus/cli/__pycache__/main.cpython-312.pyc +0 -0
  77. package/src/zexus/cli/main.py +707 -0
  78. package/src/zexus/cli/zpm.py +203 -0
  79. package/src/zexus/compare_interpreter_compiler.py +146 -0
  80. package/src/zexus/compiler/__init__.py +169 -0
  81. package/src/zexus/compiler/__pycache__/__init__.cpython-312.pyc +0 -0
  82. package/src/zexus/compiler/__pycache__/lexer.cpython-312.pyc +0 -0
  83. package/src/zexus/compiler/__pycache__/parser.cpython-312.pyc +0 -0
  84. package/src/zexus/compiler/__pycache__/zexus_ast.cpython-312.pyc +0 -0
  85. package/src/zexus/compiler/bytecode.py +266 -0
  86. package/src/zexus/compiler/compat_runtime.py +277 -0
  87. package/src/zexus/compiler/lexer.py +257 -0
  88. package/src/zexus/compiler/parser.py +779 -0
  89. package/src/zexus/compiler/semantic.py +118 -0
  90. package/src/zexus/compiler/zexus_ast.py +454 -0
  91. package/src/zexus/complexity_system.py +575 -0
  92. package/src/zexus/concurrency_system.py +493 -0
  93. package/src/zexus/config.py +201 -0
  94. package/src/zexus/crypto_bridge.py +19 -0
  95. package/src/zexus/dependency_injection.py +423 -0
  96. package/src/zexus/ecosystem.py +434 -0
  97. package/src/zexus/environment.py +101 -0
  98. package/src/zexus/environment_manager.py +119 -0
  99. package/src/zexus/error_reporter.py +314 -0
  100. package/src/zexus/evaluator/__init__.py +12 -0
  101. package/src/zexus/evaluator/__pycache__/__init__.cpython-312.pyc +0 -0
  102. package/src/zexus/evaluator/__pycache__/bytecode_compiler.cpython-312.pyc +0 -0
  103. package/src/zexus/evaluator/__pycache__/core.cpython-312.pyc +0 -0
  104. package/src/zexus/evaluator/__pycache__/expressions.cpython-312.pyc +0 -0
  105. package/src/zexus/evaluator/__pycache__/functions.cpython-312.pyc +0 -0
  106. package/src/zexus/evaluator/__pycache__/integration.cpython-312.pyc +0 -0
  107. package/src/zexus/evaluator/__pycache__/statements.cpython-312.pyc +0 -0
  108. package/src/zexus/evaluator/__pycache__/utils.cpython-312.pyc +0 -0
  109. package/src/zexus/evaluator/bytecode_compiler.py +700 -0
  110. package/src/zexus/evaluator/core.py +891 -0
  111. package/src/zexus/evaluator/expressions.py +827 -0
  112. package/src/zexus/evaluator/functions.py +3989 -0
  113. package/src/zexus/evaluator/integration.py +396 -0
  114. package/src/zexus/evaluator/statements.py +4303 -0
  115. package/src/zexus/evaluator/utils.py +126 -0
  116. package/src/zexus/evaluator_original.py +2041 -0
  117. package/src/zexus/external_bridge.py +16 -0
  118. package/src/zexus/find_affected_imports.sh +155 -0
  119. package/src/zexus/hybrid_orchestrator.py +152 -0
  120. package/src/zexus/input_validation.py +259 -0
  121. package/src/zexus/lexer.py +571 -0
  122. package/src/zexus/logging.py +89 -0
  123. package/src/zexus/lsp/__init__.py +9 -0
  124. package/src/zexus/lsp/completion_provider.py +207 -0
  125. package/src/zexus/lsp/definition_provider.py +22 -0
  126. package/src/zexus/lsp/hover_provider.py +71 -0
  127. package/src/zexus/lsp/server.py +269 -0
  128. package/src/zexus/lsp/symbol_provider.py +31 -0
  129. package/src/zexus/metaprogramming.py +321 -0
  130. package/src/zexus/module_cache.py +89 -0
  131. package/src/zexus/module_manager.py +107 -0
  132. package/src/zexus/object.py +973 -0
  133. package/src/zexus/optimization.py +424 -0
  134. package/src/zexus/parser/__init__.py +31 -0
  135. package/src/zexus/parser/__pycache__/__init__.cpython-312.pyc +0 -0
  136. package/src/zexus/parser/__pycache__/parser.cpython-312.pyc +0 -0
  137. package/src/zexus/parser/__pycache__/strategy_context.cpython-312.pyc +0 -0
  138. package/src/zexus/parser/__pycache__/strategy_structural.cpython-312.pyc +0 -0
  139. package/src/zexus/parser/integration.py +86 -0
  140. package/src/zexus/parser/parser.py +3977 -0
  141. package/src/zexus/parser/strategy_context.py +7254 -0
  142. package/src/zexus/parser/strategy_structural.py +1033 -0
  143. package/src/zexus/persistence.py +391 -0
  144. package/src/zexus/plugin_system.py +290 -0
  145. package/src/zexus/policy_engine.py +365 -0
  146. package/src/zexus/profiler/__init__.py +5 -0
  147. package/src/zexus/profiler/profiler.py +233 -0
  148. package/src/zexus/purity_system.py +398 -0
  149. package/src/zexus/runtime/__init__.py +20 -0
  150. package/src/zexus/runtime/async_runtime.py +324 -0
  151. package/src/zexus/search_old_imports.sh +65 -0
  152. package/src/zexus/security.py +1407 -0
  153. package/src/zexus/stack_trace.py +233 -0
  154. package/src/zexus/stdlib/__init__.py +27 -0
  155. package/src/zexus/stdlib/blockchain.py +341 -0
  156. package/src/zexus/stdlib/compression.py +167 -0
  157. package/src/zexus/stdlib/crypto.py +124 -0
  158. package/src/zexus/stdlib/datetime.py +163 -0
  159. package/src/zexus/stdlib/db_mongo.py +199 -0
  160. package/src/zexus/stdlib/db_mysql.py +162 -0
  161. package/src/zexus/stdlib/db_postgres.py +163 -0
  162. package/src/zexus/stdlib/db_sqlite.py +133 -0
  163. package/src/zexus/stdlib/encoding.py +230 -0
  164. package/src/zexus/stdlib/fs.py +195 -0
  165. package/src/zexus/stdlib/http.py +219 -0
  166. package/src/zexus/stdlib/http_server.py +248 -0
  167. package/src/zexus/stdlib/json_module.py +61 -0
  168. package/src/zexus/stdlib/math.py +360 -0
  169. package/src/zexus/stdlib/os_module.py +265 -0
  170. package/src/zexus/stdlib/regex.py +148 -0
  171. package/src/zexus/stdlib/sockets.py +253 -0
  172. package/src/zexus/stdlib/test_framework.zx +208 -0
  173. package/src/zexus/stdlib/test_runner.zx +119 -0
  174. package/src/zexus/stdlib_integration.py +341 -0
  175. package/src/zexus/strategy_recovery.py +256 -0
  176. package/src/zexus/syntax_validator.py +356 -0
  177. package/src/zexus/testing/zpics.py +407 -0
  178. package/src/zexus/testing/zpics_runtime.py +369 -0
  179. package/src/zexus/type_system.py +374 -0
  180. package/src/zexus/validation_system.py +569 -0
  181. package/src/zexus/virtual_filesystem.py +355 -0
  182. package/src/zexus/vm/__init__.py +8 -0
  183. package/src/zexus/vm/__pycache__/__init__.cpython-312.pyc +0 -0
  184. package/src/zexus/vm/__pycache__/async_optimizer.cpython-312.pyc +0 -0
  185. package/src/zexus/vm/__pycache__/bytecode.cpython-312.pyc +0 -0
  186. package/src/zexus/vm/__pycache__/cache.cpython-312.pyc +0 -0
  187. package/src/zexus/vm/__pycache__/jit.cpython-312.pyc +0 -0
  188. package/src/zexus/vm/__pycache__/memory_manager.cpython-312.pyc +0 -0
  189. package/src/zexus/vm/__pycache__/memory_pool.cpython-312.pyc +0 -0
  190. package/src/zexus/vm/__pycache__/optimizer.cpython-312.pyc +0 -0
  191. package/src/zexus/vm/__pycache__/parallel_vm.cpython-312.pyc +0 -0
  192. package/src/zexus/vm/__pycache__/peephole_optimizer.cpython-312.pyc +0 -0
  193. package/src/zexus/vm/__pycache__/profiler.cpython-312.pyc +0 -0
  194. package/src/zexus/vm/__pycache__/register_allocator.cpython-312.pyc +0 -0
  195. package/src/zexus/vm/__pycache__/register_vm.cpython-312.pyc +0 -0
  196. package/src/zexus/vm/__pycache__/ssa_converter.cpython-312.pyc +0 -0
  197. package/src/zexus/vm/__pycache__/vm.cpython-312.pyc +0 -0
  198. package/src/zexus/vm/async_optimizer.py +420 -0
  199. package/src/zexus/vm/bytecode.py +428 -0
  200. package/src/zexus/vm/bytecode_converter.py +297 -0
  201. package/src/zexus/vm/cache.py +532 -0
  202. package/src/zexus/vm/jit.py +720 -0
  203. package/src/zexus/vm/memory_manager.py +520 -0
  204. package/src/zexus/vm/memory_pool.py +511 -0
  205. package/src/zexus/vm/optimizer.py +478 -0
  206. package/src/zexus/vm/parallel_vm.py +899 -0
  207. package/src/zexus/vm/peephole_optimizer.py +452 -0
  208. package/src/zexus/vm/profiler.py +527 -0
  209. package/src/zexus/vm/register_allocator.py +462 -0
  210. package/src/zexus/vm/register_vm.py +520 -0
  211. package/src/zexus/vm/ssa_converter.py +757 -0
  212. package/src/zexus/vm/vm.py +1392 -0
  213. package/src/zexus/zexus_ast.py +1782 -0
  214. package/src/zexus/zexus_token.py +253 -0
  215. package/src/zexus/zpm/__init__.py +15 -0
  216. package/src/zexus/zpm/installer.py +116 -0
  217. package/src/zexus/zpm/package_manager.py +208 -0
  218. package/src/zexus/zpm/publisher.py +98 -0
  219. package/src/zexus/zpm/registry.py +110 -0
  220. package/src/zexus.egg-info/PKG-INFO +2235 -0
  221. package/src/zexus.egg-info/SOURCES.txt +876 -0
  222. package/src/zexus.egg-info/dependency_links.txt +1 -0
  223. package/src/zexus.egg-info/entry_points.txt +3 -0
  224. package/src/zexus.egg-info/not-zip-safe +1 -0
  225. package/src/zexus.egg-info/requires.txt +14 -0
  226. package/src/zexus.egg-info/top_level.txt +2 -0
  227. 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