openscad-cpp-evaluator 0.13.5__tar.gz → 0.13.9__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.13.5 → openscad_cpp_evaluator-0.13.9}/PKG-INFO +1 -1
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/include/openscad_cpp_evaluator/bytecode.hpp +174 -88
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/include/openscad_cpp_evaluator/bytecode_vm.hpp +10 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/pyproject.toml +1 -1
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/src/builtins/builtins.hpp +17 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/src/builtins/control.cpp +16 -13
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/src/builtins/extrude.cpp +51 -13
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/src/builtins/roof.cpp +21 -4
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/src/bytecode_compiler.cpp +177 -80
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/src/bytecode_vm.cpp +87 -12
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/src/expr_eval.cpp +18 -17
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/src/stmt_eval.cpp +25 -18
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/src/user_calls.cpp +21 -1
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/tests/test_bytecode_compiler.cpp +154 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/tests/test_control_flow.cpp +99 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/.github/workflows/ci.yml +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/.github/workflows/wheels.yml +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/.gitignore +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/.gitmodules +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/CLAUDE.md +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/CMakeLists.txt +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/LICENSE +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/README.md +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/bindings/CMakeLists.txt +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/bindings/module.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/cmake/embed_font.cmake +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/examples/CMakeLists.txt +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/examples/eval_perf_benchmark.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/examples/manifold_cache_reuse.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/examples/minimal_debugger.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/.github/workflows/ci.yml +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/.gitignore +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/CLAUDE.md +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/CMakeLists.txt +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/README.md +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/include/openscad_cpp_parser/api.hpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/ast_node.hpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/comments.hpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/declarations.hpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/expression.hpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/module_instantiation.hpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/scope_builder.hpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/vector_element.hpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast.hpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/include/openscad_cpp_parser/comments.hpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/include/openscad_cpp_parser/position.hpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/include/openscad_cpp_parser/pretty_print.hpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/include/openscad_cpp_parser/scope.hpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/include/openscad_cpp_parser/serialization.hpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/include/openscad_cpp_parser/source_map.hpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/src/CMakeLists.txt +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/src/api.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/src/ast/ast_node.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/src/ast/declarations.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/src/ast/expression.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/src/ast/format_utils.hpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/src/ast/module_instantiation.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/src/ast/scope_builder.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/src/ast/vector_element.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/src/comment_attach_internal.hpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/src/comments.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/src/grammar/driver.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/src/grammar/driver.hpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/src/grammar/lexer.l +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/src/grammar/lexer_api.hpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/src/grammar/oscad_location.hpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/src/grammar/parser.y +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/src/inline_comment_attach.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/src/position.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/src/pretty_print.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/src/scope.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/src/serialization/json_io.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/src/serialization/yaml_io.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/src/source_map.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/tests/CMakeLists.txt +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/tests/test_assignments.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/tests/test_ast_generation.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/tests/test_comments_and_files.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/tests/test_const_borrow.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/tests/test_control.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/tests/test_expressions.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/tests/test_functions.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/tests/test_helpers.hpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/tests/test_inline_comments.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/tests/test_lexical.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/tests/test_modules.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/tests/test_node_str.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/tests/test_pretty_print.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/tests/test_scope.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/tests/test_serialization.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/tests/test_smoke.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/tests/test_source_map.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/tests/test_use_include.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/tests/test_vectors.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/tools/cli/CMakeLists.txt +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/external/openscad_cpp_parser/tools/cli/main.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/include/openscad_cpp_evaluator/bound_args.hpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/include/openscad_cpp_evaluator/bytecode_compiler.hpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/include/openscad_cpp_evaluator/call_args.hpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/include/openscad_cpp_evaluator/colored_body.hpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/include/openscad_cpp_evaluator/csg_node.hpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/include/openscad_cpp_evaluator/css_colors.hpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/include/openscad_cpp_evaluator/debug_hooks.hpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/include/openscad_cpp_evaluator/debug_repl.hpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/include/openscad_cpp_evaluator/dispatch.hpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/include/openscad_cpp_evaluator/dxf_svg_import.hpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/include/openscad_cpp_evaluator/eval_context.hpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/include/openscad_cpp_evaluator/eval_error.hpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/include/openscad_cpp_evaluator/eval_use.hpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/include/openscad_cpp_evaluator/evaluator.hpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/include/openscad_cpp_evaluator/export.hpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/include/openscad_cpp_evaluator/font_provider.hpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/include/openscad_cpp_evaluator/function_builtins.hpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/include/openscad_cpp_evaluator/import_builtin.hpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/include/openscad_cpp_evaluator/manifold_cache.hpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/include/openscad_cpp_evaluator/mesh_import.hpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/include/openscad_cpp_evaluator/osc_range.hpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/include/openscad_cpp_evaluator/profile.hpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/include/openscad_cpp_evaluator/scope_trail.hpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/include/openscad_cpp_evaluator/segments.hpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/include/openscad_cpp_evaluator/stb_font_provider.hpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/include/openscad_cpp_evaluator/surface_load.hpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/include/openscad_cpp_evaluator/text_metrics.hpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/include/openscad_cpp_evaluator/value.hpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/include/openscad_cpp_evaluator/zip_stored.hpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/python/openscad_cpp_evaluator/__init__.py +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/resources/fonts/LICENSE +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/resources/fonts/LiberationSans-Regular.ttf +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/src/CMakeLists.txt +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/src/builtins/booleans.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/src/builtins/call_args.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/src/builtins/color.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/src/builtins/function_builtins.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/src/builtins/import.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/src/builtins/modifiers.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/src/builtins/primitives_2d.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/src/builtins/primitives_3d.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/src/builtins/registry.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/src/builtins/segments.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/src/builtins/surface.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/src/builtins/text.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/src/builtins/topology.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/src/builtins/transforms.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/src/colored_body.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/src/csg_generate.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/src/csg_resolve.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/src/css_colors.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/src/debug/debug_repl.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/src/debug_profile.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/src/eval_context.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/src/eval_error.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/src/eval_use.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/src/export.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/src/import/dxf_import.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/src/import/mesh_import.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/src/import/surface_load.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/src/import/svg_import.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/src/manifold_cache.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/src/text/stb_font_provider.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/src/text/text_metrics.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/src/value.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/src/zip_stored.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/tests/CMakeLists.txt +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/tests/test_booleans.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/tests/test_cli.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/tests/test_csg_tree.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/tests/test_debug_hooks.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/tests/test_dxf_svg_import.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/tests/test_eval_context.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/tests/test_export.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/tests/test_expr_eval.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/tests/test_extrude_roof.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/tests/test_function_builtins.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/tests/test_helpers.hpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/tests/test_import_export.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/tests/test_manifold_cache.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/tests/test_multi_color_merge.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/tests/test_primitives.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/tests/test_profiling.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/tests/test_python_bindings.py +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/tests/test_scope_trail.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/tests/test_scoping.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/tests/test_surface.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/tests/test_tail_calls.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/tests/test_text.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/tests/test_transforms.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/tests/test_use.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/tests/test_value.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/tests/test_viewport_params.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/tests/test_zip_stored.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/tools/cli/CMakeLists.txt +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/tools/cli/cli_lib.cpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/tools/cli/cli_lib.hpp +0 -0
- {openscad_cpp_evaluator-0.13.5 → openscad_cpp_evaluator-0.13.9}/tools/cli/main.cpp +0 -0
|
@@ -104,18 +104,29 @@ enum class Op {
|
|
|
104
104
|
// themselves lists).
|
|
105
105
|
AccumMergeEach,
|
|
106
106
|
|
|
107
|
-
// ListCompFor's per-assignment iteration
|
|
108
|
-
//
|
|
109
|
-
//
|
|
110
|
-
//
|
|
111
|
-
//
|
|
112
|
-
//
|
|
113
|
-
//
|
|
107
|
+
// ListCompFor's per-assignment iteration. `a` = an iterList id (see
|
|
108
|
+
// CompiledChunk::numIterLists), unique per assignment across the whole
|
|
109
|
+
// chunk. Each dimension's own IterMaterialize is emitted INSIDE the
|
|
110
|
+
// enclosing dimension's own loop body (compileListElement's own
|
|
111
|
+
// emitDim recursion), so it re-executes once per outer-dimension
|
|
112
|
+
// binding -- required for a later dimension's own RHS to see an
|
|
113
|
+
// earlier one's current value (e.g. `[for (p=[1:N], pt=f(p)) pt]`),
|
|
114
|
+
// matching evalFor's own doc comment (stmt_eval.cpp) and real
|
|
115
|
+
// OpenSCAD.app's verified behavior.
|
|
114
116
|
IterMaterialize, // pops one Value (the assignment's RHS), expandIterable()s it into iterLists[a], resets its index
|
|
115
|
-
|
|
117
|
+
// Resets iterLists[a]'s index to 0 WITHOUT re-materializing. UNREACHABLE
|
|
118
|
+
// as of the materialize-inside-the-nesting fix above: re-materializing
|
|
119
|
+
// on every dimension re-entry already resets the index as a side
|
|
120
|
+
// effect (see IterMaterialize's own doc comment), so there's no longer
|
|
121
|
+
// a "reset without re-materializing" case left to reach for either
|
|
122
|
+
// ListCompFor (compileListElement) or ModularFor (compileForLoop).
|
|
123
|
+
// Left defined rather than removed in the same change -- a distinct,
|
|
124
|
+
// lower-risk cleanup (same convention as LoadUpvalue's own doc
|
|
125
|
+
// comment, above).
|
|
126
|
+
IterReset,
|
|
116
127
|
IterNext, // a = loop-variable slot, b = iterList id, c = jump target for exhaustion: if iterLists[b] has a
|
|
117
128
|
// next value (at its current index), write it to slots[a], advance the index, fall through;
|
|
118
|
-
// else jump to c (index is left as-is; the next
|
|
129
|
+
// else jump to c (index is left as-is; the next IterMaterialize for this id will restart it)
|
|
119
130
|
|
|
120
131
|
// ListCompCFor's runaway-loop guard, mirroring evalListElement's own
|
|
121
132
|
// 1,000,000-iteration safety limit exactly (see its own doc comment
|
|
@@ -261,7 +272,9 @@ enum class Op {
|
|
|
261
272
|
CallModule,
|
|
262
273
|
|
|
263
274
|
// -- Builtin-wrap compilation (closes the "NativeStatement gap" for ----
|
|
264
|
-
// -- translate/rotate/scale/mirror/multmatrix/resize/color
|
|
275
|
+
// -- translate/rotate/scale/mirror/multmatrix/resize/color/#/%/!, ------
|
|
276
|
+
// -- hull/minkowski/render/linear_extrude/rotate_extrude/projection/ ---
|
|
277
|
+
// -- offset/roof) --------------------------------------------------------
|
|
265
278
|
// A builtin-with-children statement that isn't a "call" the way
|
|
266
279
|
// Op::CallModule's target is (no callStack_/profiling participation,
|
|
267
280
|
// no named scope with upvalue semantics -- see CompiledChunk::
|
|
@@ -284,31 +297,41 @@ enum class Op {
|
|
|
284
297
|
// (mirrors Evaluator::buildTreeNode's own ordering exactly -- doing
|
|
285
298
|
// this AFTER would silently drop uncacheable/ManifoldCache taint
|
|
286
299
|
// tracking for a rands() call embedded in the wrapper's own
|
|
287
|
-
// arguments), computes this site's own params
|
|
288
|
-
//
|
|
289
|
-
//
|
|
290
|
-
//
|
|
291
|
-
//
|
|
292
|
-
//
|
|
293
|
-
//
|
|
294
|
-
//
|
|
295
|
-
//
|
|
296
|
-
//
|
|
297
|
-
//
|
|
298
|
-
//
|
|
299
|
-
//
|
|
300
|
-
//
|
|
301
|
-
//
|
|
300
|
+
// arguments), computes this site's own params for every kind except
|
|
301
|
+
// Modifier (empty, no ctx push) and Roof (deferred to Pop -- see
|
|
302
|
+
// BuiltinWrapSite's own doc comment) via that kind's own native
|
|
303
|
+
// compute function (computeTransformParams/computeColorParams/etc.,
|
|
304
|
+
// builtins.hpp) -- always a possibly-$-scoped child EvalContext,
|
|
305
|
+
// pushed onto f.ctxChain unconditionally for every non-Modifier kind
|
|
306
|
+
// (Roof pushes it too, params or not) -- pushes a fresh ev.treeStack_
|
|
307
|
+
// frame, and stashes {params, randsBefore, siteIdx, (Roof only)
|
|
308
|
+
// deferredArgs} onto VmFrame::builtinWrapStack (a real per-frame LIFO
|
|
309
|
+
// stack, not a single slot: Push/PopBuiltinWrap pairs can nest or
|
|
310
|
+
// sequence within one frame's own instruction stream, e.g.
|
|
311
|
+
// `translate(a) translate(b) recur();`). The compiler always emits a
|
|
312
|
+
// plain Op::CheckDebugStatement immediately before this (see
|
|
313
|
+
// emitBuiltinWrap, bytecode_compiler.cpp), mirroring ModularEcho/
|
|
314
|
+
// ModularAssert's own pattern -- NOT skipped the way Op::CallModule's
|
|
315
|
+
// own call site skips one: this is a genuine statement doing real
|
|
316
|
+
// work here, unlike a module call (which transfers control to a
|
|
317
|
+
// declaration whose OWN body statements each get their own check
|
|
318
|
+
// instead).
|
|
302
319
|
PushBuiltinWrap,
|
|
303
320
|
|
|
304
321
|
// Closes the matching Op::PushBuiltinWrap bracket: pops
|
|
305
322
|
// VmFrame::builtinWrapStack's own top entry FIRST (before anything
|
|
306
323
|
// that can itself throw, e.g. Evaluator::setTreeDepthOrThrow below --
|
|
307
324
|
// so the exception-teardown path's own pending count is already
|
|
308
|
-
// correct if THIS throws)
|
|
309
|
-
//
|
|
310
|
-
//
|
|
311
|
-
//
|
|
325
|
+
// correct if THIS throws); for Roof only, computes `pending.params`
|
|
326
|
+
// HERE via computeRoofParams(ev, pending.deferredArgs, ctx) -- the one
|
|
327
|
+
// kind whose params computation has an observable side effect
|
|
328
|
+
// (ev.warn()) that must stay ordered AFTER children, unlike every
|
|
329
|
+
// other kind's params (computed at Push, before children, since
|
|
330
|
+
// nothing else in this group has an order-sensitive side effect); pops
|
|
331
|
+
// the ctx Push made (every kind except Modifier); pops ev.treeStack_
|
|
332
|
+
// to retrieve the children this bracket's own body produced, and
|
|
333
|
+
// builds the tagged CSGNode exactly like Evaluator::buildTreeNode's
|
|
334
|
+
// own post-resolveBody() half does
|
|
312
335
|
// (kind/node/isBuiltin=true/children/params/uncacheable/
|
|
313
336
|
// setTreeDepthOrThrow), pushing it onto the new top of treeStack_. a
|
|
314
337
|
// = index into CompiledChunk::builtinWrapSites (same site Push used).
|
|
@@ -327,7 +350,7 @@ enum class Op {
|
|
|
327
350
|
|
|
328
351
|
// -- CSG-wrap compilation (closes the LAST native-reentry source in ----
|
|
329
352
|
// -- the original NativeStatement gap: union()/difference()/ -
|
|
330
|
-
// -- intersection())
|
|
353
|
+
// -- intersection()/intersection_for) -----------------------------------
|
|
331
354
|
// union()/difference()/intersection() weren't covered by the original
|
|
332
355
|
// Op::PushBuiltinWrap (see that op's own doc comment) because they need
|
|
333
356
|
// bespoke bookkeeping PushBuiltinWrap's single all-children bracket
|
|
@@ -350,24 +373,30 @@ enum class Op {
|
|
|
350
373
|
//
|
|
351
374
|
// a = index into CompiledChunk::csgWrapSites. Runtime handler: captures
|
|
352
375
|
// ev.randsCallCount() BEFORE argument resolution (same rands-in-args
|
|
353
|
-
// taint reasoning as PushBuiltinWrap)
|
|
354
|
-
//
|
|
355
|
-
//
|
|
356
|
-
//
|
|
357
|
-
//
|
|
358
|
-
// (mirrors Transform/Color's own
|
|
359
|
-
// `union() {...}` with no `$fn=...`
|
|
360
|
-
// merely a copy, cheap and uniform
|
|
361
|
-
//
|
|
362
|
-
//
|
|
363
|
-
//
|
|
364
|
-
//
|
|
365
|
-
//
|
|
366
|
-
//
|
|
367
|
-
//
|
|
368
|
-
//
|
|
369
|
-
//
|
|
370
|
-
//
|
|
376
|
+
// taint reasoning as PushBuiltinWrap); for a `hasArgs` site (union/
|
|
377
|
+
// difference/intersection) resolves the (rare, $-only) arguments via
|
|
378
|
+
// resolveCallArgs exactly like resolveCsg itself does (discarding the
|
|
379
|
+
// positional/named result -- these take no real parameters -- keeping
|
|
380
|
+
// only the possibly-$-scoped child ctx) and pushes that ctx onto
|
|
381
|
+
// f.ctxChain unconditionally (mirrors Transform/Color's own
|
|
382
|
+
// unconditional push -- a bare `union() {...}` with no `$fn=...`
|
|
383
|
+
// override still pushes a ctx that's merely a copy, cheap and uniform
|
|
384
|
+
// rather than a special-cased branch); intersection_for (`hasArgs`
|
|
385
|
+
// false -- it isn't a call, has no `.arguments`) skips both entirely,
|
|
386
|
+
// matching resolveIntersectionFor's own use of its caller's ctx
|
|
387
|
+
// unchanged (its per-ITERATION child ctxs are a completely separate
|
|
388
|
+
// concern, handled by the compiled cartesian loop's own Op::
|
|
389
|
+
// ForIterNext, not by this bracket). Either way: pushes a fresh
|
|
390
|
+
// ev.treeStack_ frame (every child statement's/iteration's own
|
|
391
|
+
// CSGNode(s) land flat in this ONE frame -- mirrors Evaluator::
|
|
392
|
+
// buildTreeNode/evalModularCall's own single treeStack_.emplace_back()
|
|
393
|
+
// around the whole call, not one per group), and stashes {op,
|
|
394
|
+
// randsBefore, siteIdx, empty groupSizes} onto VmFrame::csgWrapStack (a
|
|
395
|
+
// real per-frame LIFO, same reasoning as builtinWrapStack: nested/
|
|
396
|
+
// sequenced CSG wraps within one frame's own instruction stream, e.g.
|
|
397
|
+
// `union() { difference() {...} }`). The compiler always emits a plain
|
|
398
|
+
// Op::CheckDebugStatement immediately before this (see emitCsgWrap/
|
|
399
|
+
// compileIntersectionForLoop, bytecode_compiler.cpp), mirroring
|
|
371
400
|
// emitBuiltinWrap's own pattern -- this is a genuine statement doing
|
|
372
401
|
// real work here, not a call transferring control to a declaration.
|
|
373
402
|
PushCsgWrap,
|
|
@@ -401,14 +430,19 @@ enum class Op {
|
|
|
401
430
|
// VmFrame::csgWrapStack's own top entry FIRST (before anything that can
|
|
402
431
|
// itself throw, e.g. setTreeDepthOrThrow below -- same "exception-
|
|
403
432
|
// teardown's own pending count must already be right" reasoning as
|
|
404
|
-
// PopBuiltinWrap), pops the ctx
|
|
433
|
+
// PopBuiltinWrap), pops the ctx Push pushed (only when `hasArgs`),
|
|
405
434
|
// pops ev.treeStack_ to retrieve every group's own CSGNode(s) (flat,
|
|
406
435
|
// exactly like resolveCsg's own `children` result -- group boundaries
|
|
407
436
|
// live only in group_sizes, never in the CSGNode list's own shape), and
|
|
408
437
|
// builds the tagged CSGNode exactly like Evaluator::buildTreeNode's own
|
|
409
|
-
// post-resolveBody() half does, with params = {"
|
|
410
|
-
//
|
|
411
|
-
//
|
|
438
|
+
// post-resolveBody() half does, with params = {"group_sizes":
|
|
439
|
+
// ValueList(pending.groupSizes)} plus, only when `includeOpParam`,
|
|
440
|
+
// "op": site.op -- byte-for-byte what native resolveCsg returns for
|
|
441
|
+
// union/difference/intersection (generateCsg needs "op" to
|
|
442
|
+
// disambiguate the ONE function it shares across all 3) and what
|
|
443
|
+
// native resolveIntersectionFor returns (no "op" key at all --
|
|
444
|
+
// generateIntersectionFor is its own dedicated, separately-registered
|
|
445
|
+
// function, never needs one) -- pushing the result onto the new top of
|
|
412
446
|
// treeStack_. a = index into CompiledChunk::csgWrapSites (same site
|
|
413
447
|
// Push used).
|
|
414
448
|
//
|
|
@@ -462,33 +496,49 @@ enum class Op {
|
|
|
462
496
|
// no separate site table needed).
|
|
463
497
|
CallChildren,
|
|
464
498
|
|
|
465
|
-
// A single "native passthrough" statement --
|
|
466
|
-
//
|
|
467
|
-
//
|
|
468
|
-
//
|
|
469
|
-
//
|
|
470
|
-
//
|
|
471
|
-
// resolve at compile time
|
|
472
|
-
// not statically known) --
|
|
473
|
-
// its own real bytecode.
|
|
474
|
-
// ModularLet used to fall here
|
|
475
|
-
// bytecode -- Op::StoreModuleVar/
|
|
476
|
-
// Op::OpenLetScope+StoreLetVar -- purely
|
|
477
|
-
// none of these were ever the recursion-
|
|
478
|
-
// targets. `#`/`%`/`!` modifiers and
|
|
479
|
-
// multmatrix/resize/color used to fall
|
|
480
|
-
// throughput reasoning -- WRONG in that one
|
|
481
|
-
// recursive module call wrapped in one of these is
|
|
482
|
-
// pattern that made this op's own native reentry a
|
|
483
|
-
// crash risk in practice, not just a missed
|
|
484
|
-
// Op::PushBuiltinWrap's own doc comment for the
|
|
485
|
-
// fix. children() fell here too, and was the LAST
|
|
486
|
-
// reentry source once PushBuiltinWrap's own set was
|
|
487
|
-
// has Op::CallChildren, above. union()/difference()/
|
|
488
|
-
// fell here too, and were the last remaining REAL
|
|
489
|
-
//
|
|
499
|
+
// A single "native passthrough" statement -- every builtin module call
|
|
500
|
+
// not covered by Op::PushBuiltinWrap/Op::PushCsgWrap (see those ops'
|
|
501
|
+
// own doc comments for exactly which builtins ARE covered -- cube/
|
|
502
|
+
// sphere/import/text/surface/etc., the true LEAVES that never take a
|
|
503
|
+
// `children` block at all, so wrapping a recursive call inside one
|
|
504
|
+
// isn't even syntactically possible), the `*` modifier's own no-op
|
|
505
|
+
// case, or a user-module call that didn't resolve at compile time
|
|
506
|
+
// (shadowed, forward-declared, or otherwise not statically known) --
|
|
507
|
+
// anything compileStatementList doesn't give its own real bytecode.
|
|
508
|
+
// (Assignment/ModularEcho/ModularAssert/ModularLet used to fall here
|
|
509
|
+
// too; they now have their own real bytecode -- Op::StoreModuleVar/
|
|
510
|
+
// Op::Echo/Op::AssertStatement/Op::OpenLetScope+StoreLetVar -- purely
|
|
511
|
+
// a throughput change, since none of these were ever the recursion-
|
|
512
|
+
// depth risk this compiler targets. `#`/`%`/`!` modifiers and
|
|
513
|
+
// translate/rotate/scale/mirror/multmatrix/resize/color used to fall
|
|
514
|
+
// here too, for the SAME throughput reasoning -- WRONG in that one
|
|
515
|
+
// specific case: a recursive module call wrapped in one of these is
|
|
516
|
+
// exactly the pattern that made this op's own native reentry a
|
|
517
|
+
// genuine Windows crash risk in practice, not just a missed
|
|
518
|
+
// optimization. See Op::PushBuiltinWrap's own doc comment for the
|
|
519
|
+
// real story and the fix. children() fell here too, and was the LAST
|
|
520
|
+
// and largest such reentry source once PushBuiltinWrap's own set was
|
|
521
|
+
// covered -- it now has Op::CallChildren, above. union()/difference()/
|
|
522
|
+
// intersection() fell here too, and were the last remaining REAL
|
|
523
|
+
// native-reentry risk among ModularCall-shaped statements (bespoke
|
|
524
|
+
// group_sizes bookkeeping meant they couldn't just reuse
|
|
490
525
|
// PushBuiltinWrap's own bracket) -- they now have Op::PushCsgWrap,
|
|
491
|
-
// above.)
|
|
526
|
+
// above. hull()/minkowski()/render()/linear_extrude()/rotate_extrude()/
|
|
527
|
+
// projection()/offset()/roof() fell here too, closing out every
|
|
528
|
+
// remaining non-leaf builtin whose OWN children can wrap a recursive
|
|
529
|
+
// call in an idiomatic script (a rounded-hull chain, a recursive
|
|
530
|
+
// extrude, etc.) -- they now share Op::PushBuiltinWrap's own bracket
|
|
531
|
+
// via 6 new Kind values (Passthrough/LinearExtrude/RotateExtrude/
|
|
532
|
+
// Projection/Offset/Roof), reusing the exact same mechanism rather
|
|
533
|
+
// than inventing another. intersection_for -- NOT a ModularCall at
|
|
534
|
+
// all, its own NodeKind -- fell here too and was the true LAST
|
|
535
|
+
// native-reentry gap; it now shares Op::PushCsgWrap's own bracket
|
|
536
|
+
// (CsgWrapSite::hasArgs/includeOpParam both false for it) wrapped
|
|
537
|
+
// around a compiled cartesian-product loop reusing Op::ForIterNext/
|
|
538
|
+
// ForIterEnd/NativeIterMaterialize verbatim (see
|
|
539
|
+
// compileIntersectionForLoop, bytecode_compiler.cpp) -- one Op::
|
|
540
|
+
// CsgGroupStart/CsgGroupEnd pair per full iteration instead of per
|
|
541
|
+
// source statement. Every non-leaf builtin construct is covered now.)
|
|
492
542
|
// a = index into CompiledChunk::nativeStatements. Runtime just does
|
|
493
543
|
// what Evaluator::evalChildren's own per-statement loop already does
|
|
494
544
|
// for one node: derive childCtx via ctx.withScope(...), checkDebug,
|
|
@@ -813,8 +863,8 @@ struct CompiledChunk {
|
|
|
813
863
|
// replay the native param-resolution step and rebuild the tagged
|
|
814
864
|
// CSGNode at Pop time.
|
|
815
865
|
//
|
|
816
|
-
// `node`'s concrete type depends on `kind`:
|
|
817
|
-
// genuine `ModularCall`
|
|
866
|
+
// `node`'s concrete type depends on `kind`: every kind except Modifier
|
|
867
|
+
// is a genuine `ModularCall` (down-cast to read `.name`/`.arguments`/
|
|
818
868
|
// `.children`); Modifier sites are the wrapper node itself
|
|
819
869
|
// (`ModularModifierHighlight`/`Background`/`ShowOnly` -- `!`/`#`/`%`;
|
|
820
870
|
// `*`/Disable never reaches here, its child never evaluates at all,
|
|
@@ -826,24 +876,60 @@ struct CompiledChunk {
|
|
|
826
876
|
// union of concrete pointers) because that's all Op::PopBuiltinWrap
|
|
827
877
|
// itself ever needs `node` for: the resulting CSGNode's own
|
|
828
878
|
// `node`/error-position field.
|
|
879
|
+
//
|
|
880
|
+
// Passthrough/LinearExtrude/RotateExtrude/Projection/Offset/Roof
|
|
881
|
+
// (added for hull()/minkowski()/render()/linear_extrude()/
|
|
882
|
+
// rotate_extrude()/projection()/offset()/roof()) share Transform/
|
|
883
|
+
// Color's exact push-time-computed-params shape, just via a different
|
|
884
|
+
// native compute function each (Op::PushBuiltinWrap's own runtime
|
|
885
|
+
// handler switches on `kind` to pick it) -- see that op's own doc
|
|
886
|
+
// comment for the one exception (Roof, whose params computation has
|
|
887
|
+
// to run at POP time instead, after children, to preserve an
|
|
888
|
+
// observable warn() ordering).
|
|
829
889
|
struct BuiltinWrapSite {
|
|
830
|
-
enum class Kind {
|
|
890
|
+
enum class Kind {
|
|
891
|
+
Transform,
|
|
892
|
+
Color,
|
|
893
|
+
Modifier,
|
|
894
|
+
Passthrough, // hull()/minkowski()/render() -- empty params, no compute function needed
|
|
895
|
+
LinearExtrude,
|
|
896
|
+
RotateExtrude,
|
|
897
|
+
Projection,
|
|
898
|
+
Offset,
|
|
899
|
+
Roof, // computed at POP time, not PUSH -- see this struct's own doc comment
|
|
900
|
+
};
|
|
831
901
|
Kind kind;
|
|
832
|
-
std::string tagName; // "translate"/"rotate"/.../"color"/"highlight"/"background"/"show_only"
|
|
902
|
+
std::string tagName; // "translate"/"rotate"/.../"color"/"highlight"/"background"/"show_only"/"hull"/...
|
|
833
903
|
const oscad::ASTNode* node = nullptr;
|
|
834
904
|
};
|
|
835
905
|
|
|
836
906
|
// One Op::PushCsgWrap/PopCsgWrap site pair -- see those ops' own doc
|
|
837
907
|
// comments for the full "why union/difference/intersection need
|
|
838
908
|
// bespoke group_sizes bookkeeping instead of just reusing
|
|
839
|
-
// BuiltinWrapSite" rationale. `op` is
|
|
840
|
-
// "intersection" (the
|
|
841
|
-
//
|
|
842
|
-
//
|
|
843
|
-
//
|
|
909
|
+
// BuiltinWrapSite" rationale. `op` is "union"/"difference"/
|
|
910
|
+
// "intersection" (the 3 names resolveDispatch() maps to resolveCsg,
|
|
911
|
+
// always a genuine ModularCall) OR "intersection_for" (NOT a
|
|
912
|
+
// ModularCall -- a distinct NodeKind/ModuleInstantiation subtype with
|
|
913
|
+
// its own `.assignments`/`.body`, see compileIntersectionForLoop,
|
|
914
|
+
// bytecode_compiler.cpp) -- `node` is therefore the generic ASTNode*
|
|
915
|
+
// BuiltinWrapSite's own Modifier kind already established this pattern
|
|
916
|
+
// for, down-cast to ModularCall only when `hasArgs` is true.
|
|
917
|
+
//
|
|
918
|
+
// `hasArgs`/`includeOpParam` are both true for union/difference/
|
|
919
|
+
// intersection, both false for intersection_for: it isn't a call at
|
|
920
|
+
// all (no `.arguments`, so Op::PushCsgWrap's handler must skip
|
|
921
|
+
// resolveCallArgs/the ctx push entirely -- matches native
|
|
922
|
+
// resolveIntersectionFor, which uses the SAME ctx its caller passed in
|
|
923
|
+
// unchanged, never a $-scoped child of its own), and its own
|
|
924
|
+
// CSGParams has no "op" key at all (generateIntersectionFor is a
|
|
925
|
+
// dedicated, separately-registered generate function, unlike
|
|
926
|
+
// generateCsg which needs "op" in params to disambiguate union/
|
|
927
|
+
// difference/intersection from ONE shared function).
|
|
844
928
|
struct CsgWrapSite {
|
|
845
929
|
std::string op;
|
|
846
|
-
|
|
930
|
+
bool hasArgs = true;
|
|
931
|
+
bool includeOpParam = true;
|
|
932
|
+
const oscad::ASTNode* node = nullptr;
|
|
847
933
|
};
|
|
848
934
|
|
|
849
935
|
// One Op::AssertStatement site -- see that op's own doc comment for
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
#include "openscad_cpp_evaluator/bound_args.hpp"
|
|
4
4
|
#include "openscad_cpp_evaluator/bytecode.hpp"
|
|
5
|
+
#include "openscad_cpp_evaluator/call_args.hpp"
|
|
5
6
|
#include "openscad_cpp_evaluator/csg_node.hpp"
|
|
6
7
|
#include "openscad_cpp_evaluator/eval_context.hpp"
|
|
7
8
|
#include "openscad_cpp_evaluator/value.hpp"
|
|
@@ -28,6 +29,15 @@ struct PendingBuiltinWrap {
|
|
|
28
29
|
CSGParams params;
|
|
29
30
|
std::uint64_t randsBefore = 0;
|
|
30
31
|
int siteIdx = -1;
|
|
32
|
+
// Only populated for BuiltinWrapSite::Kind::Roof -- the already-
|
|
33
|
+
// resolved call arguments, retained across the whole bracket so
|
|
34
|
+
// Op::PopBuiltinWrap's handler can compute roof()'s own params AFTER
|
|
35
|
+
// children finish (computeRoofParams needs them; re-running
|
|
36
|
+
// resolveCallArgs at Pop time instead would re-evaluate every argument
|
|
37
|
+
// expression a second time -- double rands()/side effects). Every
|
|
38
|
+
// other kind computes its params at Push time and leaves this default-
|
|
39
|
+
// empty.
|
|
40
|
+
CallArgs deferredArgs;
|
|
31
41
|
};
|
|
32
42
|
|
|
33
43
|
// One still-open Op::PushCsgWrap bracket's own state -- see that op's own
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
#pragma once
|
|
2
2
|
|
|
3
|
+
#include "openscad_cpp_evaluator/call_args.hpp"
|
|
3
4
|
#include "openscad_cpp_evaluator/dispatch.hpp"
|
|
4
5
|
|
|
5
6
|
#include <optional>
|
|
@@ -153,21 +154,30 @@ std::vector<ColoredBody> generateMinkowski(Evaluator& ev, const CSGParams& param
|
|
|
153
154
|
const oscad::ASTNode& node);
|
|
154
155
|
|
|
155
156
|
// linear_extrude()/rotate_extrude()/projection() -- extrude.cpp.
|
|
157
|
+
// computeXParams: the pure "resolve args, build params" half, split out
|
|
158
|
+
// like computeTransformParams/computeColorParams so Op::PushBuiltinWrap's
|
|
159
|
+
// own runtime handler can call it directly (bytecode_vm.cpp) instead of
|
|
160
|
+
// through the whole resolve function, whose OTHER half (evalChildren) is
|
|
161
|
+
// exactly the native reentry that split exists to avoid.
|
|
162
|
+
BuiltinWrapParams computeLinearExtrudeParams(Evaluator& ev, const oscad::ModularCall& node, EvalContext& ctx);
|
|
156
163
|
CSGParams resolveLinearExtrude(Evaluator& ev, const oscad::ModularCall& node, EvalContext& ctx);
|
|
157
164
|
std::vector<ColoredBody> generateLinearExtrude(Evaluator& ev, const CSGParams& params,
|
|
158
165
|
const std::vector<std::unique_ptr<CSGNode>>& children,
|
|
159
166
|
const oscad::ASTNode& node);
|
|
160
167
|
|
|
168
|
+
BuiltinWrapParams computeRotateExtrudeParams(Evaluator& ev, const oscad::ModularCall& node, EvalContext& ctx);
|
|
161
169
|
CSGParams resolveRotateExtrude(Evaluator& ev, const oscad::ModularCall& node, EvalContext& ctx);
|
|
162
170
|
std::vector<ColoredBody> generateRotateExtrude(Evaluator& ev, const CSGParams& params,
|
|
163
171
|
const std::vector<std::unique_ptr<CSGNode>>& children,
|
|
164
172
|
const oscad::ASTNode& node);
|
|
165
173
|
|
|
174
|
+
BuiltinWrapParams computeProjectionParams(Evaluator& ev, const oscad::ModularCall& node, EvalContext& ctx);
|
|
166
175
|
CSGParams resolveProjection(Evaluator& ev, const oscad::ModularCall& node, EvalContext& ctx);
|
|
167
176
|
std::vector<ColoredBody> generateProjection(Evaluator& ev, const CSGParams& params,
|
|
168
177
|
const std::vector<std::unique_ptr<CSGNode>>& children,
|
|
169
178
|
const oscad::ASTNode& node);
|
|
170
179
|
|
|
180
|
+
BuiltinWrapParams computeOffsetParams(Evaluator& ev, const oscad::ModularCall& node, EvalContext& ctx);
|
|
171
181
|
CSGParams resolveOffset(Evaluator& ev, const oscad::ModularCall& node, EvalContext& ctx);
|
|
172
182
|
std::vector<ColoredBody> generateOffset(Evaluator& ev, const CSGParams& params,
|
|
173
183
|
const std::vector<std::unique_ptr<CSGNode>>& children, const oscad::ASTNode& node);
|
|
@@ -176,6 +186,13 @@ std::vector<ColoredBody> generateOffset(Evaluator& ev, const CSGParams& params,
|
|
|
176
186
|
// contour polygons) + Tier 3 (SDF/level-set fallback) only, per the plan --
|
|
177
187
|
// Tier 2 (general multi-contour/hole straight skeleton) is a named,
|
|
178
188
|
// documented follow-up, not silently dropped (see CLAUDE.md).
|
|
189
|
+
// computeRoofParams: UNLIKE computeLinearExtrudeParams and friends above,
|
|
190
|
+
// this is the params-computation half taken from AFTER evalChildren (it
|
|
191
|
+
// calls ev.warn(), an observable side effect that must stay ordered after
|
|
192
|
+
// any child's own echo/warn output) -- takes already-resolved CallArgs,
|
|
193
|
+
// not a raw node+ctx, since Op::PushBuiltinWrap's own runtime handler
|
|
194
|
+
// calls this at POP time. See its own doc comment (roof.cpp).
|
|
195
|
+
CSGParams computeRoofParams(Evaluator& ev, const CallArgs& args, EvalContext& effCtx);
|
|
179
196
|
CSGParams resolveRoof(Evaluator& ev, const oscad::ModularCall& node, EvalContext& ctx);
|
|
180
197
|
std::vector<ColoredBody> generateRoof(Evaluator& ev, const CSGParams& params,
|
|
181
198
|
const std::vector<std::unique_ptr<CSGNode>>& children, const oscad::ASTNode& node);
|
|
@@ -97,24 +97,21 @@ ColoredBody combineBodies(const std::vector<ColoredBody>& bodies) {
|
|
|
97
97
|
// children) -- same rationale as booleans.cpp's own group_sizes. Mirrors
|
|
98
98
|
// _resolve_intersection_for/_generate_intersection_for.
|
|
99
99
|
CSGParams resolveIntersectionFor(Evaluator& ev, const oscad::ModularIntersectionFor& node, EvalContext& ctx) {
|
|
100
|
-
std::vector<std::pair<std::string, IterableValues>> varSeqs;
|
|
101
|
-
varSeqs.reserve(node.assignments.size());
|
|
102
|
-
for (const auto& assign : node.assignments) {
|
|
103
|
-
Value values = ev.evalExpr(*assign->expr, ctx);
|
|
104
|
-
const oscad::Position* pos = &assign->position();
|
|
105
|
-
varSeqs.emplace_back(assign->name->name, expandIterable(values, [&](size_t count) {
|
|
106
|
-
ev.warn("Bad range parameter in for statement: too many elements (" + std::to_string(count) + ")", pos);
|
|
107
|
-
}));
|
|
108
|
-
}
|
|
109
|
-
|
|
110
100
|
std::vector<const oscad::ASTNode*> bodyNodes;
|
|
111
101
|
bodyNodes.reserve(node.body.size());
|
|
112
102
|
for (const auto& b : node.body) bodyNodes.push_back(b.get());
|
|
113
103
|
|
|
114
104
|
std::vector<Value> groupSizes;
|
|
115
105
|
|
|
106
|
+
// Each dimension's own RHS is evaluated against `parentCtx` (not
|
|
107
|
+
// upfront against the original `ctx`), re-evaluated on every entry
|
|
108
|
+
// into this recursion level -- see evalFor's own doc comment
|
|
109
|
+
// (stmt_eval.cpp) for the full "verified against real OpenSCAD.app"
|
|
110
|
+
// rationale; this is the identical bug in intersection_for's own
|
|
111
|
+
// cartesian loop (e.g. `intersection_for (i=[0:2], j=[0:i]) ...`
|
|
112
|
+
// needs `i` visible in `j`'s own range expression).
|
|
116
113
|
std::function<void(size_t, EvalContext&)> recurse = [&](size_t depth, EvalContext& parentCtx) {
|
|
117
|
-
if (depth ==
|
|
114
|
+
if (depth == node.assignments.size()) {
|
|
118
115
|
// One body-entry marker per full cartesian-product iteration
|
|
119
116
|
// and nothing per individual variable binding (unlike
|
|
120
117
|
// evalFor) -- mirrors _resolve_intersection_for's single
|
|
@@ -126,9 +123,15 @@ CSGParams resolveIntersectionFor(Evaluator& ev, const oscad::ModularIntersection
|
|
|
126
123
|
groupSizes.push_back(Value{static_cast<double>(after - before)});
|
|
127
124
|
return;
|
|
128
125
|
}
|
|
129
|
-
|
|
126
|
+
const auto& assign = node.assignments[depth];
|
|
127
|
+
Value values = ev.evalExpr(*assign->expr, parentCtx);
|
|
128
|
+
const oscad::Position* pos = &assign->position();
|
|
129
|
+
IterableValues iter = expandIterable(values, [&](size_t count) {
|
|
130
|
+
ev.warn("Bad range parameter in for statement: too many elements (" + std::to_string(count) + ")", pos);
|
|
131
|
+
});
|
|
132
|
+
for (const Value& val : iter) {
|
|
130
133
|
EvalContext childCtx = parentCtx.childCtx(nullptr, std::nullopt, ctx.childrenNodes, ctx.childrenCallerCtx);
|
|
131
|
-
childCtx.let_->set(
|
|
134
|
+
childCtx.let_->set(assign->name->name, val);
|
|
132
135
|
recurse(depth + 1, childCtx);
|
|
133
136
|
}
|
|
134
137
|
};
|
|
@@ -13,10 +13,21 @@ namespace oscadeval {
|
|
|
13
13
|
// mirrors _resolve_linear_extrude/_generate_linear_extrude. `scale` is
|
|
14
14
|
// either a single number (applied to both X/Y) or a [x,y] pair for the top
|
|
15
15
|
// face; the bottom face is always full-size.
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
//
|
|
17
|
+
// Split into computeLinearExtrudeParams (pure, no children-evaluation side
|
|
18
|
+
// effect) + resolveLinearExtrude (adds the evalChildren call) so Op::
|
|
19
|
+
// PushBuiltinWrap's own runtime handler (bytecode_vm.cpp) can call the pure
|
|
20
|
+
// half directly instead of going through the whole resolve function --
|
|
21
|
+
// exactly the same split computeTransformParams/computeColorParams already
|
|
22
|
+
// use, extended to this builtin. Params computation here has no observable
|
|
23
|
+
// side effect of its own (no warn()/echo()/rands() call), so moving it
|
|
24
|
+
// before evalChildren (unlike this function's own former single-body
|
|
25
|
+
// shape, which computed params AFTER children like every other builtin
|
|
26
|
+
// still not covered by PushBuiltinWrap) is behaviorally unobservable --
|
|
27
|
+
// see computeRoofParams's own doc comment (roof.cpp) for the one builtin
|
|
28
|
+
// in this group where that ISN'T true and a different split was needed.
|
|
29
|
+
BuiltinWrapParams computeLinearExtrudeParams(Evaluator& ev, const oscad::ModularCall& node, EvalContext& ctx) {
|
|
18
30
|
auto [args, effCtx] = resolveCallArgs(ev, node.arguments, ctx);
|
|
19
|
-
ev.evalChildren(node.children, effCtx);
|
|
20
31
|
|
|
21
32
|
const double height = toDoubleLenient(getArg(args, 0, "height", Value{1.0}));
|
|
22
33
|
const bool center = truthy(getArg(args, std::nullopt, "center", Value{false}));
|
|
@@ -40,7 +51,13 @@ CSGParams resolveLinearExtrude(Evaluator& ev, const oscad::ModularCall& node, Ev
|
|
|
40
51
|
params["scale_x"] = Value{scaleX};
|
|
41
52
|
params["scale_y"] = Value{scaleY};
|
|
42
53
|
params["color"] = colorToValue(effCtx.color);
|
|
43
|
-
return params;
|
|
54
|
+
return BuiltinWrapParams{std::move(params), std::move(effCtx)};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
CSGParams resolveLinearExtrude(Evaluator& ev, const oscad::ModularCall& node, EvalContext& ctx) {
|
|
58
|
+
BuiltinWrapParams result = computeLinearExtrudeParams(ev, node, ctx);
|
|
59
|
+
ev.evalChildren(node.children, result.ctx);
|
|
60
|
+
return std::move(result.params);
|
|
44
61
|
}
|
|
45
62
|
|
|
46
63
|
std::vector<ColoredBody> generateLinearExtrude(Evaluator& ev, const CSGParams& params,
|
|
@@ -65,9 +82,10 @@ std::vector<ColoredBody> generateLinearExtrude(Evaluator& ev, const CSGParams& p
|
|
|
65
82
|
// so resolve only caches $fn/$fa/$fs for generate to call fnSegments()
|
|
66
83
|
// with once the real max-x bound exists.
|
|
67
84
|
|
|
68
|
-
|
|
85
|
+
// Split the same way as computeLinearExtrudeParams, above -- see its own
|
|
86
|
+
// doc comment.
|
|
87
|
+
BuiltinWrapParams computeRotateExtrudeParams(Evaluator& ev, const oscad::ModularCall& node, EvalContext& ctx) {
|
|
69
88
|
auto [args, effCtx] = resolveCallArgs(ev, node.arguments, ctx);
|
|
70
|
-
ev.evalChildren(node.children, effCtx);
|
|
71
89
|
|
|
72
90
|
const double angle = toDoubleLenient(getArg(args, 0, "angle", Value{360.0}));
|
|
73
91
|
|
|
@@ -84,7 +102,13 @@ CSGParams resolveRotateExtrude(Evaluator& ev, const oscad::ModularCall& node, Ev
|
|
|
84
102
|
params["fa"] = Value{dynOr("$fa", 12.0)};
|
|
85
103
|
params["fs"] = Value{dynOr("$fs", 2.0)};
|
|
86
104
|
params["color"] = colorToValue(effCtx.color);
|
|
87
|
-
return params;
|
|
105
|
+
return BuiltinWrapParams{std::move(params), std::move(effCtx)};
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
CSGParams resolveRotateExtrude(Evaluator& ev, const oscad::ModularCall& node, EvalContext& ctx) {
|
|
109
|
+
BuiltinWrapParams result = computeRotateExtrudeParams(ev, node, ctx);
|
|
110
|
+
ev.evalChildren(node.children, result.ctx);
|
|
111
|
+
return std::move(result.params);
|
|
88
112
|
}
|
|
89
113
|
|
|
90
114
|
std::vector<ColoredBody> generateRotateExtrude(Evaluator& ev, const CSGParams& params,
|
|
@@ -108,12 +132,19 @@ std::vector<ColoredBody> generateRotateExtrude(Evaluator& ev, const CSGParams& p
|
|
|
108
132
|
// FillRule::Positive to clean up self-intersections Manifold's own
|
|
109
133
|
// Project() can produce.
|
|
110
134
|
|
|
111
|
-
|
|
135
|
+
// Split the same way as computeLinearExtrudeParams, above -- see its own
|
|
136
|
+
// doc comment.
|
|
137
|
+
BuiltinWrapParams computeProjectionParams(Evaluator& ev, const oscad::ModularCall& node, EvalContext& ctx) {
|
|
112
138
|
auto [args, effCtx] = resolveCallArgs(ev, node.arguments, ctx);
|
|
113
|
-
ev.evalChildren(node.children, effCtx);
|
|
114
139
|
CSGParams params;
|
|
115
140
|
params["cut"] = Value{truthy(getArg(args, std::nullopt, "cut", Value{false}))};
|
|
116
|
-
return params;
|
|
141
|
+
return BuiltinWrapParams{std::move(params), std::move(effCtx)};
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
CSGParams resolveProjection(Evaluator& ev, const oscad::ModularCall& node, EvalContext& ctx) {
|
|
145
|
+
BuiltinWrapParams result = computeProjectionParams(ev, node, ctx);
|
|
146
|
+
ev.evalChildren(node.children, result.ctx);
|
|
147
|
+
return std::move(result.params);
|
|
117
148
|
}
|
|
118
149
|
|
|
119
150
|
std::vector<ColoredBody> generateProjection(Evaluator&, const CSGParams& params,
|
|
@@ -145,9 +176,10 @@ std::vector<ColoredBody> generateProjection(Evaluator&, const CSGParams& params,
|
|
|
145
176
|
// (JoinType::Square, or Miter if chamfer=true) are mutually exclusive;
|
|
146
177
|
// neither given passes the first child through unchanged.
|
|
147
178
|
|
|
148
|
-
|
|
179
|
+
// Split the same way as computeLinearExtrudeParams, above -- see its own
|
|
180
|
+
// doc comment.
|
|
181
|
+
BuiltinWrapParams computeOffsetParams(Evaluator& ev, const oscad::ModularCall& node, EvalContext& ctx) {
|
|
149
182
|
auto [args, effCtx] = resolveCallArgs(ev, node.arguments, ctx);
|
|
150
|
-
ev.evalChildren(node.children, effCtx);
|
|
151
183
|
|
|
152
184
|
const Value rArg = getArg(args, std::nullopt, "r", Value{});
|
|
153
185
|
const Value deltaArg = getArg(args, std::nullopt, "delta", Value{});
|
|
@@ -161,7 +193,13 @@ CSGParams resolveOffset(Evaluator& ev, const oscad::ModularCall& node, EvalConte
|
|
|
161
193
|
params["segs"] = Value{static_cast<double>(fnSegmentsFromCtx(effCtx, std::fabs(toDoubleLenient(rArg))))};
|
|
162
194
|
}
|
|
163
195
|
params["color"] = colorToValue(effCtx.color);
|
|
164
|
-
return params;
|
|
196
|
+
return BuiltinWrapParams{std::move(params), std::move(effCtx)};
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
CSGParams resolveOffset(Evaluator& ev, const oscad::ModularCall& node, EvalContext& ctx) {
|
|
200
|
+
BuiltinWrapParams result = computeOffsetParams(ev, node, ctx);
|
|
201
|
+
ev.evalChildren(node.children, result.ctx);
|
|
202
|
+
return std::move(result.params);
|
|
165
203
|
}
|
|
166
204
|
|
|
167
205
|
std::vector<ColoredBody> generateOffset(Evaluator&, const CSGParams& params, const std::vector<std::unique_ptr<CSGNode>>& children,
|