Brett W. McCoy <[EMAIL PROTECTED]> writes:
>I am building an embedded Perl scripting environment for a 3D modelling 
>package.  I have the basic scripting engine working (that was the easy 
>part), but now my challenge is to be able to directly interface with C++ 
>objects inside the application.  What I really want to do is to be able 
>to build Perl objects on the fly from live C++ objects.  

Which can be done if you have a clear policy for how a C++ object
becomes a perl object. The snag is that C++ is compile time typed
so each C++ class needs a "method" to convert itself to/from perl objects.

I have some day-job related code (which I have yet to shake loose into 
something I can distribute) which uses g++ -E and then a "parse" 
of result to create perl bindings to all the public methods of 
a class heirachy. (i.e. you use it instead of xsubpp and it produces Class.cpp).

At bottom of this are the utility functions:

void *
SV_to_object(pTHX_ SV *sv, const char *classname)
{
    if (SvOK(sv))
     {
      if (sv_derived_from(sv,classname) && SvIOK(SvRV(sv))) {
        IV tmp = SvIV(SvRV(sv));
        return (void *) INT2PTR(void *,tmp);
      }
      croak("Not a %s (%_)",classname,sv);
     }
    return 0;
}

void
object_to_SV(pTHX_ SV **svp, const char *classname, IV value)
{
 if (value)
  {
   SV *sv = sv_newmortal();
   sv_setref_iv(sv,classname,value);
   *svp = sv;
  }
 else
  {
   *svp = &PL_sv_undef;
  }
}

void
enum_to_SV(pTHX_ SV **svp, const char *classname, IV value, const char *str = 0)
{
 SV *sv = sv_newmortal();
 *svp = sv;
 sv_setref_iv(sv,classname,value);
 if (str)
  {
   sv_upgrade((sv = SvRV(sv)),SVt_PVIV);
   sv_setpv(sv,str);
   SvIOK_on(sv);
  }
}

IV
SV_to_enum(pTHX_ SV *sv, const char *classname)
{
    if (sv_derived_from(sv,classname) && SvIOK(SvRV(sv))) {
        return SvIV(SvRV(sv));
    }
    croak("Not a %s (%_)",classname,sv);
    return 0;
}

The perl script (which I call findclass) then arranges to pass 
right thing to classname args of those. The perl classnames are same 
as the C++ ones.

The fun part is handling
overloaded functions - i.e. figuring out from the number and type
of args passed which C++ method to call and producing "XS code" 
that calls method with correctly converted args to call that method.


>For instance, 
>the user has the application running with an open document with a 
>hierarchy of objects, and each level (application, document, object)  
>has a certain scripting context associated with it (not too different 
>from DOM, I think), so you can run, say, a script that modifies the 
>behavior of a group of objects as they are being animated.
>
>I found, on CPAN, an aborted attempt at creating a C++ interface to the 
>Perl API, and that might be a good starting point, but I wanted to see 
>if anyone else has ventured into this arena.

You can embed perl in C++ using perl's C API. You just have to 
to C-ish housekeeping rather than C++-ish housekeeping.


-- 
Nick Ing-Simmons
http://www.ni-s.u-net.com/

Reply via email to