diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 86ed2579d..e76add6db 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -158,107 +158,6 @@ jobs: export ASAN_OPTIONS=detect_leaks=0 LD_PRELOAD=/usr/lib/llvm-14/lib/clang/14.0.6/lib/linux/libclang_rt.asan-x86_64.so mono test.exe - c_sharp_determinism: - runs-on: ubuntu-latest - # Ubuntu's version of clang doesn't support....anything that should work. - # Ubuntu is an utter trash OS and should generally never be used for anything. - # We also require dotnet so we use fedora - container: fedora:39 - strategy: - fail-fast: false - steps: - - name: Install required dependencies - run: | - dnf install -y mingw64-gcc git cargo dotnet clang llvm lld faketime rust-std-static-x86_64-pc-windows-gnu which diffutils rust-src - - name: Checkout source code - uses: actions/checkout@v2 - with: - fetch-depth: 0 - - name: Install cbindgen - run: | - cargo install cbindgen - - name: Checkout Rust-Lightning and LDK-C-Bindings git - run: | - git config --global safe.directory '*' - git config --global user.email "ldk-ci@example.com" - git config --global user.name "LDK CI" - # Note this is a different endpoint, as we need one non-upstream commit! - git clone https://github.com/lightningdevkit/rust-lightning - cd rust-lightning - git checkout origin/0.0.121-bindings - cd .. - git clone https://github.com/lightningdevkit/ldk-c-bindings - cd ldk-c-bindings - git checkout 0.0.121 - - name: Fetch MacOS SDK - run: | - curl -o Xcode-12.2-12B45b-extracted-SDK-with-libcxx-headers.tar.gz https://bitcoincore.org/depends-sources/sdks/Xcode-12.2-12B45b-extracted-SDK-with-libcxx-headers.tar.gz - tar xvvf Xcode-12.2-12B45b-extracted-SDK-with-libcxx-headers.tar.gz - - name: Rebuild C bindings with STD - run: | - export MACOS_SDK="$PWD/Xcode-12.2-12B45b-extracted-SDK-with-libcxx-headers" - cd ldk-c-bindings - export LDK_C_BINDINGS_EXTRA_TARGETS=x86_64-pc-windows-gnu - export LDK_C_BINDINGS_EXTRA_TARGET_CCS=`pwd`/deterministic-build-wrappers/clang-x86_64-windows - export LDK_C_BINDINGS_EXTRA_TARGET_LINK_LTO=true - ./genbindings.sh ../rust-lightning true - - name: Remove checked-in source to ensure its correctly checked-in - run: rm c_sharp/src/org/ldk/enums/*.cs c_sharp/src/org/ldk/impl/*.cs c_sharp/src/org/ldk/structs/*.cs - - name: Build Windows C# Bindings - run: | - export LDK_GARBAGECOLLECTED_GIT_OVERRIDE="$(git describe --tag HEAD)" - LDK_TARGET=x86_64-pc-windows-gnu LDK_TARGET_CPU=sandybridge ./genbindings.sh ./ldk-c-bindings/ c_sharp false false - - name: Build Linux C# Bindings - run: | - export LDK_GARBAGECOLLECTED_GIT_OVERRIDE="$(git describe --tag HEAD)" - ./genbindings.sh ./ldk-c-bindings/ c_sharp false false - - name: Build macOS x86-64 C# Bindings - run: | - export MACOS_SDK="$PWD/Xcode-12.2-12B45b-extracted-SDK-with-libcxx-headers" - export LDK_GARBAGECOLLECTED_GIT_OVERRIDE="$(git describe --tag HEAD)" - CC=clang LDK_TARGET=x86_64-apple-darwin LDK_TARGET_CPU=sandybridge ./genbindings.sh ./ldk-c-bindings/ c_sharp false false - - name: Build macOS aarch64 C# Bindings - run: | - export MACOS_SDK="$PWD/Xcode-12.2-12B45b-extracted-SDK-with-libcxx-headers" - export LDK_GARBAGECOLLECTED_GIT_OVERRIDE="$(git describe --tag HEAD)" - CC=clang LDK_TARGET=aarch64-apple-darwin LDK_TARGET_CPU=apple-a14 ./genbindings.sh ./ldk-c-bindings/ c_sharp false false - - name: Build Release NUPKG - run: | - cd c_sharp - ./build-release-nupkg.sh - - uses: actions/upload-artifact@v3 - with: - name: org.ldk.nupkg - path: c_sharp/org.ldk.nupkg - - name: Check latest auto-generated code is in git - run: | - # Checkout files that get updated with version information - git checkout c_sharp/packaging_artifacts/package/services/metadata/core-properties/ldk.psmdcp - git checkout c_sharp/packaging_artifacts/org.ldk.nuspec - git diff --exit-code - - name: Checkout latest binaries - shell: bash - run: | - export LDK_GARBAGECOLLECTED_GIT_OVERRIDE="$(git describe --tag HEAD)" - echo "Fetching deterministic binaries for LDK-GC ${LDK_GARBAGECOLLECTED_GIT_OVERRIDE}" - # Gitweb only allows snapshots of folders by providing the object hash, which we have to extract: - SNAPSHOT_LINK="$(curl "https://git.bitcoin.ninja/index.cgi?p=ldk-java-bins;a=tree;f=${LDK_GARBAGECOLLECTED_GIT_OVERRIDE};hb=refs/heads/main" | grep snapshot | grep -o 'href="[a-zA-Z0-9/?\.=;\-]*"' | sed 's/href="//' | tr -d '"' | grep snapshot)" - curl -o bins-snapshot.tgz "https://git.bitcoin.ninja${SNAPSHOT_LINK}" - mkdir -p ldk-java-bins/"${LDK_GARBAGECOLLECTED_GIT_OVERRIDE}" - cd ldk-java-bins/"${LDK_GARBAGECOLLECTED_GIT_OVERRIDE}" - tar xvvf ../../bins-snapshot.tgz - mv ldk-java-bins-*/* ./ - rm -r ldk-java-bins-* - - name: Compare C# nupkg with built one - shell: bash - run: | - export LDK_GARBAGECOLLECTED_GIT_OVERRIDE="$(git describe --tag HEAD)" - if ! diff ldk-java-bins/"${LDK_GARBAGECOLLECTED_GIT_OVERRIDE}/"org.ldk.nupkg c_sharp/org.ldk.nupkg; then - dnf -y install diffoscope - diffoscope ldk-java-bins/"${LDK_GARBAGECOLLECTED_GIT_OVERRIDE}/"org.ldk.nupkg c_sharp/org.ldk.nupkg || echo - exit 1 - fi - java_bindings: runs-on: ubuntu-latest # Ubuntu's version of rustc uses its own LLVM instead of being a real native package. @@ -322,135 +221,6 @@ jobs: git checkout pom.xml git diff --exit-code - java_determinism: - runs-on: ubuntu-latest - # Ubuntu's version of rustc uses its own LLVM instead of being a real native package. - # This leaves us with an incompatible LLVM version when linking. Instead, use a real OS. - container: debian:bookworm - strategy: - fail-fast: false - steps: - - name: Install native Rust toolchain, Valgrind, and build utilitis - run: | - apt-get update - apt-get -y dist-upgrade - apt-get -y install cargo valgrind lld git g++ clang openjdk-17-jdk maven faketime zip unzip llvm curl - - name: Checkout source code - uses: actions/checkout@v2 - with: - fetch-depth: 0 - - name: Install cbindgen - run: | - git config --global safe.directory '*' - git clone https://github.com/eqrion/cbindgen - cd cbindgen/ - git checkout v0.20.0 - cargo update -p indexmap --precise "1.6.2" --verbose - cargo install --locked --path . - - name: Checkout Rust-Lightning and LDK-C-Bindings git - run: | - git config --global user.email "ldk-ci@example.com" - git config --global user.name "LDK CI" - # Note this is a different endpoint, as we need one non-upstream commit! - git clone https://github.com/lightningdevkit/rust-lightning - cd rust-lightning - git checkout origin/0.0.121-bindings - cd .. - git clone https://github.com/lightningdevkit/ldk-c-bindings - cd ldk-c-bindings - git checkout 0.0.121 - cd lightning-c-bindings - cargo update -p memchr --precise "2.5.0" --verbose - - name: Pin proc-macro and quote to meet MSRV - run: | - cd ldk-c-bindings/c-bindings-gen - cargo update -p quote --precise "1.0.30" --verbose - cargo update -p proc-macro2 --precise "1.0.65" --verbose - - name: Rebuild C bindings, and check the sample app builds + links - run: | - cd ldk-c-bindings - ./genbindings.sh ../rust-lightning true - - name: Checkout latest MacOS binaries - shell: bash - run: | - export LDK_GARBAGECOLLECTED_GIT_OVERRIDE="$(git describe --tag HEAD)" - echo "Fetching deterministic binaries for LDK-GC ${LDK_GARBAGECOLLECTED_GIT_OVERRIDE}" - # Gitweb only allows snapshots of folders by providing the object hash, which we have to extract: - SNAPSHOT_LINK="$(curl "https://git.bitcoin.ninja/index.cgi?p=ldk-java-bins;a=tree;f=${LDK_GARBAGECOLLECTED_GIT_OVERRIDE};hb=refs/heads/main" | grep snapshot | grep -o 'href="[a-zA-Z0-9/?\.=;\-]*"' | sed 's/href="//' | tr -d '"' | grep snapshot)" - curl -o bins-snapshot.tgz "https://git.bitcoin.ninja${SNAPSHOT_LINK}" - mkdir -p ldk-java-bins/"${LDK_GARBAGECOLLECTED_GIT_OVERRIDE}" - cd ldk-java-bins/"${LDK_GARBAGECOLLECTED_GIT_OVERRIDE}" - tar xvvf ../../bins-snapshot.tgz - mv ldk-java-bins-*/* ./ - rm -r ldk-java-bins-* - cd ../.. - mkdir -p src/main/resources/ - - name: Copy latest MacOS leaktracking libs - run: | - export LDK_GARBAGECOLLECTED_GIT_OVERRIDE="$(git describe --tag HEAD)" - cp "ldk-java-bins/${LDK_GARBAGECOLLECTED_GIT_OVERRIDE}/"liblightningjni_MacOSX-aarch64-leaktracking.nativelib src/main/resources/liblightningjni_MacOSX-aarch64.nativelib - cp "ldk-java-bins/${LDK_GARBAGECOLLECTED_GIT_OVERRIDE}/"liblightningjni_MacOSX-x86_64-leaktracking.nativelib src/main/resources/liblightningjni_MacOSX-x86_64.nativelib - - name: Build Leaktracking Java Release Bindings - run: | - export LDK_GARBAGECOLLECTED_GIT_OVERRIDE="$(git describe --tag HEAD)" - ./genbindings.sh ./ldk-c-bindings/ "-I/usr/lib/jvm/java-17-openjdk-amd64/include/ -I/usr/lib/jvm/java-17-openjdk-amd64/include/linux/" leaks false - - name: Build deterministic release jar - run: | - ./build-release-jar.sh - mv ldk-java.jar ldk-java-leaktracking.jar - - name: Copy latest MacOS libs - shell: bash - run: | - export LDK_GARBAGECOLLECTED_GIT_OVERRIDE="$(git describe --tag HEAD)" - cp "ldk-java-bins/${LDK_GARBAGECOLLECTED_GIT_OVERRIDE}/liblightningjni_MacOSX-"{aarch64,x86_64}.nativelib src/main/resources/ - - name: Build Java leaktracking Bindings - run: | - export LDK_GARBAGECOLLECTED_GIT_OVERRIDE="$(git describe --tag HEAD)" - ./genbindings.sh ./ldk-c-bindings/ "-I/usr/lib/jvm/java-17-openjdk-amd64/include/ -I/usr/lib/jvm/java-17-openjdk-amd64/include/linux/" leaks false - mkdir ldk-java-bins/new/ - cp src/main/resources/liblightningjni_Linux-amd64.nativelib ldk-java-bins/new/liblightningjni_Linux-amd64-leaktracking.nativelib - - name: Build Java Release Bindings - run: | - export LDK_GARBAGECOLLECTED_GIT_OVERRIDE="$(git describe --tag HEAD)" - ./genbindings.sh ./ldk-c-bindings/ "-I/usr/lib/jvm/java-17-openjdk-amd64/include/ -I/usr/lib/jvm/java-17-openjdk-amd64/include/linux/" false false - - name: Build deterministic release jar - run: ./build-release-jar.sh - - uses: actions/upload-artifact@v3 - with: - name: ldk-java.jar - path: ldk-java.jar - - uses: actions/upload-artifact@v3 - with: - name: ldk-java-leaktracking.jar - path: ldk-java-leaktracking.jar - - name: Check latest library and jars are in bins repo - run: | - export LDK_GARBAGECOLLECTED_GIT_OVERRIDE="$(git describe --tag HEAD)" - cp "ldk-java-bins/${LDK_GARBAGECOLLECTED_GIT_OVERRIDE}/"liblightningjni_Mac*.nativelib ldk-java-bins/new/ - cp "ldk-java-bins/${LDK_GARBAGECOLLECTED_GIT_OVERRIDE}/"LDK-release.aar ldk-java-bins/new/ - cp "ldk-java-bins/${LDK_GARBAGECOLLECTED_GIT_OVERRIDE}/"org.ldk.nupkg ldk-java-bins/new/ - cp src/main/resources/liblightningjni_Linux-amd64.nativelib ldk-java-bins/new/ - cp ldk-java-sources.jar ldk-java-bins/new/ - cp ldk-java.jar ldk-java-bins/new/ - cp ldk-java-leaktracking.jar ldk-java-bins/new/ - cp ldk-java-classes.jar ldk-java-bins/new/ - cd ldk-java-bins - rm "${LDK_GARBAGECOLLECTED_GIT_OVERRIDE}/liblightningjs.wasm" # TODO: Test this - if ! diff -r "${LDK_GARBAGECOLLECTED_GIT_OVERRIDE}/" new/; then - apt-get -y install diffoscope - diffoscope new/ldk-java-sources.jar "${LDK_GARBAGECOLLECTED_GIT_OVERRIDE}/ldk-java-sources.jar" || echo - diffoscope new/ldk-java-classes.jar "${LDK_GARBAGECOLLECTED_GIT_OVERRIDE}/ldk-java-classes.jar" || echo - diffoscope new/ldk-java.jar "${LDK_GARBAGECOLLECTED_GIT_OVERRIDE}/ldk-java.jar" || echo - diffoscope new/ldk-java-leaktracking.jar "${LDK_GARBAGECOLLECTED_GIT_OVERRIDE}/ldk-java-leaktracking.jar" || echo - exit 1 - fi - - name: Run Java Tests against built release jar - run: | - mvn install:install-file -Dfile=ldk-java.jar -DgroupId=org.lightningdevkit -DartifactId=ldk-java -Dversion=1.0-SNAPSHOT -Dpackaging=jar - cd javatester - mvn package - java -ea -jar target/ldk-java-tests-1.0-SNAPSHOT-jar-with-dependencies.jar - macos_determinism: runs-on: ubuntu-latest # Ubuntu's version of rustc uses its own LLVM instead of being a real native package. @@ -572,222 +342,3 @@ jobs: diffoscope "ldk-java-bins/${LDK_GARBAGECOLLECTED_GIT_OVERRIDE}/$F" "src/main/resources/$F" || echo fi done - - android: - runs-on: ubuntu-latest - # Frankly, I'm not really sure why debian and ubuntu differ in the results here, they really shouldn't - container: debian:bullseye - strategy: - fail-fast: false - steps: - - name: Install rust targets - run: | - apt-get update - apt-get -y dist-upgrade - apt-get -y install git g++ clang faketime zip unzip curl openjdk-17-jdk - curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs > rustup.sh - chmod +x ./rustup.sh - ./rustup.sh -y - . $HOME/.cargo/env - # Temporarily use 1.67.1 to fix https://github.com/rust-lang/rust/issues/108943 - rustup install 1.67.1 - rustup default 1.67.1 - rustup target add armv7-linux-androideabi - rustup target add aarch64-linux-android - rustup target add i686-linux-android - rustup target add x86_64-linux-android - - name: Checkout source code - uses: actions/checkout@v2 - with: - fetch-depth: 0 - - name: Install android NDK compilers - run: | - git config --global safe.directory '*' - curl https://dl.google.com/android/repository/android-ndk-r22b-linux-x86_64.zip > android-ndk-r22b-linux-x86_64.zip - if [ "$(sha256sum android-ndk-r22b-linux-x86_64.zip | awk '{ print $1 }')" != "ac3a0421e76f71dd330d0cd55f9d99b9ac864c4c034fc67e0d671d022d4e806b" ]; then - echo "Bad hash" - exit 1 - fi - unzip android-ndk-r22b-linux-x86_64.zip - - name: Install cbindgen - run: | - . $HOME/.cargo/env - cargo install cbindgen - - name: Checkout Rust-Lightning and LDK-C-Bindings git - run: | - git config --global user.email "ldk-ci@example.com" - git config --global user.name "LDK CI" - # Note this is a different endpoint, as we need one non-upstream commit! - git clone https://github.com/lightningdevkit/rust-lightning - cd rust-lightning - git checkout origin/0.0.121-bindings - cd .. - git clone https://github.com/lightningdevkit/ldk-c-bindings - cd ldk-c-bindings - git checkout 0.0.121 - cd lightning-c-bindings - . $HOME/.cargo/env - cargo update -p memchr --precise "2.5.0" --verbose - - name: Checkout Android AAR binaries and artifacts - run: | - # Gitweb only allows snapshots of folders by providing the object hash, which we have to extract: - export LDK_GARBAGECOLLECTED_GIT_OVERRIDE="$(git describe --tag HEAD)" - echo "Fetching deterministic binaries for LDK-GC ${LDK_GARBAGECOLLECTED_GIT_OVERRIDE}" - RELEASE_PAGE="https://git.bitcoin.ninja/index.cgi?p=ldk-java-bins;a=tree;f=${LDK_GARBAGECOLLECTED_GIT_OVERRIDE};hb=refs/heads/main" - SNAPSHOT_LINK="$(curl "$RELEASE_PAGE" | grep snapshot | grep -o 'href="[a-zA-Z0-9/?\.=;\-]*"' | sed 's/href="//' | tr -d '"' | grep snapshot)" - curl -o bins-snapshot.tgz "https://git.bitcoin.ninja${SNAPSHOT_LINK}" - - ANDROID_PAGE="https://git.bitcoin.ninja/index.cgi?p=ldk-java-bins;a=tree;f=android-artifacts;hb=refs/heads/main" - SNAPSHOT_LINK="$(curl "$ANDROID_PAGE" | grep snapshot | grep -o 'href="[a-zA-Z0-9/?\.=;\-]*"' | sed 's/href="//' | tr -d '"' | grep snapshot)" - curl -o android-snapshot.tgz "https://git.bitcoin.ninja${SNAPSHOT_LINK}" - - mkdir -p ldk-java-bins/"${LDK_GARBAGECOLLECTED_GIT_OVERRIDE}" - cd ldk-java-bins/"${LDK_GARBAGECOLLECTED_GIT_OVERRIDE}" - tar xvvf ../../bins-snapshot.tgz - mv ldk-java-bins-*/* ./ - rm -r ldk-java-bins-* - - mkdir -p ../android-artifacts - cd ../android-artifacts - tar xvvf ../../android-snapshot.tgz - mv ldk-java-bins-*/* ./ - rm -r ldk-java-bins-* - - name: Build Android aar - run: | - . $HOME/.cargo/env - export LDK_GARBAGECOLLECTED_GIT_OVERRIDE="$(git describe --tag HEAD)" - cp "ldk-java-bins/${LDK_GARBAGECOLLECTED_GIT_OVERRIDE}/ldk-java-classes.jar" ./ - export ANDROID_TOOLCHAIN="$(pwd)/android-ndk-r22b/toolchains/llvm/prebuilt/linux-x86_64" - export PATH="$PATH:$ANDROID_TOOLCHAIN/bin" - ./android-build.sh ./rust-lightning ./ldk-c-bindings/ ./ldk-java-bins/android-artifacts - - uses: actions/upload-artifact@v3 - with: - name: LDK-release.aar - path: LDK-release.aar - - name: Check latest library and jars are in bins repo - run: | - export LDK_GARBAGECOLLECTED_GIT_OVERRIDE="$(git describe --tag HEAD)" - if ! diff LDK-release.aar "ldk-java-bins/${LDK_GARBAGECOLLECTED_GIT_OVERRIDE}/"LDK-release.aar; then - apt-get -y install diffoscope - diffoscope LDK-release.aar "ldk-java-bins/${LDK_GARBAGECOLLECTED_GIT_OVERRIDE}/LDK-release.aar" - exit 1 - fi - - osx: - strategy: - matrix: - include: - - platform: macos-11 - - platform: macos-12 - - platform: macos-13 - fail-fast: false - runs-on: ${{ matrix.platform }} - steps: - - name: Install Rust components - run: | - rustup target install aarch64-apple-darwin - rustup component add rust-src - - name: Checkout source code - uses: actions/checkout@v2 - with: - fetch-depth: 0 - - name: Install cbindgen - run: cargo install cbindgen - - name: Checkout Rust-Lightning and LDK-C-Bindings git - run: | - git config --global user.email "ldk-ci@example.com" - git config --global user.name "LDK CI" - # Note this is a different endpoint, as we need one non-upstream commit! - git clone https://github.com/rghtningdevkit/ust-lightning - cd rust-lightning - git checkout origin/0.0.121-bindings - cd .. - git clone https://github.com/lightningdevkit/ldk-c-bindings - cd ldk-c-bindings - git checkout 0.0.121 - cd lightning-c-bindings - cargo update -p memchr --precise "2.5.0" --verbose - - name: Rebuild C bindings and check the sample app builds + links - run: | - cd ldk-c-bindings - CC=clang ./genbindings.sh ../rust-lightning true - - name: Fetch OpenJDK 18 - run: | - if [ "$(uname -m)" = "arm64" ]; then - wget -O openjdk-18.0.1.1_macos-aarch64_bin.tar.gz https://download.java.net/java/GA/jdk18.0.1.1/65ae32619e2f40f3a9af3af1851d6e19/2/GPL/openjdk-18.0.1.1_macos-aarch64_bin.tar.gz - if [ "$(shasum -a 256 openjdk-18.0.1.1_macos-aarch64_bin.tar.gz | awk '{ print $1 }')" != "29773ad68063bdad7fbaeb762cd873d3f243e86de380d3ac5335cdb929371fb5" ]; then - echo "Bad hash" - exit 1 - fi - tar xvvf openjdk-18.0.1.1_macos-aarch64_bin.tar.gz - else - wget -O openjdk-18.0.1.1_macos-x64_bin.tar.gz https://download.java.net/java/GA/jdk18.0.1.1/65ae32619e2f40f3a9af3af1851d6e19/2/GPL/openjdk-18.0.1.1_macos-x64_bin.tar.gz - if [ "$(shasum -a 256 openjdk-18.0.1.1_macos-x64_bin.tar.gz | awk '{ print $1 }')" != "f02d17ec5a387555f8489abc352d973b6c10364409b597046025938e2266d72a" ]; then - echo "Bad hash" - exit 1 - fi - tar xvvf openjdk-18.0.1.1_macos-x64_bin.tar.gz - fi - - name: Checkout latest Linux binaries - run: | - export LDK_GARBAGECOLLECTED_GIT_OVERRIDE="$(git describe --tag HEAD)" - echo "Fetching deterministic binaries for LDK-GC ${LDK_GARBAGECOLLECTED_GIT_OVERRIDE}" - # Gitweb only allows snapshots of folders by providing the object hash, which we have to extract: - SNAPSHOT_LINK="$(wget -O /dev/stdout "https://git.bitcoin.ninja/index.cgi?p=ldk-java-bins;a=tree;f=${LDK_GARBAGECOLLECTED_GIT_OVERRIDE};hb=refs/heads/main" | grep snapshot | grep -o 'href="[a-zA-Z0-9/?\.=;\-]*"' | sed 's/href="//' | tr -d '"' | grep snapshot)" - wget -O bins-snapshot.tgz "https://git.bitcoin.ninja${SNAPSHOT_LINK}" - mkdir -p ldk-java-bins/"${LDK_GARBAGECOLLECTED_GIT_OVERRIDE}" - cd ldk-java-bins/"${LDK_GARBAGECOLLECTED_GIT_OVERRIDE}" - tar xvvf ../../bins-snapshot.tgz - mv ldk-java-bins-*/* ./ - cd ../.. - mkdir -p src/main/resources/ - cp "ldk-java-bins/${LDK_GARBAGECOLLECTED_GIT_OVERRIDE}/liblightningjni_Linux-"* src/main/resources/ - - name: Build Java Release Bindings - run: | - export LDK_GARBAGECOLLECTED_GIT_OVERRIDE="$(git describe --tag HEAD)" - export JAVA_HOME=`pwd`/jdk-18.0.1.1.jdk/Contents/Home - export PATH=$JAVA_HOME/bin:$PATH - ./genbindings.sh ./ldk-c-bindings/ "-I$JAVA_HOME/include/ -I$JAVA_HOME/include/darwin -isysroot$(xcrun --show-sdk-path)" false false - - if [ "${{ matrix.platform }}" = "macos-11" ]; then - export CC="clang --target=aarch64-apple-darwin" - export LDK_TARGET=aarch64-apple-darwin - export LDK_TARGET_CPU=apple-a14 - ./genbindings.sh ./ldk-c-bindings/ "-I$JAVA_HOME/include/ -I$JAVA_HOME/include/darwin -isysroot$(xcrun --show-sdk-path)" false false - cat src/main/resources/liblightningjni_MacOSX-aarch64.nativelib > /dev/null - - fi - - name: Fetch Maven 3.8.4 - run: | - # We don't bother using the upstream mirrors as they remove prior - # releases aggressively, causing spurious CI failures when we don't - # care about the version used. - wget -O apache-maven-3.8.4-bin.tar.gz https://bitcoin.ninja/apache-maven-3.8.4-bin.tar.gz - if [ "$(shasum -a 256 apache-maven-3.8.4-bin.tar.gz | awk '{ print $1 }')" != "2cdc9c519427bb20fdc25bef5a9063b790e4abd930e7b14b4e9f4863d6f9f13c" ]; then - echo "Bad hash" - exit 1 - fi - tar xvvf apache-maven-3.8.4-bin.tar.gz - export PATH=apache-maven-3.8.4/bin:$PATH - - name: Run Java Tests against built jar - run: | - export JAVA_HOME=`pwd`/jdk-18.0.1.1.jdk/Contents/Home - export PATH=$JAVA_HOME/bin:$PATH - mvn -DskipTests=true package - export LDK_GARBAGECOLLECTED_GIT_OVERRIDE="$(git describe --tag HEAD)" - JAR_VERSION=${LDK_GARBAGECOLLECTED_GIT_OVERRIDE:1:100} - mvn install:install-file -Dfile=target/ldk-java-${JAR_VERSION}.jar -DgroupId=org.lightningdevkit -DartifactId=ldk-java -Dversion=1.0-SNAPSHOT -Dpackaging=jar - cd javatester - mvn -q -B package - java -ea -jar target/ldk-java-tests-1.0-SNAPSHOT-jar-with-dependencies.jar - - name: Run Java Tests against release bins - run: | - export LDK_GARBAGECOLLECTED_GIT_OVERRIDE="$(git describe --tag HEAD)" - export JAVA_HOME=`pwd`/jdk-18.0.1.1.jdk/Contents/Home - export PATH=$JAVA_HOME/bin:$PATH - cp "ldk-java-bins/${LDK_GARBAGECOLLECTED_GIT_OVERRIDE}/ldk-java.jar" ./ - mvn install:install-file -Dfile=ldk-java.jar -DgroupId=org.lightningdevkit -DartifactId=ldk-java -Dversion=1.0-SNAPSHOT -Dpackaging=jar - cd javatester - mvn clean - mvn -q -B package - java -ea -jar target/ldk-java-tests-1.0-SNAPSHOT-jar-with-dependencies.jar diff --git a/c_sharp/src/org/ldk/util/InternalUtils.cs b/c_sharp/src/org/ldk/util/InternalUtils.cs index 9296adf0f..1912c29ff 100644 --- a/c_sharp/src/org/ldk/util/InternalUtils.cs +++ b/c_sharp/src/org/ldk/util/InternalUtils.cs @@ -4,14 +4,14 @@ using org.ldk.impl; internal class InternalUtils { - public static T[] check_arr_len(T[] arr, int length) { + public static T[] CheckArrLen(T[] arr, int length) { if (arr != null && arr.Length != length) { throw new ArgumentException("Array must be of fixed size " + length + " but was of length " + arr.Length); } return arr; } - public static byte[] convUInt5Array(UInt5[] u5s) { + public static byte[] ConvUInt5Array(UInt5[] u5s) { if (u5s == null) return null; byte[] res = new byte[u5s.Length]; for (int i = 0; i < u5s.Length; i++) { @@ -20,25 +20,25 @@ public static byte[] convUInt5Array(UInt5[] u5s) { return res; } - public static T[] mapArray(F[] arr, Func f) { + public static T[] MapArray(F[] arr, Func f) { if (arr == null) return null; T[] ret = new T[arr.Length]; for (int i = 0; i < arr.Length; i++) ret[i] = f(arr[i]); return ret; } - public static string decodeString(long strptr) { - byte[] bytes = decodeUint8Array(strptr); + public static string DecodeString(long strptr) { + byte[] bytes = DecodeUint8Array(strptr); return Encoding.UTF8.GetString(bytes); } - public static long encodeString(string s) { + public static long EncodeString(string s) { byte[] bytes = Encoding.UTF8.GetBytes(s); - return encodeUint8Array(bytes); + return EncodeUint8Array(bytes); } - public static int getArrayLength(long arrptr) { + public static int GetArrayLength(long arrptr) { long len; unsafe { long* arrlen = (long*) arrptr; @@ -51,25 +51,25 @@ public static int getArrayLength(long arrptr) { } - public static long getU64ArrayElem(long arrptr, int idx) { + public static long GetU64ArrayElem(long arrptr, int idx) { unsafe { long* arr = (long*) (arrptr + 8); return arr[idx]; } } - public static int getU32ArrayElem(long arrptr, int idx) { + public static int GetU32ArrayElem(long arrptr, int idx) { unsafe { int* arr = (int*) (arrptr + 8); return arr[idx]; } } - public static short getU16ArrayElem(long arrptr, int idx) { + public static short GetU16ArrayElem(long arrptr, int idx) { unsafe { short* arr = (short*) (arrptr + 8); return arr[idx]; } } - public static byte getU8ArrayElem(long arrptr, int idx) { + public static byte GetU8ArrayElem(long arrptr, int idx) { unsafe { byte* arr = (byte*) (arrptr + 8); return arr[idx]; @@ -77,8 +77,8 @@ public static byte getU8ArrayElem(long arrptr, int idx) { } - public static long encodeUint8Array(byte[] arr) { - long buf = bindings.allocate_buffer(arr.Length + 8); + public static long EncodeUint8Array(byte[] arr) { + long buf = Bindings.AllocateBuffer(arr.Length + 8); unsafe { *((long*)buf) = (long)arr.Length; } for (int i = 0; i < arr.Length; i++) { unsafe { @@ -87,8 +87,8 @@ public static long encodeUint8Array(byte[] arr) { } return buf; } - public static long encodeUint16Array(short[] arr) { - long buf = bindings.allocate_buffer(arr.Length * 2 + 8); + public static long EncodeUint16Array(short[] arr) { + long buf = Bindings.AllocateBuffer(arr.Length * 2 + 8); unsafe { *((long*)buf) = (long)arr.Length; } for (int i = 0; i < arr.Length; i++) { unsafe { @@ -97,8 +97,8 @@ public static long encodeUint16Array(short[] arr) { } return buf; } - public static long encodeUint32Array(int[] arr) { - long buf = bindings.allocate_buffer(arr.Length * 4 + 8); + public static long EncodeUint32Array(int[] arr) { + long buf = Bindings.AllocateBuffer(arr.Length * 4 + 8); unsafe { *((long*)buf) = (long)arr.Length; } for (int i = 0; i < arr.Length; i++) { unsafe { @@ -107,8 +107,8 @@ public static long encodeUint32Array(int[] arr) { } return buf; } - public static long encodeUint64Array(long[] arr) { - long buf = bindings.allocate_buffer(arr.Length * 8 + 8); + public static long EncodeUint64Array(long[] arr) { + long buf = Bindings.AllocateBuffer(arr.Length * 8 + 8); unsafe { *((long*)buf) = (long)arr.Length; } for (int i = 0; i < arr.Length; i++) { unsafe { @@ -119,28 +119,28 @@ public static long encodeUint64Array(long[] arr) { } - public static byte[] decodeUint8Array(long arrptr) { - int len = getArrayLength(arrptr); + public static byte[] DecodeUint8Array(long arrptr) { + int len = GetArrayLength(arrptr); byte[] res = new byte[len]; for (int i = 0; i < len; i++) - res[i] = getU8ArrayElem(arrptr, i); - bindings.free_buffer(arrptr); + res[i] = GetU8ArrayElem(arrptr, i); + Bindings.FreeBuffer(arrptr); return res; } - public static short[] decodeUint16Array(long arrptr) { - int len = getArrayLength(arrptr); + public static short[] DecodeUint16Array(long arrptr) { + int len = GetArrayLength(arrptr); short[] res = new short[len]; for (int i = 0; i < len; i++) - res[i] = getU16ArrayElem(arrptr, i); - bindings.free_buffer(arrptr); + res[i] = GetU16ArrayElem(arrptr, i); + Bindings.FreeBuffer(arrptr); return res; } - public static long[] decodeUint64Array(long arrptr) { - int len = getArrayLength(arrptr); + public static long[] DecodeUint64Array(long arrptr) { + int len = GetArrayLength(arrptr); long[] res = new long[len]; for (int i = 0; i < len; i++) - res[i] = getU64ArrayElem(arrptr, i); - bindings.free_buffer(arrptr); + res[i] = GetU64ArrayElem(arrptr, i); + Bindings.FreeBuffer(arrptr); return res; } } diff --git a/c_sharp/test/src/tests.cs b/c_sharp/test/src/tests.cs index 2e3d0d484..d75004c44 100644 --- a/c_sharp/test/src/tests.cs +++ b/c_sharp/test/src/tests.cs @@ -20,7 +20,7 @@ static void SimpleConstructionTest() { Assert(ping.get_ponglen() == 42, 0); } - class TestBroadcaster : BroadcasterInterfaceInterface { + class TestBroadcaster : IBroadcasterInterface { public bool broadcasted = false; public void broadcast_transactions(byte[][] txn) { Assert(txn.Length == 1, 1); @@ -38,7 +38,7 @@ static void SimpleTraitTest() { Assert(impl.broadcasted == true, 3); } - class TestEstimator : FeeEstimatorInterface { + class TestEstimator : IFeeEstimator { public int get_est_sat_per_1000_weight(ConfirmationTarget confirmation_target) { if (confirmation_target == ConfirmationTarget.LDKConfirmationTarget_MinAllowedNonAnchorChannelRemoteFee) { return 253; @@ -48,13 +48,13 @@ public int get_est_sat_per_1000_weight(ConfirmationTarget confirmation_target) { } } - class TestLogger : LoggerInterface { + class TestLogger : ILogger { public void log(Record record) { Console.WriteLine(record.get_module_path() + ":" + record.get_line() + " " + record.get_args()); } } - class TestPersister : PersistInterface { + class TestPersister : IPersist { public ChannelMonitorUpdateStatus persist_new_channel(OutPoint channel_id, ChannelMonitor data, MonitorUpdateId update_id) { return ChannelMonitorUpdateStatus.LDKChannelMonitorUpdateStatus_Completed; } @@ -63,7 +63,7 @@ public ChannelMonitorUpdateStatus update_persisted_channel(OutPoint channel_id, } } - class TestEventHandler : EventHandlerInterface { + class TestEventHandler : IEventHandler { public List events = new List(); public void handle_event(Event ev) { events.Add(ev); diff --git a/csharp_strings.py b/csharp_strings.py index 1121f9341..17b4931ae 100644 --- a/csharp_strings.py +++ b/csharp_strings.py @@ -17,6 +17,9 @@ def safe_arg_name(arg_name): def arg_name_repl(s, arg_name): return s.replace(arg_name, "_" + arg_name) if arg_name == "lock" or arg_name == "event" or arg_name == "params" else s +def snake_to_pascal(text: str): + return ''.join(x.title() if x and not x[0].isupper() else x for x in text.split('_')) + class Consts: def __init__(self, DEBUG: bool, target: Target, outdir: str, **kwargs): self.outdir = outdir @@ -54,7 +57,7 @@ def __init__(self, DEBUG: bool, target: Target, outdir: str, **kwargs): namespace org { namespace ldk { namespace impl { -internal class bindings { +internal class Bindings { static List js_objs = new List(); """ @@ -105,17 +108,17 @@ def __init__(self, DEBUG: bool, target: Target, outdir: str, **kwargs): public readonly int previous_vout; internal TxIn(object _dummy, long ptr) : base(ptr) { - this.witness = InternalUtils.decodeUint8Array(bindings.TxIn_get_witness(ptr)); - this.script_sig = InternalUtils.decodeUint8Array(bindings.TxIn_get_script_sig(ptr)); - this.sequence = bindings.TxIn_get_sequence(ptr); - this.previous_txid = InternalUtils.decodeUint8Array(bindings.TxIn_get_previous_txid(ptr)); - this.previous_vout = bindings.TxIn_get_previous_vout(ptr); + this.witness = InternalUtils.DecodeUint8Array(Bindings.TxInGetWitness(ptr)); + this.script_sig = InternalUtils.DecodeUint8Array(Bindings.TxInGetScriptSig(ptr)); + this.sequence = Bindings.TxInGetSequence(ptr); + this.previous_txid = InternalUtils.DecodeUint8Array(Bindings.TxInGetPreviousTxid(ptr)); + this.previous_vout = Bindings.TxInGetPreviousVout(ptr); } public TxIn(byte[] witness, byte[] script_sig, int sequence, byte[] previous_txid, int previous_vout) - : this(null, bindings.TxIn_new(InternalUtils.encodeUint8Array(witness), InternalUtils.encodeUint8Array(script_sig), sequence, InternalUtils.encodeUint8Array(previous_txid), previous_vout)) {} + : this(null, Bindings.TxInNew(InternalUtils.EncodeUint8Array(witness), InternalUtils.EncodeUint8Array(script_sig), sequence, InternalUtils.EncodeUint8Array(previous_txid), previous_vout)) {} ~TxIn() { - if (ptr != 0) { bindings.TxIn_free(ptr); } + if (ptr != 0) { Bindings.TxInFree(ptr); } } }""" @@ -126,13 +129,13 @@ def __init__(self, DEBUG: bool, target: Target, outdir: str, **kwargs): public readonly long value; internal TxOut(object _dummy, long ptr) : base(ptr) { - this.script_pubkey = InternalUtils.decodeUint8Array(bindings.TxOut_get_script_pubkey(ptr)); - this.value = bindings.TxOut_get_value(ptr); + this.script_pubkey = InternalUtils.DecodeUint8Array(Bindings.TxOutGetScriptPubkey(ptr)); + this.value = Bindings.TxOutGetValue(ptr); } - public TxOut(long value, byte[] script_pubkey) : this(null, bindings.TxOut_new(InternalUtils.encodeUint8Array(script_pubkey), value)) {} + public TxOut(long value, byte[] script_pubkey) : this(null, Bindings.TxOutNew(InternalUtils.EncodeUint8Array(script_pubkey), value)) {} ~TxOut() { - if (ptr != 0) { bindings.TxOut_free(ptr); } + if (ptr != 0) { Bindings.TxOutFree(ptr); } } }""" @@ -141,14 +144,14 @@ def __init__(self, DEBUG: bool, target: Target, outdir: str, **kwargs): public readonly byte[] scalar_bytes; internal BigEndianScalar(object _dummy, long ptr) : base(ptr) { - this.scalar_bytes = InternalUtils.decodeUint8Array(bindings.BigEndianScalar_get_bytes(ptr)); + this.scalar_bytes = InternalUtils.DecodeUint8Array(Bindings.BigEndianScalarGetBytes(ptr)); } - public BigEndianScalar(byte[] scalar_bytes) : base(bindings.BigEndianScalar_new(InternalUtils.encodeUint8Array(scalar_bytes))) { - this.scalar_bytes = InternalUtils.decodeUint8Array(bindings.BigEndianScalar_get_bytes(ptr)); + public BigEndianScalar(byte[] scalar_bytes) : base(Bindings.BigEndianScalarNew(InternalUtils.EncodeUint8Array(scalar_bytes))) { + this.scalar_bytes = InternalUtils.DecodeUint8Array(Bindings.BigEndianScalarGetBytes(ptr)); } ~BigEndianScalar() { - if (ptr != 0) { bindings.BigEndianScalar_free(ptr); } + if (ptr != 0) { Bindings.BigEndianScalarFree(ptr); } } }""" @@ -159,19 +162,19 @@ def __init__(self, DEBUG: bool, target: Target, outdir: str, **kwargs): public readonly WitnessVersion version; internal WitnessProgram(object _dummy, long ptr) : base(ptr) { - this.program = InternalUtils.decodeUint8Array(bindings.WitnessProgram_get_program(ptr)); - this.version = new WitnessVersion(bindings.WitnessProgram_get_version(ptr)); + this.program = InternalUtils.DecodeUint8Array(Bindings.WitnessProgramGetProgram(ptr)); + this.version = new WitnessVersion(Bindings.WitnessProgramGetVersion(ptr)); } static private long check_args(byte[] program, WitnessVersion version) { if (program.Length < 2 || program.Length > 40) throw new ArgumentException(); if (version.getVal() == 0 && program.Length != 20 && program.Length != 32) throw new ArgumentException(); - return InternalUtils.encodeUint8Array(program); + return InternalUtils.EncodeUint8Array(program); } public WitnessProgram(byte[] program, WitnessVersion version) : - this(null, bindings.WitnessProgram_new(version.getVal(), check_args(program, version))) {} + this(null, Bindings.WitnessProgramNew(version.getVal(), check_args(program, version))) {} ~WitnessProgram() { - if (ptr != 0) { bindings.WitnessProgram_free(ptr); } + if (ptr != 0) { Bindings.WitnessProgramFree(ptr); } } }""" @@ -492,7 +495,7 @@ def bindings_footer(self): return "" def native_meth_decl(self, meth_name, ret_ty_str): - return "\t[DllImport (\"ldkcsharp\", EntryPoint=\"CS_LDK_" + meth_name + "\")] public static extern " + ret_ty_str + " " + meth_name + return "\t[DllImport (\"ldkcsharp\", EntryPoint=\"CS_LDK_" + meth_name + "\")] public static extern " + ret_ty_str + " " + snake_to_pascal(meth_name) def c_fn_name_define_pfx(self, fn_name, have_args): return " CS_LDK_" + fn_name + "(" @@ -538,20 +541,20 @@ def cleanup_native_arr_ref_contents(self, arr_name, dest_name, arr_len, ty_info) def map_hu_array_elems(self, arr_name, conv_name, arr_ty, elem_ty, is_nullable): if elem_ty.java_hu_ty == "UInt5": - return "InternalUtils.convUInt5Array(" + arr_name + ")" + return "InternalUtils.ConvUInt5Array(" + arr_name + ")" elif elem_ty.java_hu_ty == "WitnessVersion": - return "InternalUtils.convWitnessVersionArray(" + arr_name + ")" + return "InternalUtils.ConvWitnessVersionArray(" + arr_name + ")" else: - return "InternalUtils.mapArray(" + arr_name + ", " + conv_name + " => " + elem_ty.from_hu_conv[0] + ")" + return "InternalUtils.MapArray(" + arr_name + ", " + conv_name + " => " + elem_ty.from_hu_conv[0] + ")" def str_ref_to_native_call(self, var_name, str_len): return "str_ref_to_cs(" + var_name + ", " + str_len + ")" def str_ref_to_c_call(self, var_name): return "str_ref_to_owned_c(" + var_name + ")" def str_to_hu_conv(self, var_name): - return "string " + var_name + "_conv = InternalUtils.decodeString(" + var_name + ");" + return "string " + var_name + "_conv = InternalUtils.DecodeString(" + var_name + ");" def str_from_hu_conv(self, var_name): - return ("InternalUtils.encodeString(" + var_name + ")", "") + return ("InternalUtils.EncodeString(" + var_name + ")", "") def init_str(self): ret = "" @@ -573,15 +576,15 @@ def var_decl_statement(self, ty_string, var_name, statement): return ty_string + " " + var_name + " = " + statement def get_java_arr_len(self, arr_name): - return "InternalUtils.getArrayLength(" + arr_name + ")" + return "InternalUtils.GetArrayLength(" + arr_name + ")" def get_java_arr_elem(self, elem_ty, arr_name, idx): if elem_ty.c_ty == "int64_t" or elem_ty.c_ty == "uint64_t" or elem_ty.c_ty.endswith("Array") or elem_ty.c_ty == "uintptr_t": - return "InternalUtils.getU64ArrayElem(" + arr_name + ", " + idx + ")" + return "InternalUtils.GetU64ArrayElem(" + arr_name + ", " + idx + ")" elif elem_ty.rust_obj == "LDKU5": - return "InternalUtils.getU8ArrayElem(" + arr_name + ", " + idx + ")" + return "InternalUtils.GetU8ArrayElem(" + arr_name + ", " + idx + ")" elif elem_ty.rust_obj == "LDKStr": - return "InternalUtils.getU32ArrayElem(" + arr_name + ", " + idx + ")" + return "InternalUtils.GetU32ArrayElem(" + arr_name + ", " + idx + ")" else: assert False @@ -593,25 +596,25 @@ def constr_hu_array(self, ty_info, arr_len): conv += "[" + ty_info.subty.java_hu_ty.split("<")[0].split("[")[1] return conv def cleanup_converted_native_array(self, ty_info, arr_name): - return "bindings.free_buffer(" + arr_name + ");" + return "Bindings.FreeBuffer(" + arr_name + ");" def primitive_arr_from_hu(self, arr_ty, fixed_len, arr_name): mapped_ty = arr_ty.subty inner = arr_name if arr_ty.rust_obj == "LDKU128": - return ("InternalUtils.encodeUint8Array(" + arr_name + ".getLEBytes())", "") + return ("InternalUtils.EncodeUint8Array(" + arr_name + ".getLEBytes())", "") if fixed_len is not None: - inner = "InternalUtils.check_arr_len(" + arr_name + ", " + fixed_len + ")" + inner = "InternalUtils.CheckArrLen(" + arr_name + ", " + fixed_len + ")" if mapped_ty.c_ty.endswith("Array"): - return ("InternalUtils.encodeUint64Array(" + inner + ")", "") + return ("InternalUtils.EncodeUint64Array(" + inner + ")", "") elif mapped_ty.c_ty == "uint8_t" or mapped_ty.c_ty == "int8_t": - return ("InternalUtils.encodeUint8Array(" + inner + ")", "") + return ("InternalUtils.EncodeUint8Array(" + inner + ")", "") elif mapped_ty.c_ty == "uint16_t" or mapped_ty.c_ty == "int16_t": - return ("InternalUtils.encodeUint16Array(" + inner + ")", "") + return ("InternalUtils.EncodeUint16Array(" + inner + ")", "") elif mapped_ty.c_ty == "uint32_t": - return ("InternalUtils.encodeUint32Array(" + inner + ")", "") + return ("InternalUtils.EncodeUint32Array(" + inner + ")", "") elif mapped_ty.c_ty == "int64_t" or mapped_ty.c_ty == "uint64_t" or mapped_ty.rust_obj == "LDKStr": - return ("InternalUtils.encodeUint64Array(" + inner + ")", "") + return ("InternalUtils.EncodeUint64Array(" + inner + ")", "") else: print(mapped_ty.c_ty) assert False @@ -621,11 +624,11 @@ def primitive_arr_to_hu(self, arr_ty, fixed_len, arr_name, conv_name): if arr_ty.rust_obj == "LDKU128": return "org.ldk.util.UInt128 " + conv_name + " = new org.ldk.util.UInt128(" + arr_name + ");" elif mapped_ty.c_ty == "uint8_t" or mapped_ty.c_ty == "int8_t": - return "byte[] " + conv_name + " = InternalUtils.decodeUint8Array(" + arr_name + ");" + return "byte[] " + conv_name + " = InternalUtils.DecodeUint8Array(" + arr_name + ");" elif mapped_ty.c_ty == "uint16_t" or mapped_ty.c_ty == "int16_t": - return "short[] " + conv_name + " = InternalUtils.decodeUint16Array(" + arr_name + ");" + return "short[] " + conv_name + " = InternalUtils.DecodeUint16Array(" + arr_name + ");" elif mapped_ty.c_ty == "uint64_t" or mapped_ty.c_ty == "int64_t": - return "long[] " + conv_name + " = InternalUtils.decodeUint64Array(" + arr_name + ");" + return "long[] " + conv_name + " = InternalUtils.DecodeUint64Array(" + arr_name + ");" else: assert False @@ -736,7 +739,7 @@ def native_c_map_trait(self, struct_name, field_var_conversions, flattened_field else: bindings_instantiator += ", " + first_to_lower(var[1]) + ".instance_idx" pointer_to_adder += "\t\timpl_holder.held.ptrs_to.AddLast(" + first_to_lower(var[1]) + ");\n" - impl_constructor_arguments += f", {var[0].replace('LDK', '')}Interface {first_to_lower(var[1])}_impl" + impl_constructor_arguments += f", I{var[0].replace('LDK', '')} {first_to_lower(var[1])}_impl" super_constructor_statements = "" trait_constructor_arguments = "" @@ -763,18 +766,20 @@ def native_c_map_trait(self, struct_name, field_var_conversions, flattened_field # BUILD INTERFACE METHODS - java_trait_wrapper = "\tprivate class " + struct_name + "Holder { internal " + struct_name.replace("LDK", "") + " held; }\n" - java_trait_wrapper += "\tprivate class " + struct_name + "Impl : bindings." + struct_name + " {\n" - java_trait_wrapper += "\t\tinternal " + struct_name + "Impl(" + struct_name.replace("LDK", "") + "Interface arg, " + struct_name + "Holder impl_holder) { this.arg = arg; this.impl_holder = impl_holder; }\n" - java_trait_wrapper += "\t\tprivate " + struct_name.replace("LDK", "") + "Interface arg;\n" - java_trait_wrapper += "\t\tprivate " + struct_name + "Holder impl_holder;\n" + struct_name_pascal = snake_to_pascal(struct_name) + + java_trait_wrapper = "\tprivate class " + struct_name_pascal + "Holder { internal " + struct_name_pascal.replace("LDK", "") + " held; }\n" + java_trait_wrapper += "\tprivate class " + struct_name_pascal + "Impl : Bindings." + struct_name_pascal + " {\n" + java_trait_wrapper += "\t\tinternal " + struct_name_pascal + "Impl(I" + struct_name_pascal.replace("LDK", "") + " arg, " + struct_name_pascal + "Holder impl_holder) { this.arg = arg; this.impl_holder = impl_holder; }\n" + java_trait_wrapper += "\t\tprivate I" + struct_name_pascal.replace("LDK", "") + " arg;\n" + java_trait_wrapper += "\t\tprivate " + struct_name_pascal + "Holder impl_holder;\n" for fn_line in field_function_lines: if fn_line.fn_name != "free" and fn_line.fn_name != "cloned": fn_name = fn_line.fn_name if fn_name == "lock": # reserved symbol fn_name = "do_lock" - java_trait_wrapper += "\t\tpublic " + fn_line.ret_ty_info.java_ty + " " + fn_name + "(" + java_trait_wrapper += "\t\tpublic " + fn_line.ret_ty_info.java_ty + " " + snake_to_pascal(fn_name) + "(" for idx, arg_conv_info in enumerate(fn_line.args_ty): if idx >= 1: @@ -834,31 +839,31 @@ def native_c_map_trait(self, struct_name, field_var_conversions, flattened_field out_typescript_human = f""" {self.hu_struct_file_prefix} -/** An implementation of {struct_name.replace("LDK","")} */ -public interface {struct_name.replace("LDK", "")}Interface {{ +/** An implementation of {struct_name_pascal.replace("LDK","")} */ +public interface I{struct_name_pascal.replace("LDK", "")} {{ {out_java_interface}}} /** * {formatted_trait_docs} */ -public class {struct_name.replace("LDK","")} : CommonBase {{ - internal bindings.{struct_name} bindings_instance; +public class {struct_name_pascal.replace("LDK","")} : CommonBase {{ + internal Bindings.{snake_to_pascal(struct_name_pascal)} bindings_instance; internal long instance_idx; - internal {struct_name.replace("LDK","")}(object _dummy, long ptr) : base(ptr) {{ bindings_instance = null; }} - ~{struct_name.replace("LDK","")}() {{ - if (ptr != 0) {{ bindings.{struct_name.replace("LDK","")}_free(ptr); }} + internal {struct_name_pascal.replace("LDK","")}(object _dummy, long ptr) : base(ptr) {{ bindings_instance = null; }} + ~{struct_name_pascal.replace("LDK","")}() {{ + if (ptr != 0) {{ Bindings.{snake_to_pascal(f'{struct_name_pascal.replace("LDK","")}_free')}(ptr); }} }} {java_trait_wrapper} - /** Creates a new instance of {struct_name.replace("LDK","")} from a given implementation */ - public static {struct_name.replace("LDK", "")} new_impl({struct_name.replace("LDK", "")}Interface arg{impl_constructor_arguments}) {{ - {struct_name}Holder impl_holder = new {struct_name}Holder(); - {struct_name}Impl impl = new {struct_name}Impl(arg, impl_holder); -{super_constructor_statements} long[] ptr_idx = bindings.{struct_name}_new(impl{bindings_instantiator}); + /** Creates a new instance of {struct_name_pascal.replace("LDK","")} from a given implementation */ + public static {struct_name_pascal.replace("LDK", "")} new_impl(I{struct_name_pascal.replace("LDK", "")} arg{impl_constructor_arguments}) {{ + {struct_name_pascal}Holder impl_holder = new {struct_name_pascal}Holder(); + {struct_name_pascal}Impl impl = new {struct_name_pascal}Impl(arg, impl_holder); +{super_constructor_statements} long[] ptr_idx = Bindings.{snake_to_pascal(f'{struct_name_pascal}_new')}(impl{bindings_instantiator}); - impl_holder.held = new {struct_name.replace("LDK", "")}(null, ptr_idx[0]); + impl_holder.held = new {struct_name_pascal.replace("LDK", "")}(null, ptr_idx[0]); impl_holder.held.instance_idx = ptr_idx[1]; impl_holder.held.bindings_instance = impl; {pointer_to_adder} return impl_holder.held; @@ -866,11 +871,11 @@ def native_c_map_trait(self, struct_name, field_var_conversions, flattened_field """ - out_typescript_bindings += "\tpublic interface " + struct_name + " {\n" + out_typescript_bindings += "\tpublic interface " + struct_name_pascal + " {\n" java_meths = [] for fn_line in field_function_lines: if fn_line.fn_name != "free" and fn_line.fn_name != "cloned": - out_typescript_bindings += f"\t\t{fn_line.ret_ty_info.java_ty} {fn_line.fn_name}(" + out_typescript_bindings += f"\t\t{fn_line.ret_ty_info.java_ty} {snake_to_pascal(fn_line.fn_name)}(" for idx, arg_conv_info in enumerate(fn_line.args_ty): if idx >= 1: @@ -888,8 +893,8 @@ def native_c_map_trait(self, struct_name, field_var_conversions, flattened_field native_fn_args += ", " + var.java_ty + " " + var.arg_name else: native_fn_args += ", long " + var[1] - out_typescript_bindings += self.native_meth_decl(struct_name + "_new", "long") + "_native(" + native_fn_args + ");\n" - out_typescript_bindings += f"\tpublic static long[] {struct_name}_new({struct_name} impl" + out_typescript_bindings += self.native_meth_decl(struct_name + "_new", "long") + "Native(" + native_fn_args + ");\n" + out_typescript_bindings += f"\tpublic static long[] {snake_to_pascal(f'{struct_name}_new')}({struct_name_pascal} impl" for var in flattened_field_var_conversions: if isinstance(var, ConvInfo): out_typescript_bindings += f", {var.java_ty} {var.arg_name}" @@ -911,7 +916,7 @@ def native_c_map_trait(self, struct_name, field_var_conversions, flattened_field js_objs[i] = new WeakReference(impl); }} long[] ret = new long[2]; - ret[0] = {struct_name}_new_native(i{c_call_extra_args}); + ret[0] = {snake_to_pascal(f'{struct_name_pascal}_new_native')}(i{c_call_extra_args}); ret[1] = i; return ret; }} @@ -1113,10 +1118,10 @@ def map_complex_enum(self, struct_name, variant_list, camel_to_snake, enum_doc_c java_hu_class += "public class " + java_hu_type + " : CommonBase {\n" java_hu_class += f"\tprotected {java_hu_type}(object _dummy, long ptr) : base(ptr)" + " { }\n" java_hu_class += "\t~" + java_hu_type + "() {\n" - java_hu_class += "\t\tif (ptr != 0) { bindings." + bindings_type + "_free(ptr); }\n" + java_hu_class += "\t\tif (ptr != 0) { Bindings." + snake_to_pascal(bindings_type + "_free") + "(ptr); }\n" java_hu_class += "\t}\n\n" java_hu_class += f"\tinternal static {java_hu_type} constr_from_ptr(long ptr) {{\n" - java_hu_class += f"\t\tlong raw_ty = bindings." + struct_name + "_ty_from_ptr(ptr);\n" + java_hu_class += f"\t\tlong raw_ty = Bindings." + snake_to_pascal(struct_name + "_ty_from_ptr") + "(ptr);\n" out_c += self.c_fn_ty_pfx + "uint32_t" + self.c_fn_name_define_pfx(struct_name + "_ty_from_ptr", True) + self.ptr_c_ty + " ptr) {\n" out_c += "\t" + struct_name + " *obj = (" + struct_name + "*)untag_ptr(ptr);\n" out_c += "\tswitch(obj->tag) {\n" @@ -1136,11 +1141,13 @@ def map_complex_enum(self, struct_name, variant_list, camel_to_snake, enum_doc_c java_hu_subclasses += "\t\t/**\n\t\t * " + field_docs.replace("\n", "\n\t\t * ") + "\n\t\t */\n" java_hu_subclasses += f"\t\tpublic {field_ty.java_hu_ty} {field_ty.arg_name};\n" if field_ty.to_hu_conv is not None: - hu_conv_body += f"\t\t\t{field_ty.java_ty} {field_ty.arg_name} = bindings.{struct_name}_{var.var_name}_get_{field_ty.arg_name}(ptr);\n" + conv_pascal = snake_to_pascal(f"{struct_name}_{var.var_name}_get_{field_ty.arg_name}") + hu_conv_body += f"\t\t\t{field_ty.java_ty} {field_ty.arg_name} = Bindings.{conv_pascal}(ptr);\n" hu_conv_body += f"\t\t\t" + field_ty.to_hu_conv.replace("\n", "\n\t\t\t") + "\n" hu_conv_body += f"\t\t\tthis." + field_ty.arg_name + " = " + field_ty.to_hu_conv_name + ";\n" else: - hu_conv_body += f"\t\t\tthis.{field_ty.arg_name} = bindings.{struct_name}_{var.var_name}_get_{field_ty.arg_name}(ptr);\n" + conv_pascal = snake_to_pascal(f"{struct_name}_{var.var_name}_get_{field_ty.arg_name}") + hu_conv_body += f"\t\t\tthis.{field_ty.arg_name} = Bindings.{conv_pascal}(ptr);\n" java_hu_subclasses += "\t\tinternal " + java_hu_type + "_" + var.var_name + "(long ptr) : base(null, ptr) {\n" java_hu_subclasses += hu_conv_body java_hu_subclasses += "\t\t}\n\t}\n" @@ -1189,7 +1196,7 @@ def map_opaque_struct(self, struct_name, struct_doc_comment): out_opaque_struct_human += ("\tpublic void Dispose() {\n") else: out_opaque_struct_human += ("\t~" + hu_name + "() {\n") - out_opaque_struct_human += ("\t\tif (ptr != 0) { bindings." + struct_name.replace("LDK","") + "_free(ptr); }\n") + out_opaque_struct_human += ("\t\tif (ptr != 0) { Bindings." + snake_to_pascal(struct_name.replace("LDK","") + "_free") + "(ptr); }\n") out_opaque_struct_human += ("\t}\n\n") return out_opaque_struct_human @@ -1203,10 +1210,10 @@ def map_result(self, struct_name, res_map, err_map): java_hu_struct += "public class " + human_ty + " : CommonBase {\n" java_hu_struct += "\t" + human_ty + "(object _dummy, long ptr) : base(ptr) { }\n" java_hu_struct += "\t~" + human_ty + "() {\n" - java_hu_struct += "\t\tif (ptr != 0) { bindings." + struct_name.replace("LDK","") + "_free(ptr); }\n" + java_hu_struct += "\t\tif (ptr != 0) { Bindings." + snake_to_pascal(struct_name.replace("LDK","") + "_free") + "(ptr); }\n" java_hu_struct += "\t}\n\n" java_hu_struct += "\tinternal static " + human_ty + " constr_from_ptr(long ptr) {\n" - java_hu_struct += "\t\tif (bindings." + struct_name.replace("LDK", "") + "_is_ok(ptr)) {\n" + java_hu_struct += "\t\tif (Bindings." + snake_to_pascal(struct_name.replace("LDK", "") + "_is_ok") + "(ptr)) {\n" java_hu_struct += "\t\t\treturn new " + human_ty + "_OK(null, ptr);\n" java_hu_struct += "\t\t} else {\n" java_hu_struct += "\t\t\treturn new " + human_ty + "_Err(null, ptr);\n" @@ -1221,11 +1228,11 @@ def map_result(self, struct_name, res_map, err_map): if res_map.java_hu_ty == "void": pass elif res_map.to_hu_conv is not None: - java_hu_struct += "\t\t\t" + res_map.java_ty + " res = bindings." + struct_name.replace("LDK", "") + "_get_ok(ptr);\n" + java_hu_struct += "\t\t\t" + res_map.java_ty + " res = Bindings." + snake_to_pascal(struct_name.replace("LDK", "") + "_get_ok") + "(ptr);\n" java_hu_struct += "\t\t\t" + res_map.to_hu_conv.replace("\n", "\n\t\t\t") java_hu_struct += "\n\t\t\tthis.res = " + res_map.to_hu_conv_name + ";\n" else: - java_hu_struct += "\t\t\tthis.res = bindings." + struct_name.replace("LDK", "") + "_get_ok(ptr);\n" + java_hu_struct += "\t\t\tthis.res = Bindings." + snake_to_pascal(struct_name.replace("LDK", "") + "_get_ok") + "(ptr);\n" java_hu_struct += "\t\t}\n" java_hu_struct += "\t}\n\n" @@ -1236,11 +1243,11 @@ def map_result(self, struct_name, res_map, err_map): if err_map.java_hu_ty == "void": pass elif err_map.to_hu_conv is not None: - java_hu_struct += "\t\t\t" + err_map.java_ty + " err = bindings." + struct_name.replace("LDK", "") + "_get_err(ptr);\n" + java_hu_struct += "\t\t\t" + err_map.java_ty + " err = Bindings." + snake_to_pascal(struct_name.replace("LDK", "") + "_get_err") + "(ptr);\n" java_hu_struct += "\t\t\t" + err_map.to_hu_conv.replace("\n", "\n\t\t\t") java_hu_struct += "\n\t\t\tthis.err = " + err_map.to_hu_conv_name + ";\n" else: - java_hu_struct += "\t\t\tthis.err = bindings." + struct_name.replace("LDK", "") + "_get_err(ptr);\n" + java_hu_struct += "\t\t\tthis.err = Bindings." + snake_to_pascal(struct_name.replace("LDK", "") + "_get_err") + "(ptr);\n" java_hu_struct += "\t\t}\n" java_hu_struct += "\t}\n\n" @@ -1363,14 +1370,14 @@ def map_function(self, argument_types, c_call_string, method_name, meth_n, retur out_java_struct += ("\t\t") if return_type_info.java_ty != "void": out_java_struct += (return_type_info.java_ty + " ret = ") - out_java_struct += ("bindings." + method_name + "(") + out_java_struct += ("Bindings." + snake_to_pascal(method_name) + "(") for idx, info in enumerate(argument_types): if idx != 0: out_java_struct += (", ") if idx == 0 and takes_self: out_java_struct += ("this.ptr") elif info.arg_name in default_constructor_args: - out_java_struct += ("bindings." + info.java_hu_ty + "_new(") + out_java_struct += ("Bindings." + snake_to_pascal(info.java_hu_ty + "_new(")) for explode_idx, explode_arg in enumerate(default_constructor_args[info.arg_name]): if explode_idx != 0: out_java_struct += (", ") @@ -1446,16 +1453,18 @@ def cleanup(self): jret = self.function_ptrs[fn_suffix]["ret"][0] jargs = self.function_ptrs[fn_suffix]["args"][0] + fn_suffix_pascal = snake_to_pascal(fn_suffix) + bindings.write(f""" - static {jret} c_callback_{fn_suffix}(int obj_ptr, int fn_id{jargs}) {{ + static {jret} CCallback{fn_suffix_pascal}(int obj_ptr, int fn_id{jargs}) {{ if (obj_ptr >= js_objs.Count) {{ - Console.Error.WriteLine("Got function call on unknown/free'd JS object in {fn_suffix}"); + Console.Error.WriteLine("Got function call on unknown/free'd JS object in {fn_suffix_pascal}"); Console.Error.Flush(); Environment.Exit(42); }} object obj = js_objs[obj_ptr].Target; if (obj == null) {{ - Console.Error.WriteLine("Got function call on GC'd JS object in {fn_suffix}"); + Console.Error.WriteLine("Got function call on GC'd JS object in {fn_suffix_pascal}"); Console.Error.Flush(); Environment.Exit(43); }} @@ -1469,7 +1478,7 @@ def cleanup(self): Console.Error.Flush(); Environment.Exit(44); }}\n""") - call = f"(({self.function_ptrs[fn_suffix][f][0]})obj).{self.function_ptrs[fn_suffix][f][1]}({self.function_ptrs[fn_suffix][f][2]});" + call = f"(({self.function_ptrs[fn_suffix][f][0]})obj).{snake_to_pascal(self.function_ptrs[fn_suffix][f][1])}({self.function_ptrs[fn_suffix][f][2]});" if jret != "void": bindings.write("\t\t\t\treturn " + call) else: @@ -1477,18 +1486,18 @@ def cleanup(self): bindings.write("\n") bindings.write(f"""\t\t\tdefault: - Console.Error.WriteLine("Got unknown function call with id " + fn_id + " from C in {fn_suffix}"); + Console.Error.WriteLine("Got unknown function call with id " + fn_id + " from C in {fn_suffix_pascal}"); Console.Error.Flush(); Environment.Exit(45); return{" false" if jret == "bool" else " 0" if jret != "void" else ""}; }} }} - public delegate {jret} {fn_suffix}_callback(int obj_ptr, int fn_id{jargs}); - static {fn_suffix}_callback {fn_suffix}_callback_inst = c_callback_{fn_suffix}; + public delegate {jret} {fn_suffix_pascal}Callback(int obj_ptr, int fn_id{jargs}); + static {fn_suffix_pascal}Callback {fn_suffix_pascal}CallbackInst = CCallback{fn_suffix_pascal}; """) - bindings.write(self.native_meth_decl(f"register_{fn_suffix}_invoker", "int") + f"({fn_suffix}_callback callee);\n") + bindings.write(self.native_meth_decl(f"register_{fn_suffix}_invoker", "int") + f"({fn_suffix_pascal}Callback callee);\n") # Easiest way to get a static run is just define a variable, even if we dont care - bindings.write(f"\tstatic int _run_{fn_suffix}_registration = register_{fn_suffix}_invoker({fn_suffix}_callback_inst);") + bindings.write(f"\tstatic int _run_{fn_suffix}_registration = Register{fn_suffix_pascal}Invoker({fn_suffix_pascal}CallbackInst);") bindings.write(""" }