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.
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/PKG-INFO +1 -1
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/pyproject.toml +1 -1
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/bytecode_vm.cpp +29 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/user_calls.cpp +26 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_tail_calls.cpp +29 -16
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/.github/workflows/ci.yml +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/.github/workflows/wheels.yml +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/.gitignore +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/.gitmodules +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/CLAUDE.md +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/CMakeLists.txt +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/LICENSE +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/README.md +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/bindings/CMakeLists.txt +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/bindings/module.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/cmake/embed_font.cmake +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/examples/CMakeLists.txt +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/examples/eval_perf_benchmark.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/examples/manifold_cache_reuse.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/examples/minimal_debugger.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/.github/workflows/ci.yml +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/.gitignore +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/CLAUDE.md +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/CMakeLists.txt +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/README.md +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/include/openscad_cpp_parser/api.hpp +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast.hpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/include/openscad_cpp_parser/comments.hpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/include/openscad_cpp_parser/position.hpp +0 -0
- {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
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/include/openscad_cpp_parser/scope.hpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/include/openscad_cpp_parser/serialization.hpp +0 -0
- {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
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/src/CMakeLists.txt +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/src/api.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/src/ast/ast_node.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/src/ast/declarations.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/src/ast/expression.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/src/ast/format_utils.hpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/src/ast/module_instantiation.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/src/ast/scope_builder.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/src/ast/vector_element.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/src/comment_attach_internal.hpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/src/comments.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/src/grammar/driver.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/src/grammar/driver.hpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/src/grammar/lexer.l +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/src/grammar/lexer_api.hpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/src/grammar/oscad_location.hpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/src/grammar/parser.y +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/src/inline_comment_attach.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/src/position.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/src/pretty_print.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/src/scope.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/src/serialization/json_io.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/src/serialization/yaml_io.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/src/source_map.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/tests/CMakeLists.txt +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/tests/test_assignments.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/tests/test_ast_generation.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/tests/test_comments_and_files.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/tests/test_const_borrow.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/tests/test_control.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/tests/test_expressions.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/tests/test_functions.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/tests/test_helpers.hpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/tests/test_inline_comments.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/tests/test_lexical.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/tests/test_modules.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/tests/test_node_str.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/tests/test_pretty_print.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/tests/test_scope.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/tests/test_serialization.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/tests/test_smoke.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/tests/test_source_map.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/tests/test_use_include.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/tests/test_vectors.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/tools/cli/CMakeLists.txt +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/tools/cli/main.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/bound_args.hpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/bytecode.hpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/bytecode_compiler.hpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/bytecode_vm.hpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/call_args.hpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/colored_body.hpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/csg_node.hpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/css_colors.hpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/debug_hooks.hpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/debug_repl.hpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/dispatch.hpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/dxf_svg_import.hpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/eval_context.hpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/eval_error.hpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/eval_use.hpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/evaluator.hpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/export.hpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/font_provider.hpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/function_builtins.hpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/import_builtin.hpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/manifold_cache.hpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/mesh_import.hpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/osc_range.hpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/profile.hpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/scope_trail.hpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/segments.hpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/stb_font_provider.hpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/surface_load.hpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/text_metrics.hpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/value.hpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/include/openscad_cpp_evaluator/zip_stored.hpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/python/openscad_cpp_evaluator/__init__.py +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/resources/fonts/LICENSE +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/resources/fonts/LiberationSans-Regular.ttf +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/CMakeLists.txt +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/builtins/booleans.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/builtins/builtins.hpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/builtins/call_args.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/builtins/color.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/builtins/control.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/builtins/extrude.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/builtins/function_builtins.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/builtins/import.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/builtins/modifiers.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/builtins/primitives_2d.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/builtins/primitives_3d.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/builtins/registry.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/builtins/roof.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/builtins/segments.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/builtins/surface.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/builtins/text.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/builtins/topology.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/builtins/transforms.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/bytecode_compiler.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/colored_body.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/csg_generate.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/csg_resolve.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/css_colors.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/debug/debug_repl.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/debug_profile.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/eval_context.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/eval_error.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/eval_use.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/export.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/expr_eval.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/import/dxf_import.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/import/mesh_import.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/import/surface_load.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/import/svg_import.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/manifold_cache.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/stmt_eval.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/text/stb_font_provider.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/text/text_metrics.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/value.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/zip_stored.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/CMakeLists.txt +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_booleans.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_bytecode_compiler.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_cli.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_control_flow.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_csg_tree.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_debug_hooks.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_dxf_svg_import.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_eval_context.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_export.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_expr_eval.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_extrude_roof.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_function_builtins.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_helpers.hpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_import_export.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_manifold_cache.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_multi_color_merge.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_primitives.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_profiling.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_python_bindings.py +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_scope_trail.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_scoping.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_surface.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_text.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_transforms.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_use.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_value.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_viewport_params.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_zip_stored.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tools/cli/CMakeLists.txt +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tools/cli/cli_lib.cpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tools/cli/cli_lib.hpp +0 -0
- {openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tools/cli/main.cpp +0 -0
|
@@ -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;
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/examples/eval_perf_benchmark.cpp
RENAMED
|
File without changes
|
{openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/examples/manifold_cache_reuse.cpp
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/CLAUDE.md
RENAMED
|
File without changes
|
|
File without changes
|
{openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/external/openscad_cpp_parser/README.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/builtins/function_builtins.cpp
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/builtins/primitives_2d.cpp
RENAMED
|
File without changes
|
{openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/builtins/primitives_3d.cpp
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/src/text/stb_font_provider.cpp
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_bytecode_compiler.cpp
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_function_builtins.cpp
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_multi_color_merge.cpp
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openscad_cpp_evaluator-0.6.0 → openscad_cpp_evaluator-0.6.1}/tests/test_viewport_params.cpp
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|