openscad-cpp-evaluator 0.8.0__tar.gz → 0.8.1__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 (194) hide show
  1. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/PKG-INFO +1 -1
  2. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/include/openscad_cpp_evaluator/bytecode.hpp +11 -0
  3. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/pyproject.toml +1 -1
  4. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/src/bytecode_compiler.cpp +57 -23
  5. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/src/bytecode_vm.cpp +18 -1
  6. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/tests/test_bytecode_compiler.cpp +40 -16
  7. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/.github/workflows/ci.yml +0 -0
  8. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/.github/workflows/wheels.yml +0 -0
  9. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/.gitignore +0 -0
  10. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/.gitmodules +0 -0
  11. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/CLAUDE.md +0 -0
  12. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/CMakeLists.txt +0 -0
  13. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/LICENSE +0 -0
  14. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/README.md +0 -0
  15. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/bindings/CMakeLists.txt +0 -0
  16. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/bindings/module.cpp +0 -0
  17. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/cmake/embed_font.cmake +0 -0
  18. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/examples/CMakeLists.txt +0 -0
  19. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/examples/eval_perf_benchmark.cpp +0 -0
  20. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/examples/manifold_cache_reuse.cpp +0 -0
  21. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/examples/minimal_debugger.cpp +0 -0
  22. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/.github/workflows/ci.yml +0 -0
  23. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/.gitignore +0 -0
  24. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/CLAUDE.md +0 -0
  25. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/CMakeLists.txt +0 -0
  26. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/README.md +0 -0
  27. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/include/openscad_cpp_parser/api.hpp +0 -0
  28. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/ast_node.hpp +0 -0
  29. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/comments.hpp +0 -0
  30. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/declarations.hpp +0 -0
  31. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/expression.hpp +0 -0
  32. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/module_instantiation.hpp +0 -0
  33. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/scope_builder.hpp +0 -0
  34. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/vector_element.hpp +0 -0
  35. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast.hpp +0 -0
  36. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/include/openscad_cpp_parser/comments.hpp +0 -0
  37. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/include/openscad_cpp_parser/position.hpp +0 -0
  38. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/include/openscad_cpp_parser/pretty_print.hpp +0 -0
  39. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/include/openscad_cpp_parser/scope.hpp +0 -0
  40. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/include/openscad_cpp_parser/serialization.hpp +0 -0
  41. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/include/openscad_cpp_parser/source_map.hpp +0 -0
  42. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/src/CMakeLists.txt +0 -0
  43. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/src/api.cpp +0 -0
  44. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/src/ast/ast_node.cpp +0 -0
  45. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/src/ast/declarations.cpp +0 -0
  46. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/src/ast/expression.cpp +0 -0
  47. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/src/ast/format_utils.hpp +0 -0
  48. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/src/ast/module_instantiation.cpp +0 -0
  49. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/src/ast/scope_builder.cpp +0 -0
  50. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/src/ast/vector_element.cpp +0 -0
  51. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/src/comment_attach_internal.hpp +0 -0
  52. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/src/comments.cpp +0 -0
  53. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/src/grammar/driver.cpp +0 -0
  54. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/src/grammar/driver.hpp +0 -0
  55. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/src/grammar/lexer.l +0 -0
  56. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/src/grammar/lexer_api.hpp +0 -0
  57. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/src/grammar/oscad_location.hpp +0 -0
  58. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/src/grammar/parser.y +0 -0
  59. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/src/inline_comment_attach.cpp +0 -0
  60. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/src/position.cpp +0 -0
  61. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/src/pretty_print.cpp +0 -0
  62. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/src/scope.cpp +0 -0
  63. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/src/serialization/json_io.cpp +0 -0
  64. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/src/serialization/yaml_io.cpp +0 -0
  65. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/src/source_map.cpp +0 -0
  66. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/tests/CMakeLists.txt +0 -0
  67. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/tests/test_assignments.cpp +0 -0
  68. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/tests/test_ast_generation.cpp +0 -0
  69. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/tests/test_comments_and_files.cpp +0 -0
  70. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/tests/test_const_borrow.cpp +0 -0
  71. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/tests/test_control.cpp +0 -0
  72. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/tests/test_expressions.cpp +0 -0
  73. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/tests/test_functions.cpp +0 -0
  74. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/tests/test_helpers.hpp +0 -0
  75. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/tests/test_inline_comments.cpp +0 -0
  76. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/tests/test_lexical.cpp +0 -0
  77. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/tests/test_modules.cpp +0 -0
  78. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/tests/test_node_str.cpp +0 -0
  79. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/tests/test_pretty_print.cpp +0 -0
  80. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/tests/test_scope.cpp +0 -0
  81. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/tests/test_serialization.cpp +0 -0
  82. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/tests/test_smoke.cpp +0 -0
  83. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/tests/test_source_map.cpp +0 -0
  84. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/tests/test_use_include.cpp +0 -0
  85. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/tests/test_vectors.cpp +0 -0
  86. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/tools/cli/CMakeLists.txt +0 -0
  87. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/external/openscad_cpp_parser/tools/cli/main.cpp +0 -0
  88. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/include/openscad_cpp_evaluator/bound_args.hpp +0 -0
  89. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/include/openscad_cpp_evaluator/bytecode_compiler.hpp +0 -0
  90. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/include/openscad_cpp_evaluator/bytecode_vm.hpp +0 -0
  91. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/include/openscad_cpp_evaluator/call_args.hpp +0 -0
  92. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/include/openscad_cpp_evaluator/colored_body.hpp +0 -0
  93. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/include/openscad_cpp_evaluator/csg_node.hpp +0 -0
  94. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/include/openscad_cpp_evaluator/css_colors.hpp +0 -0
  95. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/include/openscad_cpp_evaluator/debug_hooks.hpp +0 -0
  96. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/include/openscad_cpp_evaluator/debug_repl.hpp +0 -0
  97. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/include/openscad_cpp_evaluator/dispatch.hpp +0 -0
  98. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/include/openscad_cpp_evaluator/dxf_svg_import.hpp +0 -0
  99. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/include/openscad_cpp_evaluator/eval_context.hpp +0 -0
  100. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/include/openscad_cpp_evaluator/eval_error.hpp +0 -0
  101. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/include/openscad_cpp_evaluator/eval_use.hpp +0 -0
  102. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/include/openscad_cpp_evaluator/evaluator.hpp +0 -0
  103. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/include/openscad_cpp_evaluator/export.hpp +0 -0
  104. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/include/openscad_cpp_evaluator/font_provider.hpp +0 -0
  105. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/include/openscad_cpp_evaluator/function_builtins.hpp +0 -0
  106. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/include/openscad_cpp_evaluator/import_builtin.hpp +0 -0
  107. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/include/openscad_cpp_evaluator/manifold_cache.hpp +0 -0
  108. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/include/openscad_cpp_evaluator/mesh_import.hpp +0 -0
  109. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/include/openscad_cpp_evaluator/osc_range.hpp +0 -0
  110. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/include/openscad_cpp_evaluator/profile.hpp +0 -0
  111. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/include/openscad_cpp_evaluator/scope_trail.hpp +0 -0
  112. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/include/openscad_cpp_evaluator/segments.hpp +0 -0
  113. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/include/openscad_cpp_evaluator/stb_font_provider.hpp +0 -0
  114. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/include/openscad_cpp_evaluator/surface_load.hpp +0 -0
  115. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/include/openscad_cpp_evaluator/text_metrics.hpp +0 -0
  116. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/include/openscad_cpp_evaluator/value.hpp +0 -0
  117. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/include/openscad_cpp_evaluator/zip_stored.hpp +0 -0
  118. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/python/openscad_cpp_evaluator/__init__.py +0 -0
  119. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/resources/fonts/LICENSE +0 -0
  120. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/resources/fonts/LiberationSans-Regular.ttf +0 -0
  121. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/src/CMakeLists.txt +0 -0
  122. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/src/builtins/booleans.cpp +0 -0
  123. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/src/builtins/builtins.hpp +0 -0
  124. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/src/builtins/call_args.cpp +0 -0
  125. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/src/builtins/color.cpp +0 -0
  126. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/src/builtins/control.cpp +0 -0
  127. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/src/builtins/extrude.cpp +0 -0
  128. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/src/builtins/function_builtins.cpp +0 -0
  129. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/src/builtins/import.cpp +0 -0
  130. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/src/builtins/modifiers.cpp +0 -0
  131. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/src/builtins/primitives_2d.cpp +0 -0
  132. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/src/builtins/primitives_3d.cpp +0 -0
  133. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/src/builtins/registry.cpp +0 -0
  134. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/src/builtins/roof.cpp +0 -0
  135. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/src/builtins/segments.cpp +0 -0
  136. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/src/builtins/surface.cpp +0 -0
  137. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/src/builtins/text.cpp +0 -0
  138. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/src/builtins/topology.cpp +0 -0
  139. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/src/builtins/transforms.cpp +0 -0
  140. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/src/colored_body.cpp +0 -0
  141. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/src/csg_generate.cpp +0 -0
  142. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/src/csg_resolve.cpp +0 -0
  143. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/src/css_colors.cpp +0 -0
  144. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/src/debug/debug_repl.cpp +0 -0
  145. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/src/debug_profile.cpp +0 -0
  146. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/src/eval_context.cpp +0 -0
  147. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/src/eval_error.cpp +0 -0
  148. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/src/eval_use.cpp +0 -0
  149. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/src/export.cpp +0 -0
  150. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/src/expr_eval.cpp +0 -0
  151. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/src/import/dxf_import.cpp +0 -0
  152. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/src/import/mesh_import.cpp +0 -0
  153. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/src/import/surface_load.cpp +0 -0
  154. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/src/import/svg_import.cpp +0 -0
  155. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/src/manifold_cache.cpp +0 -0
  156. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/src/stmt_eval.cpp +0 -0
  157. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/src/text/stb_font_provider.cpp +0 -0
  158. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/src/text/text_metrics.cpp +0 -0
  159. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/src/user_calls.cpp +0 -0
  160. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/src/value.cpp +0 -0
  161. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/src/zip_stored.cpp +0 -0
  162. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/tests/CMakeLists.txt +0 -0
  163. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/tests/test_booleans.cpp +0 -0
  164. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/tests/test_cli.cpp +0 -0
  165. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/tests/test_control_flow.cpp +0 -0
  166. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/tests/test_csg_tree.cpp +0 -0
  167. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/tests/test_debug_hooks.cpp +0 -0
  168. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/tests/test_dxf_svg_import.cpp +0 -0
  169. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/tests/test_eval_context.cpp +0 -0
  170. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/tests/test_export.cpp +0 -0
  171. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/tests/test_expr_eval.cpp +0 -0
  172. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/tests/test_extrude_roof.cpp +0 -0
  173. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/tests/test_function_builtins.cpp +0 -0
  174. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/tests/test_helpers.hpp +0 -0
  175. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/tests/test_import_export.cpp +0 -0
  176. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/tests/test_manifold_cache.cpp +0 -0
  177. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/tests/test_multi_color_merge.cpp +0 -0
  178. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/tests/test_primitives.cpp +0 -0
  179. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/tests/test_profiling.cpp +0 -0
  180. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/tests/test_python_bindings.py +0 -0
  181. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/tests/test_scope_trail.cpp +0 -0
  182. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/tests/test_scoping.cpp +0 -0
  183. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/tests/test_surface.cpp +0 -0
  184. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/tests/test_tail_calls.cpp +0 -0
  185. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/tests/test_text.cpp +0 -0
  186. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/tests/test_transforms.cpp +0 -0
  187. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/tests/test_use.cpp +0 -0
  188. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/tests/test_value.cpp +0 -0
  189. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/tests/test_viewport_params.cpp +0 -0
  190. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/tests/test_zip_stored.cpp +0 -0
  191. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/tools/cli/CMakeLists.txt +0 -0
  192. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/tools/cli/cli_lib.cpp +0 -0
  193. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/tools/cli/cli_lib.hpp +0 -0
  194. {openscad_cpp_evaluator-0.8.0 → openscad_cpp_evaluator-0.8.1}/tools/cli/main.cpp +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openscad_cpp_evaluator
3
- Version: 0.8.0
3
+ Version: 0.8.1
4
4
  Summary: C++ OpenSCAD evaluator with Python bindings
5
5
  Author: NeuSCAD Contributors
6
6
  License-Expression: MIT
@@ -266,6 +266,17 @@ struct CompiledChunk {
266
266
  const oscad::ASTNode* targetDecl = nullptr;
267
267
  int slot = 0;
268
268
  std::string name;
269
+ // Set only when this entry is a `let(name = function(...) ...)`
270
+ // closure's own reference to ITSELF (bytecode_compiler.cpp's LetOp
271
+ // case, the letrec-style pre-declared-slot path) -- Op::MakeClosure
272
+ // can't read this one out of `slots` the way it does every other
273
+ // capture: at the moment it runs, the closure it's building hasn't
274
+ // been constructed yet (StoreLocal for `name` hasn't executed), so
275
+ // `slots[slot]` would still hold whatever was there before this
276
+ // call. See Op::MakeClosure's own runtime doc comment
277
+ // (bytecode_vm.cpp) for how this is actually resolved (deferred,
278
+ // then patched in after construction).
279
+ bool isSelfReference = false;
269
280
  };
270
281
 
271
282
  // One FunctionLiteral's own capture list for Op::MakeClosure, computed
@@ -4,7 +4,7 @@ build-backend = "scikit_build_core.build"
4
4
 
5
5
  [project]
6
6
  name = "openscad_cpp_evaluator"
7
- version = "0.8.0"
7
+ version = "0.8.1"
8
8
  description = "C++ OpenSCAD evaluator with Python bindings"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12"
@@ -68,25 +68,27 @@ void bubbleEscapingCaptures(const CompiledChunk::ClosureSite& site, const oscad:
68
68
  // True if any instruction in `chunk`'s own body/defaults is Op::LoadFree --
69
69
  // i.e. an identifier that resolved to neither a local, a statically-known
70
70
  // enclosing upvalue, nor a dyn ($-prefixed) name at compile time (see
71
- // compileExpr's own Identifier case). A self-referential recursive closure
72
- // (`let(a = function(x,i) ... a(...) ...)`, the reduce()/accumulate()/
73
- // while() idiom) hits exactly this: LetOp's own declareLocal for `a` runs
74
- // only AFTER compiling `a`'s RHS, so `a`'s reference to itself can't
75
- // resolve as an upvalue at compile time and falls through to LoadFree --
76
- // Evaluator::evalIdentifier's own ctx.scope->lookupVariable() fallback,
77
- // which re-evaluates the let-binding's RHS FRESH on every single call,
71
+ // compileExpr's own Identifier case). The direct `let(a = function(...)
72
+ // ... a(...) ...)` self-reference (reduce()/accumulate()/while()'s own
73
+ // idiom) no longer hits this -- see the LetOp case's own letrec pre-declare,
74
+ // below -- but anything the pre-declare doesn't cover still does: `a`
75
+ // wrapped in a ternary/let/anything other than a bare FunctionLiteral RHS
76
+ // (`let(a = cond ? function(...) ...a(...)... : function(...) ...)`),
77
+ // mutual recursion between two sibling let-bound closures (each references
78
+ // the OTHER, which isn't declared yet when compiling the first), or any
79
+ // other free variable this phase simply can't resolve statically. For any
80
+ // of those, Evaluator::evalIdentifier's own ctx.scope->lookupVariable()
81
+ // fallback re-evaluates the let-binding's RHS FRESH on every single call,
78
82
  // producing a new Closure whose capturedLet is THIS invocation's own
79
83
  // ctx.let_ (see expr_eval.cpp's FunctionLiteral case) rather than a stable
80
- // snapshot. Registering such a chunk for compiled invocation (see the
81
- // FunctionLiteral case below) would still be functionally correct -- but
82
- // each recursive call's own capturedLet->openChild() then nests ONE level
83
- // deeper than the last (confirmed empirically: an O(n) list reduce()
84
- // degrading to O(n^2) once compiled), since nothing about that repeated
85
- // fresh-derivation ever re-roots the trail. Excluding a LoadFree-containing
86
- // chunk from registration leaves it running interpreted exactly as before
87
- // (this compile-time gap itself isn't fixed here) -- a real, if imperfect,
88
- // scope for now; closing it -- letting `a` resolve as a genuine upvalue of
89
- // its own declaring LetOp -- is future work, not bundled into this change.
84
+ // snapshot -- registering such a chunk for compiled invocation would still
85
+ // be functionally correct, but each recursive call's own
86
+ // capturedLet->openChild() then nests ONE level deeper than the last
87
+ // (confirmed empirically: an O(n) list reduce() degrading to O(n^2) once
88
+ // compiled, before the letrec pre-declare existed), since nothing about
89
+ // that repeated fresh-derivation ever re-roots the trail. Excluding a
90
+ // LoadFree-containing chunk from registration leaves it running
91
+ // interpreted exactly as before -- correct, if not optimized.
90
92
  bool containsLoadFree(const std::vector<Instruction>& code) {
91
93
  for (const Instruction& ins : code) {
92
94
  if (ins.op == Op::LoadFree) return true;
@@ -350,10 +352,14 @@ public:
350
352
  // below), and for a captures-having one only when its own
351
353
  // body contains no Op::LoadFree -- see containsLoadFree's
352
354
  // own doc comment, above, for why a LoadFree-containing
353
- // captures-having closure (the reduce()/accumulate()/
354
- // while() self-referential-recursion idiom) must still be
355
- // left interpreted: its own capturedLet-chaining, once
356
- // registered, degrades an O(n) reduction into O(n^2).
355
+ // captures-having closure must still be left interpreted:
356
+ // its own capturedLet-chaining, once registered, degrades
357
+ // an O(n) reduction into O(n^2). (The reduce()/
358
+ // accumulate()/while() idiom itself -- a closure directly
359
+ // assigned via `let` that calls itself by name -- no longer
360
+ // hits this: see the LetOp case's own letrec pre-declare,
361
+ // below, which lets that specific self-reference resolve as
362
+ // a real upvalue instead of falling through to LoadFree.)
357
363
  // Everything else (Op::LoadUpvalue/Op::MakeClosure inside a
358
364
  // REGISTERED captures-having chunk) is no longer assumed to
359
365
  // resolve only against a still-live creator frame (see
@@ -561,12 +567,40 @@ public:
561
567
  out.push_back({Op::OpenLocalScope, 0, 0, nullptr});
562
568
  int slotStart = nextSlot_;
563
569
  for (const auto& assign : n.assignments) {
564
- compileExpr(*assign->expr, out, scope); // RHS is never tail
565
570
  const std::string& name = assign->name->name;
571
+ // A DIRECT `name = function(...) ...` RHS -- the
572
+ // reduce()/accumulate()/while() idiom, and count_to()-
573
+ // style helpers generally -- gets its own slot declared
574
+ // BEFORE compiling that RHS (letrec-style), so a
575
+ // self-reference inside the closure's own body resolves
576
+ // as a genuine upvalue (Op::LoadUpvalue) instead of
577
+ // falling through to Op::LoadFree. Every other RHS shape
578
+ // keeps the existing after-the-fact declareLocal below
579
+ // unchanged (`let(x = x + 1)` must still see the OUTER
580
+ // x, not a fresh, not-yet-assigned local shadowing it --
581
+ // only a function-literal RHS has "see myself" as a
582
+ // sensible reading at all). See Op::MakeClosure's own
583
+ // runtime handler (bytecode_vm.cpp) for how the
584
+ // resulting self-capture is actually resolved -- the
585
+ // closure being created doesn't exist yet at the moment
586
+ // its own captures are normally snapshotted, so this
587
+ // one is deferred and patched in after construction
588
+ // instead of read eagerly like every other capture.
589
+ const bool selfBinding = !name.empty() && name[0] != '$' &&
590
+ assign->expr->kind() == oscad::NodeKind::FunctionLiteral;
591
+ int preDeclaredSlot = -1;
592
+ if (selfBinding) preDeclaredSlot = declareLocal(scope, name);
593
+ compileExpr(*assign->expr, out, scope); // RHS is never tail
594
+ if (selfBinding && out.back().op == Op::MakeClosure) {
595
+ CompiledChunk::ClosureSite& site = chunk_.closureSites[static_cast<size_t>(out.back().a)];
596
+ for (auto& cap : site.captures) {
597
+ if (cap.targetDecl == selfDecl_ && cap.slot == preDeclaredSlot) cap.isSelfReference = true;
598
+ }
599
+ }
566
600
  if (!name.empty() && name[0] == '$') {
567
601
  out.push_back({Op::StoreDyn, internName(name), 0, &assign->position()});
568
602
  } else {
569
- int slot = declareLocal(scope, name);
603
+ int slot = selfBinding ? preDeclaredSlot : declareLocal(scope, name);
570
604
  out.push_back({Op::StoreLocal, slot, 0, &assign->position()});
571
605
  }
572
606
  }
@@ -173,7 +173,20 @@ Value runChunk(Evaluator& ev, const CompiledChunk& chunk, const std::vector<Inst
173
173
  // created escaping closure already uses, unchanged.
174
174
  const CompiledChunk::ClosureSite& site = chunk.closureSites[static_cast<size_t>(ins.a)];
175
175
  auto capturedTrail = TrailView<Value>::makeRoot();
176
+ // A letrec-style self-reference (UpvalueRef::isSelfReference,
177
+ // see its own doc comment) is skipped here, not read -- the
178
+ // closure it names is THIS instruction's own result, which
179
+ // doesn't exist until the shared_ptr below is constructed.
180
+ // Patched in immediately afterward via the exact same
181
+ // capturedTrail (a live, shared TrailView -- mutating it
182
+ // after `closure` wraps it is exactly as visible to that
183
+ // closure's own later invocations as any other entry).
184
+ std::vector<const std::string*> selfNames;
176
185
  for (const auto& cap : site.captures) {
186
+ if (cap.isSelfReference) {
187
+ selfNames.push_back(&cap.name);
188
+ continue;
189
+ }
177
190
  if (cap.targetDecl == chunk.selfDecl) {
178
191
  capturedTrail->set(cap.name, slots[static_cast<size_t>(cap.slot)]);
179
192
  continue;
@@ -182,7 +195,11 @@ Value runChunk(Evaluator& ev, const CompiledChunk& chunk, const std::vector<Inst
182
195
  if (!v) v = ctx.let_->find(cap.name);
183
196
  capturedTrail->set(cap.name, v ? *v : Value{});
184
197
  }
185
- stack.push_back(Value{std::make_shared<const Closure>(Closure{site.node, std::move(capturedTrail)})});
198
+ auto closure = std::make_shared<const Closure>(Closure{site.node, capturedTrail});
199
+ for (const std::string* selfName : selfNames) {
200
+ capturedTrail->set(*selfName, Value{closure});
201
+ }
202
+ stack.push_back(Value{std::move(closure)});
186
203
  ++pc;
187
204
  break;
188
205
  }
@@ -608,33 +608,57 @@ TEST(BytecodeCompiler, MultiLevelCurriedClosureInvocationRunsCompiled) {
608
608
  "ECHO: 42\nECHO: 20");
609
609
  }
610
610
 
611
- TEST(BytecodeCompiler, SelfReferentialRecursiveClosureStillRunsInterpretedAndCorrectly) {
612
- ScopedVm vm(true);
613
- // reduce()'s own idiom: `a` calls itself by name, which LetOp's own
614
- // declareLocal-after-compiling-the-RHS ordering means never resolves as
615
- // a genuine upvalue at compile time (falls through to Op::LoadFree
616
- // instead -- see containsLoadFree's own doc comment, bytecode_compiler.cpp).
617
- // Registering such a chunk for compiled invocation is what previously
618
- // (empirically, against a real list) turned an O(n) reduce() into
619
- // O(n^2): every recursive call re-derives a fresh closure via
620
- // Evaluator::evalIdentifier's ctx.scope->lookupVariable() fallback,
621
- // nesting its own capturedLet one level deeper than the last every
622
- // time. `containsLoadFree` excludes exactly this case from
623
- // registration, so `a` keeps running interpreted -- more than 1 stop
624
- // for its own call proves that, and the actual sum must still come out
625
- // right either way.
611
+ TEST(BytecodeCompiler, SelfReferentialRecursiveClosureNowResolvesAsUpvalueAndRunsCompiled) {
612
+ ScopedVm vm(true);
613
+ // reduce()'s own idiom: `a` calls itself by name. A direct
614
+ // `let(a = function(...) ... a(...) ...)` RHS gets `a`'s own slot
615
+ // pre-declared BEFORE compiling that RHS (bytecode_compiler.cpp's
616
+ // LetOp case), letrec-style -- so this self-reference now resolves as
617
+ // a genuine upvalue (Op::LoadUpvalue) instead of falling through to
618
+ // Op::LoadFree, and `a`'s own body is eligible for registration
619
+ // (containsLoadFree no longer sees any unresolved reference in it).
620
+ // Op::MakeClosure's own runtime handler defers this ONE capture
621
+ // (the closure being built doesn't exist yet when its own captures
622
+ // are normally snapshotted) and patches it in immediately after
623
+ // constructing the real closure -- see its own doc comment,
624
+ // bytecode_vm.cpp. This is also what fixed a real O(n) -> O(n^2)
625
+ // regression found while building this feature: every recursive call
626
+ // used to re-derive a FRESH closure via Evaluator::evalIdentifier's
627
+ // ctx.scope->lookupVariable() fallback, nesting its own capturedLet
628
+ // one level deeper than the last -- confirmed via the CLI against a
629
+ // 32,000-element list (7+ seconds -> 0.05s once `a` genuinely
630
+ // resolves itself as an upvalue instead).
631
+ //
632
+ // 11 stops, not 30 (confirmed by diffing against the previous,
633
+ // containsLoadFree-excluded behavior with the same script): `reduce`'s
634
+ // own body-entry (1) + `a`'s own 5 recursive calls (1 each, compiled)
635
+ // + `func`'s own 4 calls (1 each, already compiled even before this --
636
+ // zero captures) + the top-level echo() statement's own stop (module
637
+ // code is never compiled).
626
638
  const int stops = countDebugHookStops(
627
639
  "function reduce(func, list, init=0) = let(l = len(list), a = function (x,i) i<l? "
628
640
  "a(func(x,list[i]), i+1) : x) a(init,0);\n"
629
641
  "echo(reduce(function(p,q) p+q, [1,2,3,4], 0));",
630
642
  std::unordered_map<std::string, std::set<int>>{});
631
- EXPECT_GT(stops, 2);
643
+ EXPECT_EQ(stops, 11);
632
644
  EXPECT_EQ(runCapturingEcho("function reduce(func, list, init=0) = let(l = len(list), a = function (x,i) "
633
645
  "i<l? a(func(x,list[i]), i+1) : x) a(init,0);\n"
634
646
  "echo(reduce(function(p,q) p+q, [1,2,3,4], 0));"),
635
647
  "ECHO: 10");
636
648
  }
637
649
 
650
+ TEST(BytecodeCompiler, PlainLetSelfReferenceStillSeesTheOuterBindingNotItself) {
651
+ ScopedVm vm(true);
652
+ // The letrec pre-declare above is gated on the RHS being a DIRECT
653
+ // FunctionLiteral specifically because a non-function `let(x = x + 1)`
654
+ // must keep seeing the OUTER x (real OpenSCAD/letOp shadowing
655
+ // semantics -- each assignment's RHS sees only what preceded it in the
656
+ // same let, never itself), not a fresh, not-yet-assigned local
657
+ // shadowing it. Confirms that ordinary case is untouched by the
658
+ // FunctionLiteral-only pre-declare.
659
+ EXPECT_EQ(runCapturingEcho("x = 100;\nfunction f() = let(x = x + 1) x;\necho(f());"), "ECHO: 101");
660
+ }
661
+
638
662
  TEST(BytecodeCompiler, ClosureWithDollarParameterStillBailsContainer) {
639
663
  ScopedVm vm(true);
640
664
  // Residual, deliberate limitation: a FunctionLiteral with its OWN