From 711a388b3d30f82bc1cd5de2ad3c8ae10e9b0690 Mon Sep 17 00:00:00 2001 From: Google DeepMind Date: Mon, 24 Nov 2025 10:17:14 -0800 Subject: [PATCH] Sort and generate optional struct bindings in WASM. PiperOrigin-RevId: 836273537 Change-Id: I2af2401969a4780f593df86dc9336adcc285fd1b --- wasm/codegen/generated/bindings.cc | 56 ++++++++++++++++-------------- wasm/codegen/generators/structs.py | 13 +++++++ wasm/codegen/templates/bindings.cc | 29 +--------------- 3 files changed, 43 insertions(+), 55 deletions(-) diff --git a/wasm/codegen/generated/bindings.cc b/wasm/codegen/generated/bindings.cc index c59a9278..f1580184 100644 --- a/wasm/codegen/generated/bindings.cc +++ b/wasm/codegen/generated/bindings.cc @@ -12776,34 +12776,36 @@ EMSCRIPTEN_BINDINGS(mujoco_functions) { register_type("number[]"); register_type("string"); register_vector("mjByteVec"); - register_optional(); - register_optional(); - register_optional(); - register_optional(); - register_optional(); - register_optional(); - register_optional(); - register_optional(); - register_optional(); - register_optional(); - register_optional(); - register_optional(); - register_optional(); - register_optional(); - register_optional(); - register_optional(); - register_optional(); - register_optional(); - register_optional(); - register_optional(); - register_optional(); - register_optional(); - register_optional(); - register_optional(); - register_optional(); - register_optional(); - register_optional(); register_optional(); + register_optional(); + register_optional(); + register_optional(); + register_optional(); + register_optional(); + register_optional(); + register_optional(); + register_optional(); + register_optional(); + register_optional(); + register_optional(); + register_optional(); + register_optional(); + register_optional(); + register_optional(); + register_optional(); + register_optional(); + register_optional(); + register_optional(); + register_optional(); + register_optional(); + register_optional(); + register_optional(); + register_optional(); + register_optional(); + register_optional(); + register_optional(); + register_optional(); + register_optional(); } } // namespace mujoco::wasm diff --git a/wasm/codegen/generators/structs.py b/wasm/codegen/generators/structs.py index 5f6e2ac5..709803ab 100644 --- a/wasm/codegen/generators/structs.py +++ b/wasm/codegen/generators/structs.py @@ -776,4 +776,17 @@ def generate(struct_to_bind: List[str]) -> list[tuple[str, list[str]]]: "// {{ AUTOGENNED_STRUCTS_BINDINGS }}", autogenned_struct_bindings, )) + + # Generate optional bindings + optional_bindings = [] + for s_name in sorted(struct_to_bind): + w_name = common.capitalize(s_name) + if w_name.startswith("Mjs") or w_name == "MjSpec": + optional_bindings.append(f"register_optional<{w_name}>();") + + markers_and_content.append(( + "// {{ OPTIONAL_STRUCT_BINDINGS }}", + optional_bindings, + )) + return markers_and_content diff --git a/wasm/codegen/templates/bindings.cc b/wasm/codegen/templates/bindings.cc index 99394700..c67f8768 100644 --- a/wasm/codegen/templates/bindings.cc +++ b/wasm/codegen/templates/bindings.cc @@ -516,34 +516,7 @@ EMSCRIPTEN_BINDINGS(mujoco_functions) { register_type("number[]"); register_type("string"); register_vector("mjByteVec"); - register_optional(); - register_optional(); - register_optional(); - register_optional(); - register_optional(); - register_optional(); - register_optional(); - register_optional(); - register_optional(); - register_optional(); - register_optional(); - register_optional(); - register_optional(); - register_optional(); - register_optional(); - register_optional(); - register_optional(); - register_optional(); - register_optional(); - register_optional(); - register_optional(); - register_optional(); - register_optional(); - register_optional(); - register_optional(); - register_optional(); - register_optional(); - register_optional(); + // {{ OPTIONAL_STRUCT_BINDINGS }} } } // namespace mujoco::wasm