What's the cleanest way to return a new PMC from an op?

e.g. Suppose I have a Vec2D_in_X_plane and a Vec2D_in_Y_plane and I add them
and want to always produce a Vec3D - is this correct (and is it efficient?):

  void add(PMC* value, PMC* dest) {

    if(value->vtable == &Parrot_base_vtables[enum_class_Vec2D_in_Y_plane]) {

      PMC* ret = pmc_new(INTERP,enum_class_Vec3D);

      /* set the correct x,y,z coords somehow (method? property?) */

      if(dest->flags & PMC_active_destroy_FLAG)
        dest->vtable->destroy(interpreter,dest);
      *dest = *ret;

    } else
      /* handle other cases, crash and burn, whatever */
  }

(Arising from this is: how do I check the type of an extension PMC? which I
presume still isn't supported so I'll accept "you can't, yet, because there
aren't any.")

(Yes, this is a bit of a stealth resurrection of part of the logical_not
thread, separated out into its own question; substitude "logical_not" for
"add", "RubyInteger" for "Vec3D_in_X_plane", and "RubyBoolean" for "Vec3D".)

Dave
Isa. 40:31

Reply via email to