openscad-cpp-evaluator 0.13.2__tar.gz → 0.13.3__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.13.2 → openscad_cpp_evaluator-0.13.3}/PKG-INFO +1 -1
  2. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/include/openscad_cpp_evaluator/evaluator.hpp +37 -0
  3. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/pyproject.toml +1 -1
  4. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/src/user_calls.cpp +12 -1
  5. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/tests/test_bytecode_compiler.cpp +39 -0
  6. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/.github/workflows/ci.yml +0 -0
  7. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/.github/workflows/wheels.yml +0 -0
  8. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/.gitignore +0 -0
  9. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/.gitmodules +0 -0
  10. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/CLAUDE.md +0 -0
  11. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/CMakeLists.txt +0 -0
  12. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/LICENSE +0 -0
  13. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/README.md +0 -0
  14. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/bindings/CMakeLists.txt +0 -0
  15. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/bindings/module.cpp +0 -0
  16. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/cmake/embed_font.cmake +0 -0
  17. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/examples/CMakeLists.txt +0 -0
  18. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/examples/eval_perf_benchmark.cpp +0 -0
  19. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/examples/manifold_cache_reuse.cpp +0 -0
  20. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/examples/minimal_debugger.cpp +0 -0
  21. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/.github/workflows/ci.yml +0 -0
  22. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/.gitignore +0 -0
  23. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/CLAUDE.md +0 -0
  24. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/CMakeLists.txt +0 -0
  25. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/README.md +0 -0
  26. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/api.hpp +0 -0
  27. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/ast_node.hpp +0 -0
  28. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/comments.hpp +0 -0
  29. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/declarations.hpp +0 -0
  30. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/expression.hpp +0 -0
  31. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/module_instantiation.hpp +0 -0
  32. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/scope_builder.hpp +0 -0
  33. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/vector_element.hpp +0 -0
  34. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast.hpp +0 -0
  35. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/comments.hpp +0 -0
  36. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/position.hpp +0 -0
  37. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/pretty_print.hpp +0 -0
  38. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/scope.hpp +0 -0
  39. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/serialization.hpp +0 -0
  40. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/source_map.hpp +0 -0
  41. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/src/CMakeLists.txt +0 -0
  42. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/src/api.cpp +0 -0
  43. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/src/ast/ast_node.cpp +0 -0
  44. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/src/ast/declarations.cpp +0 -0
  45. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/src/ast/expression.cpp +0 -0
  46. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/src/ast/format_utils.hpp +0 -0
  47. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/src/ast/module_instantiation.cpp +0 -0
  48. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/src/ast/scope_builder.cpp +0 -0
  49. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/src/ast/vector_element.cpp +0 -0
  50. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/src/comment_attach_internal.hpp +0 -0
  51. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/src/comments.cpp +0 -0
  52. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/src/grammar/driver.cpp +0 -0
  53. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/src/grammar/driver.hpp +0 -0
  54. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/src/grammar/lexer.l +0 -0
  55. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/src/grammar/lexer_api.hpp +0 -0
  56. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/src/grammar/oscad_location.hpp +0 -0
  57. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/src/grammar/parser.y +0 -0
  58. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/src/inline_comment_attach.cpp +0 -0
  59. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/src/position.cpp +0 -0
  60. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/src/pretty_print.cpp +0 -0
  61. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/src/scope.cpp +0 -0
  62. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/src/serialization/json_io.cpp +0 -0
  63. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/src/serialization/yaml_io.cpp +0 -0
  64. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/src/source_map.cpp +0 -0
  65. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/tests/CMakeLists.txt +0 -0
  66. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/tests/test_assignments.cpp +0 -0
  67. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/tests/test_ast_generation.cpp +0 -0
  68. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/tests/test_comments_and_files.cpp +0 -0
  69. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/tests/test_const_borrow.cpp +0 -0
  70. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/tests/test_control.cpp +0 -0
  71. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/tests/test_expressions.cpp +0 -0
  72. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/tests/test_functions.cpp +0 -0
  73. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/tests/test_helpers.hpp +0 -0
  74. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/tests/test_inline_comments.cpp +0 -0
  75. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/tests/test_lexical.cpp +0 -0
  76. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/tests/test_modules.cpp +0 -0
  77. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/tests/test_node_str.cpp +0 -0
  78. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/tests/test_pretty_print.cpp +0 -0
  79. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/tests/test_scope.cpp +0 -0
  80. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/tests/test_serialization.cpp +0 -0
  81. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/tests/test_smoke.cpp +0 -0
  82. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/tests/test_source_map.cpp +0 -0
  83. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/tests/test_use_include.cpp +0 -0
  84. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/tests/test_vectors.cpp +0 -0
  85. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/tools/cli/CMakeLists.txt +0 -0
  86. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/external/openscad_cpp_parser/tools/cli/main.cpp +0 -0
  87. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/include/openscad_cpp_evaluator/bound_args.hpp +0 -0
  88. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/include/openscad_cpp_evaluator/bytecode.hpp +0 -0
  89. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/include/openscad_cpp_evaluator/bytecode_compiler.hpp +0 -0
  90. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/include/openscad_cpp_evaluator/bytecode_vm.hpp +0 -0
  91. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/include/openscad_cpp_evaluator/call_args.hpp +0 -0
  92. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/include/openscad_cpp_evaluator/colored_body.hpp +0 -0
  93. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/include/openscad_cpp_evaluator/csg_node.hpp +0 -0
  94. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/include/openscad_cpp_evaluator/css_colors.hpp +0 -0
  95. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/include/openscad_cpp_evaluator/debug_hooks.hpp +0 -0
  96. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/include/openscad_cpp_evaluator/debug_repl.hpp +0 -0
  97. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/include/openscad_cpp_evaluator/dispatch.hpp +0 -0
  98. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/include/openscad_cpp_evaluator/dxf_svg_import.hpp +0 -0
  99. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/include/openscad_cpp_evaluator/eval_context.hpp +0 -0
  100. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/include/openscad_cpp_evaluator/eval_error.hpp +0 -0
  101. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/include/openscad_cpp_evaluator/eval_use.hpp +0 -0
  102. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/include/openscad_cpp_evaluator/export.hpp +0 -0
  103. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/include/openscad_cpp_evaluator/font_provider.hpp +0 -0
  104. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/include/openscad_cpp_evaluator/function_builtins.hpp +0 -0
  105. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/include/openscad_cpp_evaluator/import_builtin.hpp +0 -0
  106. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/include/openscad_cpp_evaluator/manifold_cache.hpp +0 -0
  107. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/include/openscad_cpp_evaluator/mesh_import.hpp +0 -0
  108. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/include/openscad_cpp_evaluator/osc_range.hpp +0 -0
  109. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/include/openscad_cpp_evaluator/profile.hpp +0 -0
  110. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/include/openscad_cpp_evaluator/scope_trail.hpp +0 -0
  111. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/include/openscad_cpp_evaluator/segments.hpp +0 -0
  112. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/include/openscad_cpp_evaluator/stb_font_provider.hpp +0 -0
  113. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/include/openscad_cpp_evaluator/surface_load.hpp +0 -0
  114. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/include/openscad_cpp_evaluator/text_metrics.hpp +0 -0
  115. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/include/openscad_cpp_evaluator/value.hpp +0 -0
  116. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/include/openscad_cpp_evaluator/zip_stored.hpp +0 -0
  117. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/python/openscad_cpp_evaluator/__init__.py +0 -0
  118. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/resources/fonts/LICENSE +0 -0
  119. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/resources/fonts/LiberationSans-Regular.ttf +0 -0
  120. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/src/CMakeLists.txt +0 -0
  121. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/src/builtins/booleans.cpp +0 -0
  122. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/src/builtins/builtins.hpp +0 -0
  123. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/src/builtins/call_args.cpp +0 -0
  124. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/src/builtins/color.cpp +0 -0
  125. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/src/builtins/control.cpp +0 -0
  126. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/src/builtins/extrude.cpp +0 -0
  127. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/src/builtins/function_builtins.cpp +0 -0
  128. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/src/builtins/import.cpp +0 -0
  129. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/src/builtins/modifiers.cpp +0 -0
  130. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/src/builtins/primitives_2d.cpp +0 -0
  131. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/src/builtins/primitives_3d.cpp +0 -0
  132. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/src/builtins/registry.cpp +0 -0
  133. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/src/builtins/roof.cpp +0 -0
  134. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/src/builtins/segments.cpp +0 -0
  135. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/src/builtins/surface.cpp +0 -0
  136. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/src/builtins/text.cpp +0 -0
  137. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/src/builtins/topology.cpp +0 -0
  138. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/src/builtins/transforms.cpp +0 -0
  139. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/src/bytecode_compiler.cpp +0 -0
  140. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/src/bytecode_vm.cpp +0 -0
  141. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/src/colored_body.cpp +0 -0
  142. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/src/csg_generate.cpp +0 -0
  143. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/src/csg_resolve.cpp +0 -0
  144. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/src/css_colors.cpp +0 -0
  145. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/src/debug/debug_repl.cpp +0 -0
  146. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/src/debug_profile.cpp +0 -0
  147. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/src/eval_context.cpp +0 -0
  148. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/src/eval_error.cpp +0 -0
  149. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/src/eval_use.cpp +0 -0
  150. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/src/export.cpp +0 -0
  151. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/src/expr_eval.cpp +0 -0
  152. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/src/import/dxf_import.cpp +0 -0
  153. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/src/import/mesh_import.cpp +0 -0
  154. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/src/import/surface_load.cpp +0 -0
  155. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/src/import/svg_import.cpp +0 -0
  156. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/src/manifold_cache.cpp +0 -0
  157. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/src/stmt_eval.cpp +0 -0
  158. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/src/text/stb_font_provider.cpp +0 -0
  159. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/src/text/text_metrics.cpp +0 -0
  160. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/src/value.cpp +0 -0
  161. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/src/zip_stored.cpp +0 -0
  162. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/tests/CMakeLists.txt +0 -0
  163. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/tests/test_booleans.cpp +0 -0
  164. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/tests/test_cli.cpp +0 -0
  165. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/tests/test_control_flow.cpp +0 -0
  166. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/tests/test_csg_tree.cpp +0 -0
  167. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/tests/test_debug_hooks.cpp +0 -0
  168. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/tests/test_dxf_svg_import.cpp +0 -0
  169. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/tests/test_eval_context.cpp +0 -0
  170. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/tests/test_export.cpp +0 -0
  171. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/tests/test_expr_eval.cpp +0 -0
  172. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/tests/test_extrude_roof.cpp +0 -0
  173. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/tests/test_function_builtins.cpp +0 -0
  174. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/tests/test_helpers.hpp +0 -0
  175. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/tests/test_import_export.cpp +0 -0
  176. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/tests/test_manifold_cache.cpp +0 -0
  177. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/tests/test_multi_color_merge.cpp +0 -0
  178. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/tests/test_primitives.cpp +0 -0
  179. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/tests/test_profiling.cpp +0 -0
  180. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/tests/test_python_bindings.py +0 -0
  181. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/tests/test_scope_trail.cpp +0 -0
  182. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/tests/test_scoping.cpp +0 -0
  183. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/tests/test_surface.cpp +0 -0
  184. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/tests/test_tail_calls.cpp +0 -0
  185. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/tests/test_text.cpp +0 -0
  186. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/tests/test_transforms.cpp +0 -0
  187. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/tests/test_use.cpp +0 -0
  188. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/tests/test_value.cpp +0 -0
  189. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/tests/test_viewport_params.cpp +0 -0
  190. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/tests/test_zip_stored.cpp +0 -0
  191. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/tools/cli/CMakeLists.txt +0 -0
  192. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/tools/cli/cli_lib.cpp +0 -0
  193. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/tools/cli/cli_lib.hpp +0 -0
  194. {openscad_cpp_evaluator-0.13.2 → openscad_cpp_evaluator-0.13.3}/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.13.2
3
+ Version: 0.13.3
4
4
  Summary: C++ OpenSCAD evaluator with Python bindings
5
5
  Author: NeuSCAD Contributors
6
6
  License-Expression: MIT
@@ -1218,6 +1218,12 @@ public:
1218
1218
  // and callStack_.back() is already gone by the time it runs. See
1219
1219
  // activeDeclRefcount_'s own doc comment.
1220
1220
  const oscad::ASTNode* declNode = nullptr;
1221
+ // True only when THIS call incremented nativeUserCallDepth_ (i.e.
1222
+ // skipDepthGuard was false) -- exitUserCall* needs it to decrement
1223
+ // symmetrically, for the same "callStack_.back() is already gone"
1224
+ // reason as `kind`/`declNode` above. See nativeUserCallDepth_'s
1225
+ // own doc comment for why this can't just be "always decrement".
1226
+ bool countedTowardNativeDepth = false;
1221
1227
  };
1222
1228
  // `skipDepthGuard`: kMaxUserCallDepth=50 exists purely to keep the
1223
1229
  // NATIVE C++ stack from overflowing (see its own doc comment) -- true
@@ -1427,6 +1433,37 @@ private:
1427
1433
  // eval_error.hpp).
1428
1434
  std::vector<CallStackFrame> callStack_;
1429
1435
 
1436
+ // Count of callStack_ entries that ACTUALLY cost native C++ stack --
1437
+ // i.e. pushed with skipDepthGuard=false (enterUserCall's own
1438
+ // interpreted-call sites: evalUserFunctionCore, evalUserModule).
1439
+ // Deliberately NOT the same number as callStack_.size(): a compiled-
1440
+ // to-compiled push (pushBracketedCallFrame/pushBracketedModuleFrame,
1441
+ // bytecode_vm.cpp, skipDepthGuard=true) still grows callStack_ (for
1442
+ // TRACE/closure-detection/$parent_modules bookkeeping) but costs ZERO
1443
+ // native stack, serviced by driveVm's own heap-based loop instead.
1444
+ //
1445
+ // Checking callStack_.size() itself against kMaxUserCallDepth (the
1446
+ // ORIGINAL design) conflates these two: a real BOSL2 script's own
1447
+ // AMBIENT callStack_ depth, inflated by many cheap skip=true compiled
1448
+ // module-call pushes sitting on callStack_ already, could push a
1449
+ // LATER genuinely-native-recursive call (e.g. an interpreted-path
1450
+ // function call like BOSL2's own `ident()`) over the threshold even
1451
+ // though the REAL native C++ nesting at that point was nowhere near
1452
+ // it -- caught for real: Anklet.scad's own ambient callStack_ depth
1453
+ // (mostly cheap Op::CallModule pushes) reached the mid-30s, tripping
1454
+ // kMaxUserCallDepth=30 for an `ident()` call that itself was nested
1455
+ // only a couple of GENUINE native frames deep. Exactly the same class
1456
+ // of "fixed-count guard conflates logical depth with native-stack
1457
+ // cost" bug driveVmNativeDepth_ already exists to avoid for the
1458
+ // OTHER guard site (bytecode_vm.cpp) -- this is that same fix,
1459
+ // applied here. Incremented/decremented symmetrically by
1460
+ // enterUserCall/exitUserCallSuccess/exitUserCallException, gated on
1461
+ // UserCallHandle::countedTowardNativeDepth (skipDepthGuard is only
1462
+ // available at enter time; the handle carries the decision forward
1463
+ // to exit time, since callStack_.back() -- and thus skipDepthGuard's
1464
+ // own original context -- is already gone by then).
1465
+ size_t nativeUserCallDepth_ = 0;
1466
+
1430
1467
  // Running count of Module-kind frames currently on callStack_ --
1431
1468
  // maintained incrementally by enterUserCall/exitUserCall* rather than
1432
1469
  // rescanned from callStack_ on every module call (buildModuleChildCtx's
@@ -4,7 +4,7 @@ build-backend = "scikit_build_core.build"
4
4
 
5
5
  [project]
6
6
  name = "openscad_cpp_evaluator"
7
- version = "0.13.2"
7
+ version = "0.13.3"
8
8
  description = "C++ OpenSCAD evaluator with Python bindings"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12"
@@ -682,13 +682,22 @@ Evaluator::UserCallHandle Evaluator::enterUserCall(const std::string& name, cons
682
682
  // entirely; for what's left, the margin check is the proven-UNSAFE
683
683
  // mechanism on Windows (confirmed via real CI), this fixed count the
684
684
  // proven-safe one.
685
- if (!skipDepthGuard && callStack_.size() >= kMaxUserCallDepth) {
685
+ //
686
+ // Checked against nativeUserCallDepth_, NOT callStack_.size() -- see
687
+ // that field's own doc comment (evaluator.hpp) for why: callStack_
688
+ // also grows from cheap, zero-native-cost skipDepthGuard=true pushes,
689
+ // which must not count toward this native-stack-safety ceiling.
690
+ if (!skipDepthGuard && nativeUserCallDepth_ >= kMaxUserCallDepth) {
686
691
  error("Recursion too deep while calling " + std::string(isModule ? "module" : "function") + " '" + name + "'",
687
692
  declNode);
688
693
  }
689
694
  UserCallHandle h;
690
695
  h.kind = kind;
691
696
  h.declNode = &declNode;
697
+ if (!skipDepthGuard) {
698
+ ++nativeUserCallDepth_;
699
+ h.countedTowardNativeDepth = true;
700
+ }
692
701
  h.prof = profileEnter(isModule ? "module" : "function", name, callPos, &declNode.position());
693
702
  callStack_.push_back(CallStackFrame{kind, name, callPos, &declNode.position(), &declNode, nullptr, upvalueParent});
694
703
  callStack_.back().bodyCtx = &childCtx; // per-frame locals for the debugger
@@ -710,6 +719,7 @@ void Evaluator::exitUserCallSuccess(const std::string& name, const UserCallHandl
710
719
  if (fireReturnHook && debugHooks_.returnHook) debugHooks_.returnHook(name, result, static_cast<int>(callStack_.size()));
711
720
  callStack_.pop_back();
712
721
  if (handle.kind == CallStackFrame::Kind::Module) --moduleCallDepth_;
722
+ if (handle.countedTowardNativeDepth) --nativeUserCallDepth_;
713
723
  noteActiveDeclExit(handle.declNode);
714
724
  if (handle.prof) profileExit(*handle.prof);
715
725
  }
@@ -717,6 +727,7 @@ void Evaluator::exitUserCallSuccess(const std::string& name, const UserCallHandl
717
727
  void Evaluator::exitUserCallException(const UserCallHandle& handle) {
718
728
  callStack_.pop_back();
719
729
  if (handle.kind == CallStackFrame::Kind::Module) --moduleCallDepth_;
730
+ if (handle.countedTowardNativeDepth) --nativeUserCallDepth_;
720
731
  noteActiveDeclExit(handle.declNode);
721
732
  if (handle.prof) profileExit(*handle.prof);
722
733
  }
@@ -1390,6 +1390,45 @@ TEST(ModuleBodyCompiles, UnionWrappedRecursionStillHitsTheNativeReentryGuardCont
1390
1390
  }
1391
1391
  }
1392
1392
 
1393
+ // Regression test for a real bug this same investigation caught:
1394
+ // enterUserCall's own depth guard used to check callStack_.size()
1395
+ // directly -- but callStack_ also grows from cheap, zero-native-cost
1396
+ // COMPILED module-call pushes (skipDepthGuard=true), which must not
1397
+ // count toward the native-stack-safety ceiling a LATER genuinely
1398
+ // interpreted call (skipDepthGuard=false) is guarded by. Caught for
1399
+ // real: a live BOSL2 script's own ambient callStack_ depth (mostly
1400
+ // compiled Op::CallModule pushes) reached the mid-30s, tripping
1401
+ // kMaxUserCallDepth=30 for a plain function call even though the REAL
1402
+ // native C++ nesting at that point was nowhere near it. Fixed via
1403
+ // nativeUserCallDepth_ (evaluator.hpp), a separate counter incremented
1404
+ // only for skipDepthGuard=false pushes.
1405
+ //
1406
+ // recur() recurses 100 levels deep via bare `recur(n-1);` (pure
1407
+ // Op::CallModule, skipDepthGuard=true, zero native cost, well past the
1408
+ // old kMaxUserCallDepth=30) before calling leaf() at the base case --
1409
+ // forced to run INTERPRETED (skipDepthGuard=false) via a fast-continue
1410
+ // breakpoint on its own declaration line (mirrors countDebugHookStops'
1411
+ // own "force one specific chunk native" trick, above this file's first
1412
+ // TEST). Before the fix, this leaf() call -- genuinely nested only 1
1413
+ // real native frame deep -- would have falsely tripped the guard purely
1414
+ // from callStack_'s own ambient depth.
1415
+ TEST(ModuleBodyCompiles, DeepCompiledModuleRecursionDoesNotFalselyTripTheInterpretedFunctionGuard) {
1416
+ ScopedVm vm(true);
1417
+ DebugHooks hooks;
1418
+ hooks.debugHook = [](int, int, bool, bool, const std::string&, const std::vector<CallStackFrame>&,
1419
+ const DebugFramesFn&) { return DebugAction{}; };
1420
+ Evaluator ev(EchoFn{}, nullptr, nullptr, hooks);
1421
+ ev.setFastContinueBreakpoints(std::unordered_map<std::string, std::set<int>>{{"<string>", {2}}});
1422
+ auto ast = parseSrc("module recur(n) { if (n > 0) { recur(n - 1); } else { cube(leaf()); } }\n"
1423
+ "function leaf() = 1;\n"
1424
+ "recur(100);");
1425
+ auto scope = oscad::buildScopes(ast);
1426
+ EvalContext ctx = EvalContext::makeRoot(scope.get());
1427
+ std::vector<std::unique_ptr<CSGNode>> tree = ev.resolveTree(ast, ctx);
1428
+ ASSERT_EQ(tree.size(), 1u);
1429
+ EXPECT_EQ(tree[0]->kind, "cube");
1430
+ }
1431
+
1393
1432
  // The realistic case the NativeStatement-gap fix actually targets: the
1394
1433
  // RECURSIVE call itself is a bare statement (pure Op::CallModule, zero
1395
1434
  // native stack, bounded only by the heap-sized kMaxVmCallStackDepth), and