IncludeCPP 4.9.4__tar.gz → 4.9.5__tar.gz

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 (120) hide show
  1. {includecpp-4.9.4 → includecpp-4.9.5}/IncludeCPP.egg-info/PKG-INFO +1 -1
  2. {includecpp-4.9.4 → includecpp-4.9.5}/PKG-INFO +1 -1
  3. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/CHANGELOG.md +44 -1
  4. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/__init__.py +1 -1
  5. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/core/cssl/CSSL_DOCUMENTATION.md +40 -1
  6. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/core/cssl/cssl_builtins.py +84 -9
  7. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/core/cssl/cssl_parser.py +278 -12
  8. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/core/cssl/cssl_runtime.py +60 -6
  9. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/vscode/cssl/snippets/cssl.snippets.json +25 -0
  10. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/vscode/cssl/syntaxes/cssl.tmLanguage.json +1 -1
  11. {includecpp-4.9.4 → includecpp-4.9.5}/pyproject.toml +1 -1
  12. {includecpp-4.9.4 → includecpp-4.9.5}/IncludeCPP.egg-info/SOURCES.txt +0 -0
  13. {includecpp-4.9.4 → includecpp-4.9.5}/IncludeCPP.egg-info/dependency_links.txt +0 -0
  14. {includecpp-4.9.4 → includecpp-4.9.5}/IncludeCPP.egg-info/entry_points.txt +0 -0
  15. {includecpp-4.9.4 → includecpp-4.9.5}/IncludeCPP.egg-info/requires.txt +0 -0
  16. {includecpp-4.9.4 → includecpp-4.9.5}/IncludeCPP.egg-info/top_level.txt +0 -0
  17. {includecpp-4.9.4 → includecpp-4.9.5}/LICENSE +0 -0
  18. {includecpp-4.9.4 → includecpp-4.9.5}/MANIFEST.in +0 -0
  19. {includecpp-4.9.4 → includecpp-4.9.5}/README.md +0 -0
  20. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/DOCUMENTATION.md +0 -0
  21. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/__init__.pyi +0 -0
  22. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/__main__.py +0 -0
  23. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/cli/__init__.py +0 -0
  24. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/cli/commands.py +0 -0
  25. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/cli/config_parser.py +0 -0
  26. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/core/__init__.py +0 -0
  27. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/core/ai_integration.py +0 -0
  28. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/core/build_manager.py +0 -0
  29. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/core/cpp_api.py +0 -0
  30. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/core/cpp_api.pyi +0 -0
  31. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/core/cpp_api_extensions.pyi +0 -0
  32. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/core/cppy_converter.py +0 -0
  33. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/core/cssl/CSSL_DOCUMENTATION_NEW.md +0 -0
  34. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/core/cssl/__init__.py +0 -0
  35. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/core/cssl/cpp/build/api.pyd +0 -0
  36. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/core/cssl/cpp/build/api.pyi +0 -0
  37. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/core/cssl/cpp/build/cssl_core.pyi +0 -0
  38. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/core/cssl/cpp/build/libgcc_s_seh-1.dll +0 -0
  39. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/core/cssl/cpp/build/libstdc++-6.dll +0 -0
  40. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/core/cssl/cpp/build/libwinpthread-1.dll +0 -0
  41. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/core/cssl/cpp/cssl_core.cp +0 -0
  42. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/core/cssl/cpp/cssl_lexer.hpp +0 -0
  43. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/core/cssl/cssl_builtins.pyi +0 -0
  44. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/core/cssl/cssl_compiler.py +0 -0
  45. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/core/cssl/cssl_events.py +0 -0
  46. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/core/cssl/cssl_languages.py +0 -0
  47. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/core/cssl/cssl_modules.py +0 -0
  48. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/core/cssl/cssl_optimizer.py +0 -0
  49. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/core/cssl/cssl_syntax.py +0 -0
  50. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/core/cssl/cssl_types.py +0 -0
  51. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/core/cssl_bridge.py +0 -0
  52. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/core/cssl_bridge.pyi +0 -0
  53. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/core/error_catalog.py +0 -0
  54. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/core/error_formatter.py +0 -0
  55. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/core/exceptions.py +0 -0
  56. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/core/homeserver.py +0 -0
  57. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/core/path_discovery.py +0 -0
  58. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/core/project_ui.py +0 -0
  59. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/core/settings_ui.py +0 -0
  60. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/generator/__init__.py +0 -0
  61. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/generator/parser.cpp +0 -0
  62. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/generator/parser.h +0 -0
  63. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/generator/type_resolver.cpp +0 -0
  64. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/generator/type_resolver.h +0 -0
  65. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/gui/__init__.py +0 -0
  66. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/gui/exe_wizard.py +0 -0
  67. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/py.typed +0 -0
  68. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/templates/cpp.proj.template +0 -0
  69. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/vscode/__init__.py +0 -0
  70. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/vscode/cssl/__init__.py +0 -0
  71. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/vscode/cssl/extension.js +0 -0
  72. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/vscode/cssl/images/cssl.png +0 -0
  73. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/vscode/cssl/images/cssl_pl.png +0 -0
  74. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/vscode/cssl/language-configuration.json +0 -0
  75. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/vscode/cssl/node_modules/.package-lock.json +0 -0
  76. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/vscode/cssl/node_modules/@types/node/README.md +0 -0
  77. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/vscode/cssl/node_modules/@types/node/package.json +0 -0
  78. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/vscode/cssl/node_modules/@types/vscode/README.md +0 -0
  79. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/vscode/cssl/node_modules/@types/vscode/package.json +0 -0
  80. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/vscode/cssl/node_modules/balanced-match/LICENSE.md +0 -0
  81. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/vscode/cssl/node_modules/balanced-match/README.md +0 -0
  82. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/vscode/cssl/node_modules/balanced-match/package.json +0 -0
  83. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/vscode/cssl/node_modules/brace-expansion/README.md +0 -0
  84. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/vscode/cssl/node_modules/brace-expansion/package.json +0 -0
  85. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/vscode/cssl/node_modules/minimatch/README.md +0 -0
  86. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/vscode/cssl/node_modules/minimatch/package.json +0 -0
  87. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/vscode/cssl/node_modules/semver/README.md +0 -0
  88. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/vscode/cssl/node_modules/semver/package.json +0 -0
  89. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/vscode/cssl/node_modules/undici-types/README.md +0 -0
  90. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/vscode/cssl/node_modules/undici-types/package.json +0 -0
  91. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/vscode/cssl/node_modules/vscode-jsonrpc/README.md +0 -0
  92. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/vscode/cssl/node_modules/vscode-jsonrpc/package.json +0 -0
  93. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/vscode/cssl/node_modules/vscode-languageclient/README.md +0 -0
  94. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/vscode/cssl/node_modules/vscode-languageclient/package.json +0 -0
  95. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/vscode/cssl/node_modules/vscode-languageserver-protocol/README.md +0 -0
  96. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/vscode/cssl/node_modules/vscode-languageserver-protocol/metaModel.schema.json +0 -0
  97. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/vscode/cssl/node_modules/vscode-languageserver-protocol/package.json +0 -0
  98. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/vscode/cssl/node_modules/vscode-languageserver-types/README.md +0 -0
  99. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/vscode/cssl/node_modules/vscode-languageserver-types/lib/esm/package.json +0 -0
  100. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/vscode/cssl/node_modules/vscode-languageserver-types/package.json +0 -0
  101. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/vscode/cssl/package-lock.json +0 -0
  102. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/vscode/cssl/package.json +0 -0
  103. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/vscode/cssl/server/__init__.py +0 -0
  104. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/vscode/cssl/server/__main__.py +0 -0
  105. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/vscode/cssl/server/analysis/__init__.py +0 -0
  106. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/vscode/cssl/server/analysis/diagnostic_provider.py +0 -0
  107. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/vscode/cssl/server/analysis/document_manager.py +0 -0
  108. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/vscode/cssl/server/analysis/semantic_analyzer.py +0 -0
  109. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/vscode/cssl/server/providers/__init__.py +0 -0
  110. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/vscode/cssl/server/providers/completion_provider.py +0 -0
  111. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/vscode/cssl/server/providers/definition_provider.py +0 -0
  112. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/vscode/cssl/server/providers/hover_provider.py +0 -0
  113. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/vscode/cssl/server/server.py +0 -0
  114. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/vscode/cssl/server/utils/__init__.py +0 -0
  115. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/vscode/cssl/server/utils/position_utils.py +0 -0
  116. {includecpp-4.9.4 → includecpp-4.9.5}/includecpp/vscode/cssl/server/utils/symbol_table.py +0 -0
  117. {includecpp-4.9.4 → includecpp-4.9.5}/requirements.txt +0 -0
  118. {includecpp-4.9.4 → includecpp-4.9.5}/setup.cfg +0 -0
  119. {includecpp-4.9.4 → includecpp-4.9.5}/setup.py +0 -0
  120. {includecpp-4.9.4 → includecpp-4.9.5}/tests/test_multilang.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: IncludeCPP
3
- Version: 4.9.4
3
+ Version: 4.9.5
4
4
  Summary: Professional C++ Python bindings with type-generic templates, pystubs and native threading
5
5
  Home-page: https://github.com/liliassg/IncludeCPP
6
6
  Author: Lilias Hatterscheidt
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: IncludeCPP
3
- Version: 4.9.4
3
+ Version: 4.9.5
4
4
  Summary: Professional C++ Python bindings with type-generic templates, pystubs and native threading
5
5
  Home-page: https://github.com/liliassg/IncludeCPP
6
6
  Author: Lilias Hatterscheidt
@@ -1,6 +1,49 @@
1
1
  # IncludeCPP Changelog
2
2
 
3
- ## v4.9.4 (2026-01-27)
3
+ ## v4.9.5 (2026-01-27)
4
+
5
+ ### Variable Modifiers
6
+
7
+ #### `local`, `static`, `freezed` Keywords
8
+ - **`local`**: Forbids global reference access (`@var` returns null), allows snapshots (`%var`)
9
+ ```cssl
10
+ local int privateCounter = 0;
11
+ @privateCounter; // Returns null (cannot access via @)
12
+ snapshot(privateCounter);
13
+ %privateCounter; // Works normally
14
+ ```
15
+
16
+ - **`static`**: Allows global reference access (`@var`), forbids snapshots (`%var` returns null)
17
+ ```cssl
18
+ static int cachedValue = 42;
19
+ @cachedValue; // Works normally
20
+ %cachedValue; // Returns null (cannot snapshot)
21
+ ```
22
+
23
+ - **`local static`**: Forbids both `@` and `%` access
24
+ ```cssl
25
+ local static int internalOnly = 100;
26
+ @internalOnly; // Returns null
27
+ %internalOnly; // Returns null
28
+ ```
29
+
30
+ - **`freezed`**: Creates immutable variables (reassignment returns null)
31
+ ```cssl
32
+ freezed string constant = "immutable";
33
+ constant = "new value"; // Returns null (no change made)
34
+ ```
35
+
36
+ ### Function Modifier Fixes
37
+
38
+ #### `undefined` and `super` Error Handling
39
+ - **Per-statement error handling**: `undefined` and `super` modifiers now catch errors on each statement and continue execution
40
+ ```cssl
41
+ undefined define SafeFunc() {
42
+ d = ?nonexistent; // Error swallowed, continues
43
+ x = 2; // Executes
44
+ return x; // Returns 2
45
+ }
46
+ ```
4
47
 
5
48
  ### Generator Enhancements
6
49
 
@@ -5,7 +5,7 @@ import os
5
5
  import sys
6
6
  from pathlib import Path
7
7
 
8
- __version__ = "4.9.4"
8
+ __version__ = "4.9.5"
9
9
  __all__ = ["CppApi", "CSSL"]
10
10
 
11
11
  # Module-level cache for C++ modules
@@ -1,6 +1,6 @@
1
1
  # CSSL - C-Style Scripting Language
2
2
 
3
- > Version 4.9.3 | A modern scripting language with C++-style syntax featuring async/await, generators, CodeInfusion, BruteInjection, Snapshots, Python/C++ Interop, Multi-Language Support, and 330+ built-in functions.
3
+ > Version 4.9.5 | A modern scripting language with C++-style syntax featuring async/await, generators, CodeInfusion, BruteInjection, Snapshots, Variable Modifiers (local/static/freezed), Python/C++ Interop, Multi-Language Support, and 330+ built-in functions.
4
4
 
5
5
  ---
6
6
 
@@ -368,6 +368,45 @@ snapshot(myVar);
368
368
  printl(%myVar); // Access snapshotted value
369
369
  ```
370
370
 
371
+ ### Variable Modifiers (v4.9.4)
372
+
373
+ Control how variables can be accessed and modified with special modifiers:
374
+
375
+ ```cssl
376
+ // local - forbids global reference (@), allows snapshot (%)
377
+ local int privateCounter = 0;
378
+ @privateCounter; // Returns null (cannot access via @)
379
+ snapshot(privateCounter);
380
+ %privateCounter; // Works normally
381
+
382
+ // static - allows global reference (@), forbids snapshot (%)
383
+ static int cachedValue = 42;
384
+ @cachedValue; // Works normally
385
+ snapshot(cachedValue);
386
+ %cachedValue; // Returns null (cannot snapshot)
387
+
388
+ // local static - forbids both @ and % access
389
+ local static int internalOnly = 100;
390
+ @internalOnly; // Returns null
391
+ %internalOnly; // Returns null
392
+
393
+ // freezed - creates immutable variable (cannot be reassigned)
394
+ freezed string constant = "immutable";
395
+ constant = "new value"; // Returns null (cannot reassign)
396
+
397
+ // Combine modifiers
398
+ freezed local int secretConst = 999; // Immutable and no global access
399
+ ```
400
+
401
+ **Modifier Summary:**
402
+ | Modifier | `@var` (global) | `%var` (snapshot) | Reassignment |
403
+ |----------|-----------------|-------------------|--------------|
404
+ | (none) | ✓ allowed | ✓ allowed | ✓ allowed |
405
+ | `local` | ✗ returns null | ✓ allowed | ✓ allowed |
406
+ | `static` | ✓ allowed | ✗ returns null | ✓ allowed |
407
+ | `local static` | ✗ returns null | ✗ returns null | ✓ allowed |
408
+ | `freezed`| ✓ allowed | ✓ allowed | ✗ returns null |
409
+
371
410
  ---
372
411
 
373
412
  ## Operators
@@ -243,6 +243,7 @@ class CSSLBuiltins:
243
243
 
244
244
  # Type checking
245
245
  self._functions['typeof'] = self.builtin_typeof
246
+ self._functions['nameof'] = self.builtin_nameof # v4.9.4: Get name of function/class/object
246
247
  self._functions['memory'] = self.builtin_memory # v4.8.9: Python repr() for debugging
247
248
  self._functions['address'] = self.builtin_address # v4.9.0: Get address of object
248
249
  self._functions['reflect'] = self.builtin_reflect # v4.9.0: Reflect address to object
@@ -879,6 +880,65 @@ class CSSLBuiltins:
879
880
  }
880
881
  return type_map.get(type(value), type(value).__name__)
881
882
 
883
+ def builtin_nameof(self, value: Any) -> str:
884
+ """Get the name of a function, class, or object.
885
+
886
+ v4.9.4: Returns the identifier name for reflection/debugging.
887
+
888
+ For functions: returns the function name
889
+ For classes: returns the class name
890
+ For instances: returns the class name
891
+ For AST nodes: returns the name from the node value
892
+ For other objects: returns the type name
893
+
894
+ Example:
895
+ define myFunc() { }
896
+ printl(nameof(myFunc)); // "myFunc"
897
+
898
+ class MyClass { }
899
+ printl(nameof(MyClass)); // "MyClass"
900
+
901
+ MyClass obj = new MyClass();
902
+ printl(nameof(obj)); // "MyClass"
903
+ """
904
+ from .cssl_parser import ASTNode
905
+ from .cssl_types import CSSLInstance
906
+
907
+ # AST function node
908
+ if isinstance(value, ASTNode):
909
+ if value.type == 'function':
910
+ func_info = value.value
911
+ if isinstance(func_info, dict):
912
+ return func_info.get('name', '<anonymous>')
913
+ return str(func_info) if func_info else '<anonymous>'
914
+ elif value.type == 'class':
915
+ class_info = value.value
916
+ if isinstance(class_info, dict):
917
+ return class_info.get('name', '<anonymous>')
918
+ return str(class_info) if class_info else '<anonymous>'
919
+ elif value.type == 'identifier':
920
+ return value.value
921
+ return value.type
922
+
923
+ # CSSL class instance
924
+ if isinstance(value, CSSLInstance):
925
+ return value._class.name if hasattr(value, '_class') else type(value).__name__
926
+
927
+ # CSSL class definition (stored as dict with 'name' key)
928
+ if isinstance(value, dict) and 'name' in value:
929
+ return value['name']
930
+
931
+ # Python callable (function)
932
+ if callable(value):
933
+ if hasattr(value, '__name__'):
934
+ return value.__name__
935
+ if hasattr(value, 'name'):
936
+ return value.name
937
+ return type(value).__name__
938
+
939
+ # Fallback to type name
940
+ return type(value).__name__
941
+
882
942
  def builtin_memory(self, value: Any) -> dict:
883
943
  """Get memory/introspection info about a value as a dictionary.
884
944
 
@@ -1069,7 +1129,8 @@ class CSSLBuiltins:
1069
1129
  Returns:
1070
1130
  The result of the last expression or explicit return
1071
1131
  """
1072
- if not self._runtime:
1132
+ # v4.9.4: Fix attribute name - use self.runtime not self._runtime
1133
+ if not self.runtime:
1073
1134
  return None
1074
1135
 
1075
1136
  try:
@@ -1083,17 +1144,17 @@ class CSSLBuiltins:
1083
1144
  # Inject context variables into scope if provided
1084
1145
  if context and isinstance(context, dict):
1085
1146
  for name, value in context.items():
1086
- self._runtime.scope.set(name, value)
1147
+ self.runtime.scope.set(name, value)
1087
1148
 
1088
1149
  # Execute each statement
1089
1150
  result = None
1090
1151
  for node in ast.children:
1091
- result = self._runtime._execute(node)
1152
+ result = self.runtime._execute_node(node)
1092
1153
  # Check for early return
1093
- if self._runtime._return_triggered:
1094
- result = self._runtime._return_value
1095
- self._runtime._return_triggered = False
1096
- self._runtime._return_value = None
1154
+ if self.runtime._return_triggered:
1155
+ result = self.runtime._return_value
1156
+ self.runtime._return_triggered = False
1157
+ self.runtime._return_value = None
1097
1158
  break
1098
1159
 
1099
1160
  return result
@@ -1503,10 +1564,18 @@ class CSSLBuiltins:
1503
1564
  # ============= Time Functions =============
1504
1565
 
1505
1566
  def builtin_now(self) -> float:
1506
- return time.time()
1567
+ import sys
1568
+ result = time.time()
1569
+ sys.stderr.write(f"[DEBUG] builtin_now() called, returning {result}\n")
1570
+ sys.stderr.flush()
1571
+ return result
1507
1572
 
1508
1573
  def builtin_timestamp(self) -> int:
1509
- return int(time.time())
1574
+ import sys
1575
+ result = int(time.time())
1576
+ sys.stderr.write(f"[DEBUG] builtin_timestamp() called, returning {result}\n")
1577
+ sys.stderr.flush()
1578
+ return result
1510
1579
 
1511
1580
  def builtin_sleep(self, seconds: float) -> None:
1512
1581
  time.sleep(seconds)
@@ -4701,6 +4770,8 @@ class CSSLBuiltins:
4701
4770
 
4702
4771
  After snapshotting, access the value with %name syntax.
4703
4772
 
4773
+ v4.9.4: Variables marked as 'static' cannot be snapshotted (returns False, no error)
4774
+
4704
4775
  Example:
4705
4776
  string version = "1.0";
4706
4777
  snapshot(version);
@@ -4739,6 +4810,10 @@ class CSSLBuiltins:
4739
4810
  # Use a generic name based on type and hash
4740
4811
  name = f"_snap_{type(value).__name__}_{id(value)}"
4741
4812
 
4813
+ # v4.9.4: Check if variable is marked as 'static' - cannot be snapshotted
4814
+ if self.runtime and name in self.runtime._var_meta and self.runtime._var_meta[name].get('is_static', False):
4815
+ return False # static variables cannot be snapshotted
4816
+
4742
4817
  # Deep copy to preserve the state
4743
4818
  try:
4744
4819
  snapped_value = copy.deepcopy(value)