openscad-cpp-evaluator 0.6.0__tar.gz → 0.6.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.6.0 → openscad_cpp_evaluator-0.6.1}/PKG-INFO +1 -1
  2. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/pyproject.toml +1 -1
  3. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/bytecode_vm.cpp +29 -0
  4. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/user_calls.cpp +26 -0
  5. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_tail_calls.cpp +29 -16
  6. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/.github/workflows/ci.yml +0 -0
  7. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/.github/workflows/wheels.yml +0 -0
  8. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/.gitignore +0 -0
  9. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/.gitmodules +0 -0
  10. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/CLAUDE.md +0 -0
  11. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/CMakeLists.txt +0 -0
  12. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/LICENSE +0 -0
  13. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/README.md +0 -0
  14. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/bindings/CMakeLists.txt +0 -0
  15. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/bindings/module.cpp +0 -0
  16. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/cmake/embed_font.cmake +0 -0
  17. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/examples/CMakeLists.txt +0 -0
  18. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/examples/eval_perf_benchmark.cpp +0 -0
  19. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/examples/manifold_cache_reuse.cpp +0 -0
  20. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/examples/minimal_debugger.cpp +0 -0
  21. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/.github/workflows/ci.yml +0 -0
  22. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/.gitignore +0 -0
  23. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/CLAUDE.md +0 -0
  24. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/CMakeLists.txt +0 -0
  25. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/README.md +0 -0
  26. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/include/openscad_cpp_parser/api.hpp +0 -0
  27. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/ast_node.hpp +0 -0
  28. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/comments.hpp +0 -0
  29. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/declarations.hpp +0 -0
  30. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/expression.hpp +0 -0
  31. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/module_instantiation.hpp +0 -0
  32. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/scope_builder.hpp +0 -0
  33. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/vector_element.hpp +0 -0
  34. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast.hpp +0 -0
  35. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/include/openscad_cpp_parser/comments.hpp +0 -0
  36. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/include/openscad_cpp_parser/position.hpp +0 -0
  37. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/include/openscad_cpp_parser/pretty_print.hpp +0 -0
  38. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/include/openscad_cpp_parser/scope.hpp +0 -0
  39. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/include/openscad_cpp_parser/serialization.hpp +0 -0
  40. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/include/openscad_cpp_parser/source_map.hpp +0 -0
  41. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/src/CMakeLists.txt +0 -0
  42. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/src/api.cpp +0 -0
  43. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/src/ast/ast_node.cpp +0 -0
  44. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/src/ast/declarations.cpp +0 -0
  45. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/src/ast/expression.cpp +0 -0
  46. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/src/ast/format_utils.hpp +0 -0
  47. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/src/ast/module_instantiation.cpp +0 -0
  48. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/src/ast/scope_builder.cpp +0 -0
  49. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/src/ast/vector_element.cpp +0 -0
  50. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/src/comment_attach_internal.hpp +0 -0
  51. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/src/comments.cpp +0 -0
  52. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/src/grammar/driver.cpp +0 -0
  53. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/src/grammar/driver.hpp +0 -0
  54. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/src/grammar/lexer.l +0 -0
  55. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/src/grammar/lexer_api.hpp +0 -0
  56. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/src/grammar/oscad_location.hpp +0 -0
  57. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/src/grammar/parser.y +0 -0
  58. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/src/inline_comment_attach.cpp +0 -0
  59. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/src/position.cpp +0 -0
  60. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/src/pretty_print.cpp +0 -0
  61. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/src/scope.cpp +0 -0
  62. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/src/serialization/json_io.cpp +0 -0
  63. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/src/serialization/yaml_io.cpp +0 -0
  64. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/src/source_map.cpp +0 -0
  65. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/tests/CMakeLists.txt +0 -0
  66. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/tests/test_assignments.cpp +0 -0
  67. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/tests/test_ast_generation.cpp +0 -0
  68. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/tests/test_comments_and_files.cpp +0 -0
  69. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/tests/test_const_borrow.cpp +0 -0
  70. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/tests/test_control.cpp +0 -0
  71. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/tests/test_expressions.cpp +0 -0
  72. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/tests/test_functions.cpp +0 -0
  73. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/tests/test_helpers.hpp +0 -0
  74. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/tests/test_inline_comments.cpp +0 -0
  75. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/tests/test_lexical.cpp +0 -0
  76. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/tests/test_modules.cpp +0 -0
  77. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/tests/test_node_str.cpp +0 -0
  78. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/tests/test_pretty_print.cpp +0 -0
  79. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/tests/test_scope.cpp +0 -0
  80. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/tests/test_serialization.cpp +0 -0
  81. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/tests/test_smoke.cpp +0 -0
  82. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/tests/test_source_map.cpp +0 -0
  83. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/tests/test_use_include.cpp +0 -0
  84. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/tests/test_vectors.cpp +0 -0
  85. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/tools/cli/CMakeLists.txt +0 -0
  86. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/tools/cli/main.cpp +0 -0
  87. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/bound_args.hpp +0 -0
  88. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/bytecode.hpp +0 -0
  89. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/bytecode_compiler.hpp +0 -0
  90. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/bytecode_vm.hpp +0 -0
  91. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/call_args.hpp +0 -0
  92. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/colored_body.hpp +0 -0
  93. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/csg_node.hpp +0 -0
  94. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/css_colors.hpp +0 -0
  95. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/debug_hooks.hpp +0 -0
  96. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/debug_repl.hpp +0 -0
  97. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/dispatch.hpp +0 -0
  98. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/dxf_svg_import.hpp +0 -0
  99. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/eval_context.hpp +0 -0
  100. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/eval_error.hpp +0 -0
  101. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/eval_use.hpp +0 -0
  102. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/evaluator.hpp +0 -0
  103. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/export.hpp +0 -0
  104. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/font_provider.hpp +0 -0
  105. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/function_builtins.hpp +0 -0
  106. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/import_builtin.hpp +0 -0
  107. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/manifold_cache.hpp +0 -0
  108. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/mesh_import.hpp +0 -0
  109. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/osc_range.hpp +0 -0
  110. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/profile.hpp +0 -0
  111. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/scope_trail.hpp +0 -0
  112. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/segments.hpp +0 -0
  113. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/stb_font_provider.hpp +0 -0
  114. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/surface_load.hpp +0 -0
  115. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/text_metrics.hpp +0 -0
  116. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/value.hpp +0 -0
  117. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/zip_stored.hpp +0 -0
  118. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/python/openscad_cpp_evaluator/__init__.py +0 -0
  119. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/resources/fonts/LICENSE +0 -0
  120. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/resources/fonts/LiberationSans-Regular.ttf +0 -0
  121. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/CMakeLists.txt +0 -0
  122. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/builtins/booleans.cpp +0 -0
  123. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/builtins/builtins.hpp +0 -0
  124. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/builtins/call_args.cpp +0 -0
  125. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/builtins/color.cpp +0 -0
  126. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/builtins/control.cpp +0 -0
  127. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/builtins/extrude.cpp +0 -0
  128. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/builtins/function_builtins.cpp +0 -0
  129. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/builtins/import.cpp +0 -0
  130. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/builtins/modifiers.cpp +0 -0
  131. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/builtins/primitives_2d.cpp +0 -0
  132. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/builtins/primitives_3d.cpp +0 -0
  133. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/builtins/registry.cpp +0 -0
  134. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/builtins/roof.cpp +0 -0
  135. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/builtins/segments.cpp +0 -0
  136. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/builtins/surface.cpp +0 -0
  137. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/builtins/text.cpp +0 -0
  138. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/builtins/topology.cpp +0 -0
  139. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/builtins/transforms.cpp +0 -0
  140. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/bytecode_compiler.cpp +0 -0
  141. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/colored_body.cpp +0 -0
  142. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/csg_generate.cpp +0 -0
  143. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/csg_resolve.cpp +0 -0
  144. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/css_colors.cpp +0 -0
  145. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/debug/debug_repl.cpp +0 -0
  146. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/debug_profile.cpp +0 -0
  147. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/eval_context.cpp +0 -0
  148. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/eval_error.cpp +0 -0
  149. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/eval_use.cpp +0 -0
  150. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/export.cpp +0 -0
  151. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/expr_eval.cpp +0 -0
  152. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/import/dxf_import.cpp +0 -0
  153. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/import/mesh_import.cpp +0 -0
  154. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/import/surface_load.cpp +0 -0
  155. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/import/svg_import.cpp +0 -0
  156. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/manifold_cache.cpp +0 -0
  157. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/stmt_eval.cpp +0 -0
  158. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/text/stb_font_provider.cpp +0 -0
  159. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/text/text_metrics.cpp +0 -0
  160. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/value.cpp +0 -0
  161. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/zip_stored.cpp +0 -0
  162. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/CMakeLists.txt +0 -0
  163. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_booleans.cpp +0 -0
  164. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_bytecode_compiler.cpp +0 -0
  165. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_cli.cpp +0 -0
  166. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_control_flow.cpp +0 -0
  167. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_csg_tree.cpp +0 -0
  168. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_debug_hooks.cpp +0 -0
  169. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_dxf_svg_import.cpp +0 -0
  170. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_eval_context.cpp +0 -0
  171. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_export.cpp +0 -0
  172. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_expr_eval.cpp +0 -0
  173. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_extrude_roof.cpp +0 -0
  174. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_function_builtins.cpp +0 -0
  175. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_helpers.hpp +0 -0
  176. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_import_export.cpp +0 -0
  177. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_manifold_cache.cpp +0 -0
  178. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_multi_color_merge.cpp +0 -0
  179. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_primitives.cpp +0 -0
  180. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_profiling.cpp +0 -0
  181. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_python_bindings.py +0 -0
  182. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_scope_trail.cpp +0 -0
  183. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_scoping.cpp +0 -0
  184. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_surface.cpp +0 -0
  185. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_text.cpp +0 -0
  186. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_transforms.cpp +0 -0
  187. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_use.cpp +0 -0
  188. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_value.cpp +0 -0
  189. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_viewport_params.cpp +0 -0
  190. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_zip_stored.cpp +0 -0
  191. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tools/cli/CMakeLists.txt +0 -0
  192. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tools/cli/cli_lib.cpp +0 -0
  193. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tools/cli/cli_lib.hpp +0 -0
  194. {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.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.6.0
3
+ Version: 0.6.1
4
4
  Summary: C++ OpenSCAD evaluator with Python bindings
5
5
  Author: NeuSCAD Contributors
6
6
  License-Expression: MIT
@@ -4,7 +4,7 @@ build-backend = "scikit_build_core.build"
4
4
 
5
5
  [project]
6
6
  name = "openscad_cpp_evaluator"
7
- version = "0.6.0"
7
+ version = "0.6.1"
8
8
  description = "C++ OpenSCAD evaluator with Python bindings"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12"
@@ -664,10 +664,38 @@ Value runCompiledFunctionFromBound(Evaluator& ev, const CompiledChunk& chunk, co
664
664
  // *stack* growth (what this trampoline exists to eliminate) for heap
665
665
  // growth instead -- O(iteration count) EvalContext objects, bounded by
666
666
  // available RAM rather than a ~few-MB thread stack.
667
+ namespace {
668
+ // Tears a trampoline's own `chain` down back-to-front on EVERY exit path --
669
+ // normal return OR exception unwind (recordTailCallHop's own recursion-guard
670
+ // error is the exact case that matters: an infinite tail-recursive function
671
+ // with no base case throws out of the loop entirely, bypassing any teardown
672
+ // code placed after it). Relying on `chain` simply falling out of scope
673
+ // instead is NOT equivalent: std::vector<T>'s own element-destruction order
674
+ // is unspecified by the standard -- libc++ destroys back-to-front (matching
675
+ // ScopeTrailStorage::popLevel's own "scan from the back" doc comment, which
676
+ // assumes the level being popped is usually the most recently pushed one --
677
+ // O(1) per pop that way), but libstdc++ destroys front-to-back, the
678
+ // adversarial order for that same scan -- each pop then walks almost the
679
+ // entire remaining vector, turning an intended O(N) teardown into a real,
680
+ // measured O(N^2) (see issue #50: an N-scaling experiment plus a minimal
681
+ // repro proving libc++/libstdc++ disagree on std::vector<T>::clear()'s
682
+ // destruction order for identical source). Popping back-to-front explicitly,
683
+ // via a destructor that always runs before `chain`'s own, is correct AND
684
+ // O(N) on every standard library and every exit path, not just the ones
685
+ // that happen to agree with libc++ and return normally.
686
+ struct ChainTeardown {
687
+ std::vector<EvalContext>& chain;
688
+ ~ChainTeardown() {
689
+ while (!chain.empty()) chain.pop_back();
690
+ }
691
+ };
692
+ } // namespace
693
+
667
694
  Value runCompiledFunctionTrampoline(Evaluator& ev, const CompiledChunk& chunk,
668
695
  const std::vector<std::unique_ptr<oscad::Argument>>& arguments,
669
696
  EvalContext& callerCtx, EvalContext& childCtx) {
670
697
  std::vector<EvalContext> chain{childCtx};
698
+ ChainTeardown teardown{chain};
671
699
  TailCallRequest req;
672
700
  Value result = runCompiledFunction(ev, chunk, arguments, callerCtx, chain.back(), &req);
673
701
  unsigned recursionGuard = 0;
@@ -689,6 +717,7 @@ Value runCompiledFunctionTrampoline(Evaluator& ev, const CompiledChunk& chunk,
689
717
  Value runCompiledFunctionFromBoundTrampoline(Evaluator& ev, const CompiledChunk& chunk, const BoundArgs& bound,
690
718
  EvalContext& childCtx) {
691
719
  std::vector<EvalContext> chain{childCtx};
720
+ ChainTeardown teardown{chain};
692
721
  TailCallRequest req;
693
722
  Value result = runCompiledFunctionFromBound(ev, chunk, bound, chain.back(), &req);
694
723
  unsigned recursionGuard = 0;
@@ -443,6 +443,32 @@ Value Evaluator::evalFunctionBodyTrampoline(const oscad::Expression& bodyExpr, E
443
443
  // dropped there) if memory ever measurably matters more than this
444
444
  // simpler all-or-nothing approach.
445
445
  std::vector<EvalContext> chain{ctx};
446
+ // Tears `chain` down back-to-front on EVERY exit path -- normal return
447
+ // OR exception unwind (recordTailCallHop's own recursion-guard error,
448
+ // below, is the exact case that matters: an infinite tail-recursive
449
+ // function with no base case throws out of this loop entirely,
450
+ // bypassing any teardown code placed after it). Relying on `chain`
451
+ // simply falling out of scope instead is NOT equivalent: std::vector<T>'s
452
+ // own element-destruction order is unspecified by the standard --
453
+ // libc++ destroys back-to-front (matching ScopeTrailStorage::popLevel's
454
+ // own "scan from the back" doc comment, which assumes the level being
455
+ // popped is usually the most recently pushed one -- O(1) per pop that
456
+ // way), but libstdc++ destroys front-to-back, the adversarial order for
457
+ // that same scan -- each pop then walks almost the entire remaining
458
+ // vector, turning an intended O(N) teardown into a real, measured
459
+ // O(N^2) (see issue #50: an N-scaling experiment plus a minimal repro
460
+ // proving libc++/libstdc++ disagree on std::vector<T>::clear()'s
461
+ // destruction order for identical source). Popping back-to-front
462
+ // explicitly, via a destructor that always runs before `chain`'s own,
463
+ // is correct AND O(N) on every standard library and every exit path,
464
+ // not just the ones that happen to agree with libc++ and return
465
+ // normally.
466
+ struct ChainTeardown {
467
+ std::vector<EvalContext>& chain;
468
+ ~ChainTeardown() {
469
+ while (!chain.empty()) chain.pop_back();
470
+ }
471
+ } teardown{chain};
446
472
  unsigned recursionGuard = 0;
447
473
  while (true) {
448
474
  auto result = simplifyTailStep(*expr, ctx);
@@ -19,6 +19,7 @@
19
19
 
20
20
  #include "test_helpers.hpp"
21
21
 
22
+ #include <chrono>
22
23
  #include <gtest/gtest.h>
23
24
 
24
25
  using namespace oscadeval;
@@ -126,17 +127,6 @@ TEST(TailCalls, NonTailRecursionIsUnaffectedByTheTrampoline) {
126
127
  }
127
128
 
128
129
  TEST(TailCalls, InfiniteTailRecursionHitsTheIterationCapInsteadOfHanging) {
129
- #ifndef __APPLE__
130
- // Skipped on non-Apple platforms: this drives the interpreter trampoline
131
- // to the full 1,000,000-iteration recursion-guard cap, which is O(N)
132
- // under Clang/libc++ (~1s) but a confirmed O(N^2) under GCC/libstdc++
133
- // (and, empirically, MSVC's STL too) -- 25-50+ minutes instead of
134
- // seconds. See https://github.com/BelfrySCAD/openscad_cpp_evaluator/issues/50
135
- // for the full investigation (peak RSS/CPU/instruction-count evidence
136
- // and an N-scaling experiment proving the asymptotic-complexity gap).
137
- // Re-enable once that's root-caused and fixed.
138
- GTEST_SKIP() << "O(N^2) under this toolchain -- see issue #50";
139
- #endif
140
130
  ScopedVm vm(false);
141
131
  Evaluator ev;
142
132
  auto ast = parseSrc("function loop(n) = loop(n + 1);\nresult = loop(0);");
@@ -150,11 +140,6 @@ TEST(TailCalls, InfiniteTailRecursionHitsTheIterationCapInsteadOfHanging) {
150
140
  }
151
141
 
152
142
  TEST(TailCalls, InfiniteTailRecursionErrorMentionsTheFunctionName) {
153
- #ifndef __APPLE__
154
- // See InfiniteTailRecursionHitsTheIterationCapInsteadOfHanging's own
155
- // comment just above -- same O(N^2)-under-this-toolchain issue (#50).
156
- GTEST_SKIP() << "O(N^2) under this toolchain -- see issue #50";
157
- #endif
158
143
  ScopedVm vm(false);
159
144
  Evaluator ev;
160
145
  auto ast = parseSrc("function loop(n) = loop(n + 1);\nresult = loop(0);");
@@ -169,6 +154,34 @@ TEST(TailCalls, InfiniteTailRecursionErrorMentionsTheFunctionName) {
169
154
  }
170
155
  }
171
156
 
157
+ TEST(TailCalls, InfiniteTailRecursionHitsTheCapInBoundedWallTime) {
158
+ // Regression tripwire for issue #50: evalFunctionBodyTrampoline's own
159
+ // `chain` (every hop's EvalContext, kept alive for $-var ancestry --
160
+ // see its own doc comment) used to rely on std::vector<EvalContext>'s
161
+ // OWN destructor to tear itself down, whose element-destruction order
162
+ // is unspecified by the standard. libstdc++ (GCC) and, per CI evidence,
163
+ // MSVC destroy front-to-back -- the adversarial order for
164
+ // ScopeTrailStorage::popLevel's "scan from the back" optimization
165
+ // (its own doc comment), turning an intended O(N) teardown into a
166
+ // real, measured O(N^2): the exact same 1,000,000-iteration script
167
+ // below took 25-50+ minutes on GCC/MSVC CI runners before the fix
168
+ // (an explicit back-to-front teardown, immune to the underlying
169
+ // vector's own unspecified order), vs ~1s on Clang/libc++ throughout.
170
+ // ponytail: generous fixed ceiling, not a strict perf target -- trips
171
+ // only on a real regression (this exact O(N^2) reintroduced), not
172
+ // machine noise; raise if a slower CI runner ever needs it.
173
+ ScopedVm vm(false);
174
+ Evaluator ev;
175
+ auto ast = parseSrc("function loop(n) = loop(n + 1);\nresult = loop(0);");
176
+ auto scope = oscad::buildScopes(ast);
177
+ EvalContext ctx = EvalContext::makeRoot(scope.get());
178
+ const auto start = std::chrono::steady_clock::now();
179
+ EXPECT_THROW(ev.resolveTree(ast, ctx), EvalError);
180
+ const double ms = std::chrono::duration<double, std::milli>(std::chrono::steady_clock::now() - start).count();
181
+ constexpr double kCeilingMs = 30000.0;
182
+ EXPECT_LT(ms, kCeilingMs) << "took " << ms << "ms -- possible O(N^2) regression, see issue #50";
183
+ }
184
+
172
185
  TEST(TailCalls, ErrorThrownDeepInATailChainProducesABoundedTrace) {
173
186
  ScopedVm vm(false);
174
187
  Evaluator ev;