gpt4 book ai didi

python - Swig 类型映射中的临时变量生成

转载 作者:太空宇宙 更新时间:2023-11-03 23:49:23 24 4
gpt4 key购买 nike

我发现 Swig 未能生成一些在 typemap 中定义的临时变量。

问题来了:我定义了一个类型映射如下。

%define %bound_buffer_input(TYPEMAP, SIZE)
%typemap(in) (TYPEMAP, SIZE)
(int res, Py_ssize_t size = 0, const void *buf = 0) {
res = PyObject_AsReadBuffer($input, &buf, &size);
if (res<0) {
PyErr_Clear();
%argument_fail(res, "(TYPEMAP, SIZE)", $symname, $argnum);
}
$1 = ($1_ltype) buf;
$2 = ($2_ltype) size;
}
%enddef

并应用于2种情况:

%bound_buffer_input(const uint8_t* key, size_t keyLength);
%bound_buffer_input(void* buf, size_t length);

首先,它运行良好并生成了正确的代码。但对于第二个,它无法为函数生成正确的变量名:void* MF_WriteOne (void * qry, int datatype, void* buf, size_t length);

代码 swig 生成:

 {
res3 = PyObject_AsReadBuffer(obj2, &buf3, &size3);
if (res3<0) {
PyErr_Clear();
SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "MF_WriteOne" "', argument " "3"" of type '" "(void* buf, size_t length)""'");
}
arg3 = (void *) buf;
arg4 = (size_t) size3;
}

在第一行中,变量“buf”正确地生成了名称“buf3”,但是对于第 6 行,变量的名称不正确,而不是“buf3”。

后来我将名称从“buf 更改为 buff”,发现变量都在正确的名称下。

为什么会发生这么奇怪的事情?

最佳答案

问题是您的类型映射有名称冲突。传递给函数的变量的名称是 buf 并且变量的名称(预自动重命名)也是 buf

SWIG 试图变得聪明并使用上下文正确的行为,但这不是您希望的行为。您可以通过以下几种方式之一解决此问题:

  1. 按照您的记录重命名两个 buf 中的一个或两个
  2. 更改给宏的名称,但使用 %apply 仍然匹配 buf 作为参数名称:

    %module test

    %define %bound_buffer_input(TYPEMAP, SIZE)
    %typemap(in) (TYPEMAP, SIZE)
    (int res, Py_ssize_t size = 0, const void *buf = 0) {
    res = PyObject_AsReadBuffer($input, &buf, &size);
    if (res<0) {
    PyErr_Clear();
    %argument_fail(res, "(TYPEMAP, SIZE)", $symname, $argnum);
    }
    $1 = ($1_ltype) buf;
    $2 = ($2_ltype) size;
    }
    %enddef

    %bound_buffer_input(const uint8_t* key, size_t keyLength);
    %bound_buffer_input(void* buffer, size_t length);

    %apply (void* buffer, size_t length) { (void* buf, size_t length) };

    %inline %{
    void test1(const uint8_t* key, size_t keyLength) {}
    void test2(void* buf, size_t length) {}
    %}
  3. 在类型映射中使用 noblock=1 并且没有临时变量,手动对本地变量进行自动重命名:

    %module test

    %define %bound_buffer_input(TYPEMAP, SIZE)
    %typemap(in,noblock=1) (TYPEMAP, SIZE) {
    int res$argnum;
    Py_ssize_t size$argnum = 0;
    const void *buf$argnum = 0;
    res$argnum = PyObject_AsReadBuffer($input, &buf$argnum, &size$argnum);
    if (res$argnum<0) {
    PyErr_Clear();
    %argument_fail(res$argnum, "(TYPEMAP, SIZE)", $symname, $argnum);
    }
    $1 = ($1_ltype) buf$argnum;
    $2 = ($2_ltype) size$argnum;
    }
    %enddef

    %bound_buffer_input(const uint8_t* key, size_t keyLength);
    %bound_buffer_input(void* buf, size_t length);

    %inline %{
    void test1(const uint8_t* key, size_t keyLength) {}
    void test2(void* buf, size_t length) {}
    %}

最后,除非您的目标是 Python 2.6 及更早版本,否则您应该 use Python's newer memory views相反

关于python - Swig 类型映射中的临时变量生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24613924/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com