A_GIMMEBACK routine appears in quickref menu

Oct 30, 2010 at 12:18pm

A_GIMMEBACK routine appears in quickref menu

Hi,

I’ve implemented a method that should only ever be called by other objects behind the scenes that has a return value. The method is declared as taking A_GIMMEBACK. Everything works, but the method turns up in the quickref, which I’d rather it didn’t. Have I done this the right way, or is there a better one, or should I just live with it?

Thanks

Alex

#52882
Oct 30, 2010 at 1:01pm

You can make a method disappear from the quickref menu using the undocumented keyword.

CLASS_METHOD_ATTR_PARSE(c, "mymethod", "undocumented", gensym("long"), 0L, "1");

#190228
Oct 30, 2010 at 1:41pm

Thanks ej. ILooks like this is viable only for the Max 5 SDK – is that right? No big deal either way, just still interested in Max 4.6 support as far as possible….

#190229
Oct 30, 2010 at 5:01pm

You could just use A_CANT, and call using object_method() instead of object_method_typed(). You’ll need to double the symbol arg in such a case, since object_method() pops the symbol and passes on any following arguments blindly.

Hope this helps.

Joshua

#190230
Oct 31, 2010 at 10:09am

Thanks Joshua. That looks straightforward enough. It’s a minor issue – just trying to make some stuff look neat and tidy for release!

A.

#190231
Nov 7, 2010 at 10:57am

Hi Joshua. I’ve implemented as a CANT and that works fine.

I’m not sure what you mean about doubling the symbol argument. My function has no arguments and here is what I’m doing. Is this safe / correct ?

// Declaring the method

class_addmethod (this_class, (method)ibuffer_valid, “valid”, A_CANT, 0);

// The function

void *ibuffer_valid (t_ibuffer *x, t_symbol *s)
{
return (void *) &x->valid;
}

// How I’m calling it from another object

valid_val = (long *) object_method(current_buffer, ps_valid);

Thanks for your help.

Alex

#190232
Nov 7, 2010 at 11:38pm

You don’t need to worry about what I recommended then. Your method is technically not A_GIMMEBACK, and should have always been defined as A_CANT.

A_GIMMEBACK is for typed messages of the form:

t_max_err mymethod(t_object *x, t_symbol *s, long argc, t_atom *argv, t_atom *returnvalue);

This is a required signature for returning values to JS, Java, Lua, etc. via the language bindings.

In the case of calling such methods you would need to call it like this:

object_method_typed(x,gensym(“foo”),argc, argv, &rv);

Or as untyped with:

object_method(x,gensym(“foo”),gensym(“foo”,argc,argv,&rv));

Note the double symbol since object_method does not pass the symbolic message selector on to the method it is calling. It pushes anything following it onto the stack, so places which expect to receive the symbolic message selector such as A_GIMME, or A_GIMMEBACK functions require supplying the symbolic message selector twice. The reason for this can be demonstrated by the following untyped method calling of a function which, if typed, would have the signature A_LONG:

object_method(x,gensym(“bar”),27);

would be used to call the following function with an argument of 27, (no symbol)

mybar(t_object *x, long x);

I know that this might be a little confusing, and I don’t have time to discuss in more detail, but I hope this helps. A related thread is here:

http://www.cycling74.com/forums/topic.php?id=2754

-Joshua

#190233
Nov 8, 2010 at 7:59am

OK – got it – not confusing at all – thanks Joshua. Now I understand what is going on and looks like I can actually define the function:

void *ibuffer_valid (t_ibuffer *x)
{
return (void *) &x->valid;
}

I think I originally tried implementing as a CANT but couldn’t get it to work for some reason I forget so tried A_GIMMEBACK. Now I will know what to do in future in either case. Thanks again for your time.

A.

#190234

You must be logged in to reply to this topic.