mirror of
https://github.com/rizinorg/rz-bindgen.git
synced 2026-11-08 08:08:19 -10:00
Compare commits
59
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8618b4051a | ||
|
|
318cfbc9b3 | ||
|
|
05ce528bc2 | ||
|
|
d9b84f46e7 | ||
|
|
fe8468ea29 | ||
|
|
4e324800d8 | ||
|
|
eecc6bb442 | ||
|
|
b93006e24b | ||
|
|
f1dbe864e6 | ||
|
|
1723f6e06e | ||
|
|
c527db8fcb | ||
|
|
918136cbc2 | ||
|
|
84a9542c9e | ||
|
|
b47d3071c2 | ||
|
|
66f06da3cf | ||
|
|
8d233afef2 | ||
|
|
3fc9aedc2b | ||
|
|
046a905246 | ||
|
|
d00a7e9174 | ||
|
|
52d315929b | ||
|
|
97d3a2d579 | ||
|
|
4d92885261 | ||
|
|
e106047c66 | ||
|
|
23dcdda1b0 | ||
|
|
aa3340800e | ||
|
|
438499c470 | ||
|
|
1caa6237ee | ||
|
|
70b2c55651 | ||
|
|
7da2b62917 | ||
|
|
a33dca2316 | ||
|
|
d5a3644dde | ||
|
|
6da1edb1fe | ||
|
|
c001b1e7d2 | ||
|
|
31a887b66d | ||
|
|
012c7073ae | ||
|
|
1afe440947 | ||
|
|
7cb3b801a1 | ||
|
|
23fe3cdf08 | ||
|
|
98ec55469e | ||
|
|
39c4c75144 | ||
|
|
5f60421e19 | ||
|
|
4ea002e837 | ||
|
|
673bdc320a | ||
|
|
601d3025c3 | ||
|
|
b3d654aa08 | ||
|
|
48d8602525 | ||
|
|
e0f4cb5cea | ||
|
|
19f9fad430 | ||
|
|
19b165c789 | ||
|
|
5ab96866a1 | ||
|
|
b6df7168e1 | ||
|
|
c09e93e06e | ||
|
|
ab25a61ee7 | ||
|
|
18bab79f2a | ||
|
|
be13ad624e | ||
|
|
7ba0eaafca | ||
|
|
336169bb07 | ||
|
|
d1e5f15299 | ||
|
|
dd453e7e21 |
No files matched your search
+109
-30
@@ -1,54 +1,133 @@
|
||||
name: run-rz-bindgen
|
||||
name: build
|
||||
on:
|
||||
push:
|
||||
paths:
|
||||
- 'src/**.py'
|
||||
- 'src/**.pyi'
|
||||
- 'src/**.i'
|
||||
- 'meson.build'
|
||||
- 'meson_options.txt'
|
||||
workflow_dispatch:
|
||||
workflow_call:
|
||||
inputs:
|
||||
external_call:
|
||||
description: 'To distinguish workflow_call from regular push'
|
||||
type: boolean
|
||||
required: false
|
||||
default: true
|
||||
rizin_ref:
|
||||
required: false
|
||||
type: string
|
||||
default: 'dev'
|
||||
|
||||
jobs:
|
||||
run-bindgen:
|
||||
name: Run bindgen
|
||||
pypa-wheels:
|
||||
runs-on: ${{ matrix.os }}
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [ubuntu-20.04, windows-2019, macos-latest]
|
||||
os: [ubuntu-24.04, windows-2019, macos-14]
|
||||
|
||||
steps:
|
||||
- name: Checkout rz-bindgen
|
||||
uses: actions/checkout@v3
|
||||
- name: Install SWIG with Homebrew
|
||||
if: matrix.os == 'macos-14' && matrix.enabled
|
||||
run: brew install swig
|
||||
|
||||
- name: Checkout rz-bindgen
|
||||
uses: actions/checkout@v4
|
||||
|
||||
# runned only from workflow_call
|
||||
- name: Checkout rizin
|
||||
uses: actions/checkout@v3
|
||||
if: ${{ inputs.external_call }}
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
repository: rizinorg/rizin
|
||||
path: rizin
|
||||
ref: ${{ inputs.rizin_ref }}
|
||||
|
||||
- name: Run rz-bindgen
|
||||
uses: pypa/[email protected]
|
||||
|
||||
- name: Upload artifacts
|
||||
uses: actions/upload-artifact@v3
|
||||
- name: Checkout rizin (stable)
|
||||
if: ${{ !inputs.external_call && ((github.ref_name == 'stable') || (github.base_ref == 'stable')) }}
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
repository: rizinorg/rizin
|
||||
path: rizin
|
||||
ref: stable
|
||||
|
||||
- name: Checkout rizin (dev)
|
||||
if: ${{ !inputs.external_call && ((github.ref_name != 'stable') && (github.base_ref != 'stable')) }}
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
repository: rizinorg/rizin
|
||||
path: rizin
|
||||
ref: dev
|
||||
|
||||
- name: Build rz-bindgen
|
||||
uses: pypa/[email protected]
|
||||
|
||||
- name: Upload sdist
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: sdist-${{ matrix.os }}
|
||||
path: dist/*.tar.gz
|
||||
|
||||
- name: Upload wheels
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: wheels-${{ matrix.os }}
|
||||
path: wheelhouse/*.whl
|
||||
|
||||
publish-pypi:
|
||||
name: Publish PyPi
|
||||
runs-on: ubuntu-latest
|
||||
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags')
|
||||
needs: [run-bindgen]
|
||||
ubuntu-default-llvm:
|
||||
runs-on: ubuntu-24.04
|
||||
|
||||
steps:
|
||||
- name: Download artifacts
|
||||
uses: actions/download-artifact@v3
|
||||
- name: Checkout rz-bindgen
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
name: artifact
|
||||
path: dist
|
||||
- name: Publish wheels
|
||||
uses: pypa/[email protected]
|
||||
path: rz-bindgen
|
||||
|
||||
# runned only from workflow_call
|
||||
- name: Checkout rizin
|
||||
if: ${{ inputs.external_call }}
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
password: ${{ secrets.PYPI_TOKEN }}
|
||||
repository: rizinorg/rizin
|
||||
path: rizin
|
||||
ref: ${{ inputs.rizin_ref }}
|
||||
|
||||
- name: Checkout rizin (stable)
|
||||
if: ${{ !inputs.external_call && ((github.ref_name == 'stable') || (github.base_ref == 'stable')) }}
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
repository: rizinorg/rizin
|
||||
path: rizin
|
||||
ref: stable
|
||||
|
||||
- name: Checkout rizin (dev)
|
||||
if: ${{ !inputs.external_call && ((github.ref_name != 'stable') && (github.base_ref != 'stable')) }}
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
repository: rizinorg/rizin
|
||||
path: rizin
|
||||
ref: dev
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
sudo apt update
|
||||
sudo apt-get --assume-yes install cmake swig pkg-config clang libclang-dev llvm wget unzip python3-wheel python3-setuptools build-essential python3-pip
|
||||
sudo pip3 install meson ninja
|
||||
|
||||
- name: Install rizin
|
||||
run: |
|
||||
export PATH=$PATH:/usr/local/bin
|
||||
meson setup --prefix=/usr --buildtype=release build && ninja -C build && sudo ninja -C build install
|
||||
working-directory: rizin
|
||||
|
||||
- name: Build rz-bindgen
|
||||
run: |
|
||||
meson setup --prefix=/usr -Dplugin=enabled build
|
||||
meson compile -C build
|
||||
sudo meson install -C build
|
||||
working-directory: rz-bindgen
|
||||
|
||||
- name: Test python lang plugin
|
||||
run: rizin -qc "Ll" | grep "Python SWIG"
|
||||
|
||||
- name: Test rizin.py
|
||||
run: |
|
||||
echo "import rizin" > testimport.py
|
||||
python3 testimport.py
|
||||
@@ -1,8 +1,8 @@
|
||||
name: linting
|
||||
name: lint
|
||||
on: push
|
||||
jobs:
|
||||
licenses:
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- name: Checkout rz-bindgen
|
||||
uses: actions/checkout@v3
|
||||
@@ -10,7 +10,7 @@ jobs:
|
||||
uses: fsfe/reuse-action@v1
|
||||
|
||||
python:
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- name: Checkout rz-bindgen
|
||||
uses: actions/checkout@v3
|
||||
@@ -19,7 +19,7 @@ jobs:
|
||||
pip install mypy pyflakes pylint black
|
||||
- name: Run mypy
|
||||
run: |
|
||||
mypy src/main.py
|
||||
mypy --disable-error-code misc src/main.py
|
||||
if: ${{ always() }}
|
||||
- name: Run pyflakes
|
||||
run: |
|
||||
@@ -35,7 +35,7 @@ jobs:
|
||||
if: ${{ always() }}
|
||||
|
||||
codeql:
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ubuntu-24.04
|
||||
permissions:
|
||||
security-events: write
|
||||
steps:
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
name: release
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- rizin-v*_*
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
extract-rizin-version:
|
||||
runs-on: ubuntu-24.04
|
||||
outputs:
|
||||
rizin_version: ${{ steps.extract_version.outputs.result }}
|
||||
steps:
|
||||
- id: extract_version
|
||||
run: echo "result=$(echo ${{ github.ref }} | cut -d'_' -f1 | cut -d'-' -f2-)" >> "$GITHUB_OUTPUT"
|
||||
|
||||
build:
|
||||
uses: ./.github/workflows/ci.yml
|
||||
needs: [extract-rizin-version]
|
||||
with:
|
||||
rizin_ref: ${{ needs.extract-rizin-version.outputs.rizin_version }}
|
||||
|
||||
publish-pypi:
|
||||
runs-on: ubuntu-24.04
|
||||
needs: [build]
|
||||
steps:
|
||||
- name: Download artifacts
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: wheels
|
||||
path: dist
|
||||
- name: Download sdist
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: sdist
|
||||
path: dist
|
||||
- name: Publish wheels
|
||||
uses: pypa/[email protected]
|
||||
with:
|
||||
password: ${{ secrets.PYPI_TOKEN }}
|
||||
@@ -9,9 +9,9 @@ For usage information, see [the documentation](doc/README.md).
|
||||
## Building python plugin
|
||||
Requirements:
|
||||
- rizin > 0.4.1 (needs commit [59b38e6](https://github.com/rizinorg/rizin/commit/59b38e6efaf00b9b9869e0ec5baba4f1b9605f37))
|
||||
- meson
|
||||
- meson >= 1.1.0
|
||||
- ninja
|
||||
- python >= 3.7
|
||||
- python >= 3.10
|
||||
- libclang
|
||||
- SWIG
|
||||
|
||||
|
||||
+36
-5
@@ -4,21 +4,52 @@
|
||||
set -ex
|
||||
|
||||
# Install deps
|
||||
pip3 install meson ninja meson-python
|
||||
pygt311=$(python3 -c 'import sys; print(0) if sys.version_info.minor > 11 else print(1)' 2>&1)
|
||||
if [[ $pygt311 == '0' ]]; then
|
||||
pip3 install --break-system-packages meson ninja meson-python build
|
||||
else
|
||||
pip3 install meson ninja meson-python build
|
||||
fi
|
||||
|
||||
if command -v apt; then
|
||||
apt update && apt install --assume-yes libclang-7-dev clang-7 llvm-7
|
||||
if command -v brew; then
|
||||
brew install --require-sha swig
|
||||
elif command -v apt; then
|
||||
set +e
|
||||
grep VERSION_CODENAME=stretch /etc/os-release >/dev/null 2>/dev/null
|
||||
if [[ $? == 0 ]] ; then
|
||||
# Required because manylinux_2_24 uses Debian Stretch and the repos are not available anymore
|
||||
echo "deb http://archive.debian.org/debian stretch main" > /etc/apt/sources.list
|
||||
echo "deb http://archive.debian.org/debian-security stretch/updates main" >> /etc/apt/sources.list
|
||||
echo "Acquire::Check-Valid-Until no;" > /etc/apt/apt.conf.d/99no-check-valid-until
|
||||
fi
|
||||
set -e
|
||||
apt update && apt install --assume-yes libclang-7-dev clang-7 llvm-7 sudo
|
||||
elif command -v apk; then
|
||||
apk update && apk add clang-dev
|
||||
apk update && apk add clang-dev sudo
|
||||
elif command -v yum; then
|
||||
yum -y install llvm-toolset-7.0 llvm-toolset-7.0-llvm-devel sudo
|
||||
# (CentOS 7) Uncomment following lines to see required paths in build log:
|
||||
# yum -y install centos-release-scl
|
||||
# source scl_source enable llvm-toolset-7.0 || true
|
||||
fi
|
||||
|
||||
pushd rizin
|
||||
|
||||
if [[ "$OSTYPE" =~ msys* ]]; then
|
||||
meson setup --buildtype=release --prefix='c:/rizin' --vsenv build
|
||||
meson install -C build
|
||||
else
|
||||
if [[ "$OSTYPE" =~ linux* ]]; then
|
||||
export CFLAGS="-include linux/limits.h"
|
||||
fi
|
||||
meson setup --buildtype=release --libdir=lib build
|
||||
sudo meson install -C build
|
||||
fi
|
||||
|
||||
meson install -C build
|
||||
popd
|
||||
|
||||
if command -v apt; then
|
||||
if [ ! -e dist/*.tar.gz ] ; then
|
||||
python3 -m build --sdist
|
||||
fi
|
||||
fi
|
||||
+59
-61
@@ -1,7 +1,8 @@
|
||||
project('rz-bindgen', 'c', 'cpp',
|
||||
version: 'v0.5.0dev',
|
||||
version: '0.6.0',
|
||||
license: 'LGPL3',
|
||||
meson_version: '>=0.53.0')
|
||||
meson_version: '>=0.62.2',
|
||||
default_options: ['python.install_env=auto'])
|
||||
|
||||
pymod = import('python')
|
||||
fs = import('fs')
|
||||
@@ -18,9 +19,9 @@ target_sphinx = targets.contains('sphinx')
|
||||
doxygen_path = get_option('doxygen_path')
|
||||
|
||||
if clang_path == ''
|
||||
llvm = dependency('llvm', required: false)
|
||||
if llvm.found()
|
||||
clang_path = llvm.get_variable(configtool: 'libdir', default_value: 'none')
|
||||
llvm_config = find_program('llvm-config', 'llvm-config-7', required: false)
|
||||
if llvm_config.found()
|
||||
clang_path = run_command(llvm_config, '--libdir', check: true).stdout().strip()
|
||||
elif build_machine.system() == 'darwin'
|
||||
clang_path = '/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/'
|
||||
elif build_machine.system() == 'windows'
|
||||
@@ -34,12 +35,13 @@ if not fs.exists(clang_path)
|
||||
error('CLang path does not exist')
|
||||
endif
|
||||
|
||||
rz_core = disabler()
|
||||
if rizin_include_path == ''
|
||||
rz_main = dependency('rz_main')
|
||||
if rz_main.type_name() == 'pkgconfig'
|
||||
rizin_include_path = rz_main.get_variable(pkgconfig: 'includedir') / 'librz'
|
||||
elif rz_main.type_name() == 'cmake'
|
||||
rizin_include_path = rz_main.get_variable(cmake: 'PACKAGE_INCLUDE_DIRS').split(';')[0]
|
||||
rz_core = dependency('rz_core')
|
||||
if rz_core.type_name() == 'pkgconfig'
|
||||
rizin_include_path = rz_core.get_variable(pkgconfig: 'includedir') / 'librz'
|
||||
elif rz_core.type_name() == 'cmake'
|
||||
rizin_include_path = rz_core.get_variable(cmake: 'PACKAGE_INCLUDE_DIRS').split(';')[0]
|
||||
endif
|
||||
endif
|
||||
|
||||
@@ -47,7 +49,7 @@ if clang_args == ''
|
||||
clang = find_program('clang', 'clang-7', required: false)
|
||||
if clang.found()
|
||||
clang_args += ' -resource-dir='
|
||||
clang_args += run_command(clang, '-print-resource-dir', check: true).stdout().strip()
|
||||
clang_args += '"' + run_command(clang, '-print-resource-dir', check: true).stdout().strip() + '"'
|
||||
endif
|
||||
if build_machine.system() == 'darwin'
|
||||
clang_args += ' -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk'
|
||||
@@ -70,48 +72,43 @@ summary({
|
||||
'Clang path': clang_path,
|
||||
})
|
||||
|
||||
src_files = files(
|
||||
'src/binding_class.py',
|
||||
'src/binding_director.py',
|
||||
'src/binding_enum.py',
|
||||
'src/binding_func.py',
|
||||
'src/binding_generic.py',
|
||||
'src/binding_generic_specializations.py',
|
||||
'src/binding_typemap.py',
|
||||
'src/bindings.py',
|
||||
'src/cparser_header.py',
|
||||
'src/cparser_types.py',
|
||||
'src/generator_sphinx.py',
|
||||
'src/generator_swig.py',
|
||||
'src/lint.py',
|
||||
'src/main.py',
|
||||
'src/writer.py',
|
||||
)
|
||||
if target_swig or target_sphinx
|
||||
src_files = files(
|
||||
'src/binding_class.py',
|
||||
'src/binding_director.py',
|
||||
'src/binding_enum.py',
|
||||
'src/binding_func.py',
|
||||
'src/binding_generic.py',
|
||||
'src/binding_generic_specializations.py',
|
||||
'src/binding_typemap.py',
|
||||
'src/bindings.py',
|
||||
'src/cparser_header.py',
|
||||
'src/cparser_types.py',
|
||||
'src/generator_sphinx.py',
|
||||
'src/generator_swig.py',
|
||||
'src/lint.py',
|
||||
'src/main.py',
|
||||
'src/writer.py',
|
||||
)
|
||||
|
||||
bindgen_outputs = custom_target(
|
||||
'bindgen_outputs',
|
||||
input: 'src' / 'main.py',
|
||||
output: bindgen_output_names,
|
||||
depend_files: src_files,
|
||||
command: [
|
||||
py, '@INPUT@',
|
||||
'-o', '@OUTDIR@',
|
||||
'--clang-path', clang_path,
|
||||
'--clang-args', clang_args,
|
||||
'--rizin-include-path', rizin_include_path,
|
||||
'--targets', ','.join(targets)
|
||||
] + (doxygen_path != '' ? ['--doxygen-path', doxygen_path] : [])
|
||||
)
|
||||
bindgen_outputs = custom_target(
|
||||
'bindgen_outputs',
|
||||
input: 'src' / 'main.py',
|
||||
output: bindgen_output_names,
|
||||
depend_files: src_files,
|
||||
command: [
|
||||
py, '@INPUT@',
|
||||
'-o', '@OUTDIR@',
|
||||
'--clang-path', clang_path,
|
||||
'--clang-args', clang_args,
|
||||
'--rizin-include-path', rizin_include_path,
|
||||
'--targets', ','.join(targets)
|
||||
] + (doxygen_path != '' ? ['--doxygen-path', doxygen_path] : [])
|
||||
)
|
||||
endif
|
||||
|
||||
if target_swig
|
||||
install_dir = py.get_install_dir()
|
||||
plat_dir = py.get_path('platlib')
|
||||
if plat_dir.startswith('/opt/homebrew') and (install_dir.endswith(plat_dir) or install_dir.endswith(plat_dir / '/'))
|
||||
# Just use directly the platlib, this is a bug in Homebrew python / Meson
|
||||
# See https://github.com/mesonbuild/meson/issues/10459
|
||||
install_dir = plat_dir
|
||||
endif
|
||||
|
||||
wheel = get_option('wheel')
|
||||
swig_output = custom_target(
|
||||
'swig_output',
|
||||
input: bindgen_outputs[swig_source_idx],
|
||||
@@ -121,27 +118,28 @@ if target_swig
|
||||
'-python', '-c++',
|
||||
'-outdir', '@OUTDIR@', '@INPUT@'
|
||||
],
|
||||
install: true,
|
||||
install_dir: [install_dir, false]
|
||||
install: wheel or host_machine.system() == 'windows',
|
||||
install_dir: [py.get_install_dir(), false]
|
||||
)
|
||||
swig_py = swig_output[0]
|
||||
swig_wrap = swig_output[1]
|
||||
|
||||
py.extension_module(
|
||||
if not rz_core.found()
|
||||
rz_core = dependency('rz_core')
|
||||
endif
|
||||
|
||||
ext_mod = py.extension_module(
|
||||
'_rizin',
|
||||
swig_wrap,
|
||||
dependencies: [
|
||||
py.dependency(),
|
||||
dependency('openssl', required: false),
|
||||
dependency('rz_main')
|
||||
rz_core,
|
||||
],
|
||||
include_directories: include_directories(
|
||||
rizin_include_path,
|
||||
rizin_include_path / 'sdb'
|
||||
),
|
||||
install: true,
|
||||
install_dir: install_dir
|
||||
install: wheel or host_machine.system() == 'windows',
|
||||
)
|
||||
if host_machine.system() != 'windows'
|
||||
meson.add_install_script('py_install.py', swig_py.full_path(), ext_mod.full_path())
|
||||
endif
|
||||
endif
|
||||
|
||||
if target_sphinx
|
||||
|
||||
@@ -4,5 +4,6 @@ option('rizin_include_path', type: 'string', value: '')
|
||||
option('targets', type: 'array', choices: ['SWIG', 'sphinx'], value: ['SWIG'])
|
||||
|
||||
option('plugin', type: 'feature', value: 'disabled')
|
||||
option('wheel', type: 'boolean', value: false, description: 'Set up for pypa wheel build')
|
||||
|
||||
option('doxygen_path', type: 'string', value: '')
|
||||
+25
-6
@@ -2,7 +2,15 @@
|
||||
// SPDX-License-Identifier: LGPL-3.0-only
|
||||
|
||||
#include <Python.h>
|
||||
/**
|
||||
* Some defines in rz_userconf.h are conflicting with the ones in python.h
|
||||
**/
|
||||
#undef HAVE_EXPLICIT_BZERO
|
||||
#undef HAVE_SIGACTION
|
||||
#undef HAVE_REALPATH
|
||||
|
||||
#include <rz_core.h>
|
||||
#include <rz_util/rz_file.h>
|
||||
#include <swig_runtime.h>
|
||||
|
||||
static PyObject *rizin_module = NULL;
|
||||
@@ -28,6 +36,11 @@ static PyObject *rizin_module = NULL;
|
||||
} \
|
||||
return result;
|
||||
|
||||
static int rz_bindings_run_file(RzLang *lang, const char *filename) {
|
||||
FILE *file = fopen(filename, "rb");
|
||||
return PyRun_SimpleFile(file, filename) == 0;
|
||||
}
|
||||
|
||||
static int rz_bindings_init(RzLang *lang) {
|
||||
DEFER_SETUP;
|
||||
|
||||
@@ -69,12 +82,23 @@ static int rz_bindings_init(RzLang *lang) {
|
||||
Py_INCREF(py_rz_core);
|
||||
Py_INCREF(rizin_module);
|
||||
|
||||
char *globpath = rz_file_path_join(bindings_dir, "*.py");
|
||||
RzList *files = rz_file_globsearch(globpath, 1);
|
||||
RzListIter *it;
|
||||
char *filename;
|
||||
|
||||
rz_list_foreach(files, it, filename) {
|
||||
rz_bindings_run_file(lang, filename);
|
||||
}
|
||||
free(globpath);
|
||||
rz_list_free(files);
|
||||
|
||||
DEFER_CLEANUP;
|
||||
}
|
||||
|
||||
static int rz_bindings_fini(RzLang *lang) {
|
||||
Py_XDECREF(rizin_module);
|
||||
return Py_FinalizeEx();
|
||||
return Py_FinalizeEx() == 0;
|
||||
}
|
||||
|
||||
static int rz_bindings_prompt(RzLang *lang) {
|
||||
@@ -153,11 +177,6 @@ static int rz_bindings_prompt(RzLang *lang) {
|
||||
DEFER_CLEANUP;
|
||||
}
|
||||
|
||||
static int rz_bindings_run_file(RzLang *lang, const char *filename) {
|
||||
FILE *file = fopen(filename, "rb");
|
||||
return PyRun_SimpleFile(file, filename) == 0;
|
||||
}
|
||||
|
||||
RzLangPlugin rz_lang_plugin_bindings = {
|
||||
.name = "python",
|
||||
.desc = "Python SWIG bindings",
|
||||
|
||||
Executable
+26
@@ -0,0 +1,26 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
SPDX-FileCopyrightText: 2024 kazarmy <[email protected]>
|
||||
SPDX-License-Identifier: LGPL-3.0-only
|
||||
"""
|
||||
|
||||
import os
|
||||
import shutil
|
||||
import sys
|
||||
import sysconfig
|
||||
|
||||
def install_files(scheme):
|
||||
for file in sys.argv[1:]:
|
||||
if file.endswith(".py"):
|
||||
dest_type = 'purelib'
|
||||
elif file.endswith(".so"):
|
||||
dest_type = 'platlib'
|
||||
install_dir = sysconfig.get_path(dest_type, scheme)
|
||||
shutil.copy(file, install_dir)
|
||||
print(f"Installing {os.path.basename(file)} to {install_dir}")
|
||||
|
||||
try:
|
||||
install_files(sysconfig.get_default_scheme())
|
||||
except PermissionError:
|
||||
print("Installing to user site-packages since normal site-packages is not writeable")
|
||||
install_files(f"{os.name}_user")
|
||||
@@ -1,7 +1,9 @@
|
||||
[MESSAGES CONTROL]
|
||||
disable=too-many-instance-attributes,
|
||||
too-few-public-methods,
|
||||
too-few-public-methods,
|
||||
too-many-branches,
|
||||
too-many-return-statements,
|
||||
too-many-locals,
|
||||
fixme
|
||||
too-many-arguments,
|
||||
broad-exception-raised,
|
||||
fixme
|
||||
+18
-7
@@ -1,23 +1,34 @@
|
||||
[build-system]
|
||||
requires = [
|
||||
"meson==0.62.2",
|
||||
"meson-python==0.7.0"
|
||||
"meson>=0.62.2",
|
||||
"meson-python>=0.7.0"
|
||||
]
|
||||
build-backend = "mesonpy"
|
||||
|
||||
[tool.meson-python.args]
|
||||
setup = ['-Dwheel=true']
|
||||
|
||||
[tool.cibuildwheel]
|
||||
build-verbosity = 3
|
||||
before-all = "bash {project}/cibw_before_all.sh"
|
||||
manylinux-x86_64-image = "manylinux_2_24"
|
||||
manylinux-i686-image = "manylinux_2_24"
|
||||
manylinux-x86_64-image = "manylinux2014"
|
||||
skip = "pp*"
|
||||
|
||||
[tool.cibuildwheel.linux]
|
||||
environment = { PATH="/opt/rh/llvm-toolset-7.0/root/usr/bin:/opt/rh/llvm-toolset-7.0/root/usr/sbin:$PATH", LD_LIBRARY_PATH="/opt/rh/llvm-toolset-7.0/root/usr/lib64:$LD_LIBRARY_PATH" }
|
||||
archs = ["x86_64"]
|
||||
|
||||
[tool.cibuildwheel.windows]
|
||||
environment = { CMAKE_PREFIX_PATH="C:\\rizin" }
|
||||
environment = { CMAKE_PREFIX_PATH="C:/rizin" }
|
||||
archs = ["AMD64"]
|
||||
|
||||
[tool.cibuildwheel.macos]
|
||||
environment = { PATH="/opt/homebrew/bin:$PATH", MACOSX_DEPLOYMENT_TARGET="14.0" }
|
||||
|
||||
[project]
|
||||
name = "rz-bindings"
|
||||
version = "0.5.0"
|
||||
requires-python = ">=3.8"
|
||||
dynamic = [
|
||||
'version',
|
||||
]
|
||||
requires-python = ">=3.9"
|
||||
readme = "README.md"
|
||||
@@ -54,8 +54,7 @@ class Class:
|
||||
typedef: str,
|
||||
ignore_fields: Optional[Set[str]] = ...,
|
||||
rename_fields: Optional[Dict[str, str]] = ...,
|
||||
):
|
||||
...
|
||||
): ...
|
||||
|
||||
@overload
|
||||
def __init__(
|
||||
@@ -66,8 +65,7 @@ class Class:
|
||||
struct: str,
|
||||
ignore_fields: Optional[Set[str]] = ...,
|
||||
rename_fields: Optional[Dict[str, str]] = ...,
|
||||
):
|
||||
...
|
||||
): ...
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
|
||||
+2
-4
@@ -46,12 +46,10 @@ class MacroEnum:
|
||||
defines: OrderedDict[str, str]
|
||||
|
||||
@overload
|
||||
def __init__(self, header: Header, *defines: str):
|
||||
...
|
||||
def __init__(self, header: Header, *defines: str): ...
|
||||
|
||||
@overload
|
||||
def __init__(self, header: Header, *, prefix: str):
|
||||
...
|
||||
def __init__(self, header: Header, *, prefix: str): ...
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
|
||||
+2
-4
@@ -28,8 +28,7 @@ class Func:
|
||||
*,
|
||||
default_args: Optional[Dict[str, str]] = ...,
|
||||
typemaps: Optional[List[Typemap]] = ...,
|
||||
):
|
||||
...
|
||||
): ...
|
||||
|
||||
@overload
|
||||
def __init__(
|
||||
@@ -39,8 +38,7 @@ class Func:
|
||||
cfunc: "CFunc",
|
||||
default_args: Optional[Dict[str, str]] = ...,
|
||||
typemaps: Optional[List[Typemap]] = ...,
|
||||
):
|
||||
...
|
||||
): ...
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
SPDX-FileCopyrightText: 2022 wingdeans <[email protected]>
|
||||
SPDX-License-Identifier: LGPL-3.0-only
|
||||
"""
|
||||
|
||||
from typing import List, Dict, TYPE_CHECKING
|
||||
|
||||
from clang.cindex import Cursor, CursorKind
|
||||
|
||||
@@ -55,17 +55,3 @@ class Typemap:
|
||||
f"Function {func.cfunc.cursor.spelling} did not match typemap `{self.args}`. "
|
||||
f"Contents were: {args}"
|
||||
)
|
||||
|
||||
|
||||
buffer_len_typemap = Typemap(
|
||||
"buffer_len",
|
||||
[TypemapArg("unsigned char *", "buf"), TypemapArg("unsigned long long", "len")],
|
||||
)
|
||||
|
||||
const_buffer_len_typemap = Typemap(
|
||||
"const_buffer_len",
|
||||
[
|
||||
TypemapArg("const unsigned char *", "buf"),
|
||||
TypemapArg("unsigned long long", "len"),
|
||||
],
|
||||
)
|
||||
+61
-38
@@ -12,7 +12,6 @@ from binding_class import Class
|
||||
from binding_director import Director
|
||||
from binding_enum import Enum, MacroEnum
|
||||
from binding_generic import Generic
|
||||
from binding_typemap import buffer_len_typemap, const_buffer_len_typemap
|
||||
|
||||
HeaderFunc = Callable[[Header], None]
|
||||
threaded_headers: OrderedDict[str, HeaderFunc] = OrderedDict()
|
||||
@@ -148,13 +147,11 @@ def bind_analysis(analysis_h: Header) -> None:
|
||||
"""
|
||||
RzAnalysis
|
||||
"""
|
||||
analysis_h.ignore("rz_analysis_version")
|
||||
|
||||
rz_analysis = Class(
|
||||
analysis_h,
|
||||
typedef="RzAnalysis",
|
||||
ignore_fields={"leaddrs"},
|
||||
rename_fields={"type_links": "_type_links"},
|
||||
rename_fields={},
|
||||
)
|
||||
|
||||
rz_analysis_function = Class(analysis_h, typedef="RzAnalysisFunction")
|
||||
@@ -167,8 +164,16 @@ def bind_analysis(analysis_h: Header) -> None:
|
||||
|
||||
Class(analysis_h, typedef="RzAnalysisBlock")
|
||||
Class(analysis_h, typedef="RzAnalysisEsil")
|
||||
Class(analysis_h, typedef="RzAnalysisEsilInterState")
|
||||
Class(analysis_h, typedef="RzAnalysisPlugin")
|
||||
|
||||
Class(
|
||||
analysis_h,
|
||||
typedef="RzAnalysisXRef",
|
||||
rename_fields={"from": "from_addr", "to": "to_addr"},
|
||||
)
|
||||
Enum(analysis_h, typedef="RzAnalysisXRefType")
|
||||
|
||||
|
||||
@threaded_header("rz_asm.h")
|
||||
def bind_asm(asm_h: Header) -> None:
|
||||
@@ -214,27 +219,7 @@ def bind_buf(buf_h: Header) -> None:
|
||||
RzBuf
|
||||
"""
|
||||
rz_buf = Class(buf_h, typedef="RzBuffer")
|
||||
|
||||
# const ut8 *buffer, ut64 len
|
||||
for name in [
|
||||
"append_bytes",
|
||||
"prepend_bytes",
|
||||
"set_bytes",
|
||||
"insert_bytes",
|
||||
"write",
|
||||
"write_at",
|
||||
]:
|
||||
rz_buf.add_method(
|
||||
f"rz_buf_{name}",
|
||||
rename=name,
|
||||
typemaps=[const_buffer_len_typemap],
|
||||
)
|
||||
|
||||
# ut8 *buffer, ut64 len
|
||||
rz_buf.add_method("rz_buf_read", rename="read", typemaps=[buffer_len_typemap])
|
||||
rz_buf.add_method("rz_buf_read_at", rename="read_at", typemaps=[buffer_len_typemap])
|
||||
|
||||
rz_buf.add_method("rz_buf_seek", rename="seek")
|
||||
rz_buf.add_prefixed_methods("rz_buf_")
|
||||
|
||||
MacroEnum(buf_h, "RZ_BUF_SET", "RZ_BUF_CUR", "RZ_BUF_END")
|
||||
|
||||
@@ -273,7 +258,6 @@ def bind_cons(cons_h: Header) -> None:
|
||||
typedef="RzCons",
|
||||
ignore_fields={"term_raw", "term_buf"}, # struct termios
|
||||
rename_fields={
|
||||
"lastline": "_lastline",
|
||||
"echo": "_echo",
|
||||
"highlight": "_highlight",
|
||||
"newline": "_newline",
|
||||
@@ -343,6 +327,29 @@ def bind_core(core_h: Header) -> None:
|
||||
|
||||
Class(core_h, typedef="RzCoreFile")
|
||||
|
||||
@threaded_header("rz_util/rz_annotated_code.h")
|
||||
def bind_annotated_code(annotated_code_h: Header) -> None:
|
||||
"""
|
||||
RzAnnotatedCode
|
||||
"""
|
||||
rz_code_annotation = Class(
|
||||
annotated_code_h,
|
||||
typedef="RzCodeAnnotation",
|
||||
struct="rz_code_annotation_t",
|
||||
)
|
||||
rz_code_annotation.add_prefixed_methods("rz_annotation_")
|
||||
rz_code_annotation.add_prefixed_funcs("rz_annotation_")
|
||||
|
||||
rz_annotated_code = Class(
|
||||
annotated_code_h,
|
||||
typedef="RzAnnotatedCode",
|
||||
struct="rz_annotated_code_t",
|
||||
)
|
||||
rz_annotated_code.add_constructor("rz_annotated_code_new")
|
||||
rz_annotated_code.add_destructor("rz_annotated_code_free")
|
||||
|
||||
rz_annotated_code.add_prefixed_methods("rz_annotated_code_")
|
||||
rz_annotated_code.add_prefixed_funcs("rz_annotated_code_")
|
||||
|
||||
@threaded_header("rz_flag.h")
|
||||
def bind_flag(flag_h: Header) -> None:
|
||||
@@ -431,15 +438,7 @@ def bind_sdb(sdb_h: Header) -> None:
|
||||
Class(sdb_h, typedef="Sdb", ignore_fields={"db", "m"})
|
||||
|
||||
|
||||
@threaded_header("sdb/ls.h")
|
||||
def bind_ls(ls_h: Header) -> None:
|
||||
"""
|
||||
ls
|
||||
"""
|
||||
Class(ls_h, typedef="SdbList")
|
||||
|
||||
|
||||
@threaded_header("sdb/ht_pp.h")
|
||||
@threaded_header("rz_util/ht_pp.h")
|
||||
def bind_ht_pp(ht_pp_h: Header) -> None:
|
||||
"""
|
||||
ht_pp
|
||||
@@ -447,7 +446,7 @@ def bind_ht_pp(ht_pp_h: Header) -> None:
|
||||
Class(ht_pp_h, typedef="HtPP")
|
||||
|
||||
|
||||
@threaded_header("sdb/ht_pu.h")
|
||||
@threaded_header("rz_util/ht_pu.h")
|
||||
def bind_ht_pu(ht_pu_h: Header) -> None:
|
||||
"""
|
||||
ht_pu
|
||||
@@ -455,7 +454,7 @@ def bind_ht_pu(ht_pu_h: Header) -> None:
|
||||
Class(ht_pu_h, typedef="HtPU")
|
||||
|
||||
|
||||
@threaded_header("sdb/ht_up.h")
|
||||
@threaded_header("rz_util/ht_up.h")
|
||||
def bind_ht_up(ht_up_h: Header) -> None:
|
||||
"""
|
||||
ht_up
|
||||
@@ -463,9 +462,33 @@ def bind_ht_up(ht_up_h: Header) -> None:
|
||||
Class(ht_up_h, typedef="HtUP")
|
||||
|
||||
|
||||
@threaded_header("sdb/ht_uu.h")
|
||||
@threaded_header("rz_util/ht_uu.h")
|
||||
def bind_ht_uu(ht_uu_h: Header) -> None:
|
||||
"""
|
||||
ht_uu
|
||||
"""
|
||||
Class(ht_uu_h, typedef="HtUU")
|
||||
|
||||
|
||||
@threaded_header("rz_util/ht_sp.h")
|
||||
def bind_ht_sp(ht_sp_h: Header) -> None:
|
||||
"""
|
||||
ht_sp
|
||||
"""
|
||||
Class(ht_sp_h, typedef="HtSP")
|
||||
|
||||
|
||||
@threaded_header("rz_util/ht_ss.h")
|
||||
def bind_ht_ss(ht_ss_h: Header) -> None:
|
||||
"""
|
||||
ht_ss
|
||||
"""
|
||||
Class(ht_ss_h, typedef="HtSS")
|
||||
|
||||
|
||||
@threaded_header("rz_util/ht_su.h")
|
||||
def bind_ht_su(ht_su_h: Header) -> None:
|
||||
"""
|
||||
ht_su
|
||||
"""
|
||||
Class(ht_su_h, typedef="HtSU")
|
||||
+2
-2
@@ -2224,7 +2224,7 @@ class Type(Structure):
|
||||
|
||||
return result
|
||||
|
||||
assert self.kind == TypeKind.FUNCTIONPROTO
|
||||
assert self.kind in (TypeKind.FUNCTIONPROTO, TypeKind.FUNCTIONNOPROTO)
|
||||
return ArgumentsIterator(self)
|
||||
|
||||
@property
|
||||
@@ -2320,7 +2320,7 @@ class Type(Structure):
|
||||
|
||||
def is_function_variadic(self):
|
||||
"""Determine whether this function Type is a variadic function type."""
|
||||
assert self.kind == TypeKind.FUNCTIONPROTO
|
||||
assert self.kind in (TypeKind.FUNCTIONPROTO, TypeKind.FUNCTIONNOPROTO)
|
||||
|
||||
return conf.lib.clang_isFunctionTypeVariadic(self)
|
||||
|
||||
|
||||
@@ -38,6 +38,7 @@ class TypeKind(Enum):
|
||||
POINTER: TypeKind
|
||||
CONSTANTARRAY: TypeKind
|
||||
FUNCTIONPROTO: TypeKind
|
||||
FUNCTIONNOPROTO: TypeKind
|
||||
INCOMPLETEARRAY: TypeKind
|
||||
|
||||
RECORD: TypeKind
|
||||
@@ -86,6 +87,7 @@ class Type:
|
||||
class SourceLocation:
|
||||
class File:
|
||||
name: str
|
||||
|
||||
file: File
|
||||
line: int
|
||||
column: int
|
||||
|
||||
+14
-9
@@ -12,6 +12,7 @@ from clang.cindex import TranslationUnit, Cursor, CursorKind
|
||||
|
||||
from cparser_types import CType, wrap_type
|
||||
|
||||
|
||||
### Cursor wrappers ###
|
||||
class AttrCursor:
|
||||
"""
|
||||
@@ -97,18 +98,20 @@ class HeaderBuilder:
|
||||
|
||||
assert rizin_include_path
|
||||
filename = os.path.abspath(os.path.join(rizin_include_path, *name_segments))
|
||||
|
||||
# Fix sdb path if using source librz/include
|
||||
if name_segments[0] == "sdb" and not os.path.exists(filename):
|
||||
name_segments = ["..", "util", "sdb", "src"] + name_segments[1:]
|
||||
filename = os.path.abspath(os.path.join(rizin_include_path, *name_segments))
|
||||
|
||||
assert os.path.exists(filename)
|
||||
assert os.path.exists(filename), f"File {filename} does not exist"
|
||||
self.filename = filename
|
||||
|
||||
# Parse ht_inc.h if importing SDB hashtable header
|
||||
self.extra_filename = None
|
||||
if name_segments[-1] in ["ht_pp.h", "ht_pu.h", "ht_up.h", "ht_uu.h"]:
|
||||
if name_segments[-1] in [
|
||||
"ht_pp.h",
|
||||
"ht_pu.h",
|
||||
"ht_up.h",
|
||||
"ht_uu.h",
|
||||
"ht_sp.h",
|
||||
"ht_ss.h",
|
||||
"ht_su.h",
|
||||
]:
|
||||
self.extra_filename = "ht_inc.h"
|
||||
|
||||
def translation_unit(self) -> TranslationUnit:
|
||||
@@ -178,7 +181,9 @@ class Header:
|
||||
continue
|
||||
|
||||
# Check for redefinitions
|
||||
if name in self.cursor_kinds: # Redefinition
|
||||
if (
|
||||
name in self.cursor_kinds and cursor.kind == self.cursor_kinds[name]
|
||||
): # Redefinition
|
||||
prev = self.cursors[cursor.kind][name]
|
||||
if cursor.kind == CursorKind.STRUCT_DECL:
|
||||
assert prev.kind == CursorKind.STRUCT_DECL
|
||||
|
||||
@@ -100,29 +100,32 @@ def wrap_type(type_: Type) -> CType:
|
||||
"""
|
||||
Wrap a type
|
||||
"""
|
||||
orig_type = type_
|
||||
while type_.kind == TypeKind.ELABORATED:
|
||||
type_ = type_.get_named_type()
|
||||
|
||||
# Complex types
|
||||
if type_.kind == TypeKind.POINTER:
|
||||
return CPointerType(type_, pointee=wrap_type(type_.get_pointee()))
|
||||
return CPointerType(orig_type, pointee=wrap_type(type_.get_pointee()))
|
||||
|
||||
if type_.kind in [TypeKind.CONSTANTARRAY, TypeKind.INCOMPLETEARRAY]:
|
||||
array_t = CArrayType(type_, element=wrap_type(type_.get_array_element_type()))
|
||||
array_t = CArrayType(
|
||||
orig_type, element=wrap_type(type_.get_array_element_type())
|
||||
)
|
||||
if type_.kind == TypeKind.CONSTANTARRAY:
|
||||
array_t.element_count = type_.element_count
|
||||
return array_t
|
||||
|
||||
if type_.kind == TypeKind.TYPEDEF:
|
||||
return CTypedefType(
|
||||
type_,
|
||||
orig_type,
|
||||
canonical=wrap_type(type_.get_canonical()),
|
||||
cursor=type_.get_declaration(),
|
||||
)
|
||||
|
||||
if type_.kind == TypeKind.FUNCTIONPROTO:
|
||||
if type_.kind in (TypeKind.FUNCTIONPROTO, TypeKind.FUNCTIONNOPROTO):
|
||||
return CFunctionType(
|
||||
type_,
|
||||
orig_type,
|
||||
result=wrap_type(type_.get_result()),
|
||||
args=[wrap_type(arg) for arg in type_.argument_types()],
|
||||
)
|
||||
@@ -132,7 +135,7 @@ def wrap_type(type_: Type) -> CType:
|
||||
if decl_spelling.startswith("const "):
|
||||
decl_spelling = decl_spelling[len("const ") :]
|
||||
|
||||
return CRecordType(type_, decl_spelling=decl_spelling)
|
||||
return CRecordType(orig_type, decl_spelling=decl_spelling)
|
||||
|
||||
# Primitive types
|
||||
if type_.kind in [
|
||||
|
||||
@@ -265,6 +265,11 @@ def write_func(writer: Writer, func: Func, name: str, kind: FuncKind) -> None:
|
||||
if arg_name == "self":
|
||||
arg_name = "_self"
|
||||
|
||||
# if function arg is the same as the function name
|
||||
# we rename the argument
|
||||
if arg_name == name:
|
||||
arg_name += "_arg"
|
||||
|
||||
arg_decl = stringify_decl(
|
||||
arg_name,
|
||||
arg.ctype,
|
||||
|
||||
+12
-1
@@ -23,6 +23,7 @@ and definitions. It also does this for Rizin annotations, such as RZ_OWN. This w
|
||||
by defining the RZ_BINDINGS preprocessor flag, which sets the annotations to expand to
|
||||
__attribute__((annotate)), which can be picked up by libclang.
|
||||
"""
|
||||
|
||||
from typing import List, Dict, Set, TypedDict, Optional, cast
|
||||
|
||||
import os
|
||||
@@ -163,7 +164,17 @@ def cursor_get_comment(cursor: Cursor, *, packed: bool = False) -> Optional[str]
|
||||
warn(
|
||||
f"Type comment at {stringify_location(cursor.location)} should not have pointer"
|
||||
)
|
||||
elif typeref_spelling in {"HtPP", "HtUP", "HtUU", "RBTree", "SdbList"}:
|
||||
elif typeref_spelling in {
|
||||
"HtPP",
|
||||
"HtUP",
|
||||
"HtUU",
|
||||
"HtPU",
|
||||
"HtSP",
|
||||
"HtSS",
|
||||
"HtSU",
|
||||
"RBTree",
|
||||
"SdbList",
|
||||
}:
|
||||
pass
|
||||
else:
|
||||
warn(
|
||||
|
||||
@@ -21,22 +21,10 @@ void rizin_try_warn_deprecate(const char *name, const char *c_name) {
|
||||
|
||||
// Buffer typemaps
|
||||
%include <pybuffer.i>
|
||||
|
||||
%define %buffer_len_activate(TYPE, SIZE)
|
||||
%pybuffer_mutable_binary(TYPE, SIZE);
|
||||
%enddef
|
||||
|
||||
%define %const_buffer_len_activate(TYPE, SIZE)
|
||||
%pybuffer_binary(TYPE, SIZE);
|
||||
%enddef
|
||||
|
||||
%define %buffer_len_deactivate(TYPE, SIZE)
|
||||
%typemap(in) (TYPE, SIZE);
|
||||
%enddef
|
||||
|
||||
%define %const_buffer_len_deactivate(TYPE, SIZE)
|
||||
%typemap(in) (TYPE, SIZE);
|
||||
%enddef
|
||||
%pybuffer_mutable_binary(unsigned char *buf, unsigned long long len);
|
||||
%pybuffer_binary(const unsigned char *buf, unsigned long long len);
|
||||
%pybuffer_mutable_binary(unsigned char *buf, int len);
|
||||
%pybuffer_binary(const unsigned char *buf, int len);
|
||||
|
||||
// CArrays
|
||||
%include <carrays.i>
|
||||
|
||||
@@ -13,7 +13,7 @@ void register_swig_command(const char *str, CmdDirector *director,
|
||||
} else {
|
||||
char *dup = strdup(str);
|
||||
dup[len - 1] = '\0';
|
||||
parent = (RzCmdDesc *)ht_pp_find($self->ht_cmds, dup, NULL);
|
||||
parent = (RzCmdDesc *)ht_sp_find($self->ht_cmds, dup, NULL);
|
||||
free(dup);
|
||||
}
|
||||
|
||||
@@ -21,7 +21,7 @@ void register_swig_command(const char *str, CmdDirector *director,
|
||||
throw "Could not get parent RzCmdDesc";
|
||||
}
|
||||
|
||||
RzCmdDesc *prev = (RzCmdDesc *)ht_pp_find($self->ht_cmds, str, NULL);
|
||||
RzCmdDesc *prev = (RzCmdDesc *)ht_sp_find($self->ht_cmds, str, NULL);
|
||||
std::string cmd(str);
|
||||
if (prev) { // Update existing RzCmdDesc
|
||||
auto it = SWIGCmds.find(cmd);
|
||||
|
||||
Reference in new issue
Block a user