On Fri, Feb 15, 2013 at 12:58 AM, Roderich Schupp
<roderich.sch...@gmail.com> wrote:
> Err, no. The accessor functions don't go through the typemap, only
> the wrappers for "real" functions do that (add a printf() or warn() at the
> start of  svn_swig_pl_set_revision() to see when it's called).

I guess this depends on the SWIG version.  I went to copy the code of
_wrap_svn_opt_revision_t_kind_get() out of
subversion/bindings/swig/perl/native/core.c to show you this and
couldn't find the call.  I was doing it off my laptop and was very
surprised.  My laptop has SWIG 2.0.8 installed.  So I looked on my
Ubuntu 12.04 VM that I did this work on and found that it had SWIG
2.0.4 (provided via the Ubuntu package) and indeed the
_wrap_svn_opt_revision_t_kind_get() looks looks like this:

[[[
XS(_wrap_svn_opt_revision_t_kind_get) {
  {
    svn_opt_revision_t *arg1 = (svn_opt_revision_t *) 0 ;
    svn_opt_revision_t rev1 ;
    int argvi = 0;
    enum svn_opt_revision_kind result;
    dXSARGS;

    if ((items < 1) || (items > 1)) {
      SWIG_croak("Usage: svn_opt_revision_t_kind_get(self);");
    }
    {
      arg1 = &rev1;
      svn_swig_pl_set_revision(&rev1, ST(0));
    }
    result = (enum svn_opt_revision_kind) ((arg1)->kind);
    ST(argvi) = SWIG_From_int  SWIG_PERL_CALL_ARGS_1((int)(result)); argvi++ ;

    XSRETURN(argvi);
  fail:

    SWIG_croak_null();
  }
}
]]]

This probably explains why you couldn't reproduce the problem I found.

I flipped through the changelog for SWIG and I didn't see anything
that explains this difference in behavior.

> So the ultimate test that the typemap does the right thing for a
> _p_svn_opt_revision_t object is to pass one into a wrapped function
> with a svn_opt_revision_t* parameter (on the C level). Unfortunately
> any such function needs at least a repository to test.
>
> The attached patch adds a test passing an _p_svn_opt_revision_t
> into SVN::Client::log2 (ie. the wrapper for svn_client_log2).

I wouldn't bother to do the testing like this.  You can create an
_p_svn_opt_revision_t without needing to get it from something like
svn_wc_parse_externals_description3().  e.g.

my $rev = SVN::_Core::new_svn_opt_revision_t();
$rev->kind($SVN::Core::opt_revision_number);
$rev->value->number(1445267);

In which case we can put the test code in the 3client.t tests, which
already has a repo.

Note that's calling the wrapper function to create a new
_p_svn_opt_revision_t directly.  We could and probably should produce
a nice clean Perlish wrapper that uses this.

> Note that I slightly modified the svn:externals string in the existing test
> case
> in order to obtain _p_svn_opt_revision_t objects of kinds "head" and
> "number".

This is probably a good change to have more complete coverage of
testing that externals code.  I'll make this change irrespective of
the other changes.

Reply via email to