emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: What is the recommended way to find out the number of arguments pass


From: dalanicolai
Subject: Re: What is the recommended way to find out the number of arguments passed to a module function?
Date: Wed, 10 Jan 2024 21:06:48 +0100

(I should reply to all :)

Ah okay, well I am completely new to C, so I am still finding out things (e.g. I have not 'actively' used ptrdiff yet).
But indeed the 'nargs' just give the number of passed args (obviously).

I had checked the 'sizeof' the args array when passing an argument and without passing an argument,
and it was the same. Then the docs mention that NARGS is the 'required' number of arguments,
I had misunderstood it a little (of course the required number is variable, but somehow I assumed it
would be 1 in this case). So sometimes I overlook the 'obvious', and because I had spent some time on testing
things already, I decided to just ask here.

Anyway, as usual, thanks for your quick and helpful answer!

On Wed, 10 Jan 2024 at 20:16, Eli Zaretskii <eliz@gnu.org> wrote:
> From: dalanicolai <dalanicolai@gmail.com>
> Date: Wed, 10 Jan 2024 20:01:09 +0100
>
> In the module API's 'make-function' we should pass a min-arity and a max-arity.
> However, it is unclear to me what is the recommended way to check for the number of
> arguments passed to some module function, as when not passing any argument, the 'optional'
> argument does not seem
> to be nil, or any emacs-value at all (I have tested if it might be a NULL pointer). I have tested it using a
> 'test-module' with the following code:
>
>  #include <emacs-module.h>
>  int plugin_is_GPL_compatible;
>  static emacs_value
>  test (emacs_env *env, ptrdiff_t nargs, emacs_value *args, void *data)
>  {
>    int integer = env->is_not_nil(env, args[0])? 1 : 0;
>    return env->make_integer(env, integer);
>    /* return args[0]; */
>  }
>  int
>  emacs_module_init (struct emacs_runtime *runtime)
>  {
>    emacs_env *env = runtime->get_environment (runtime);
>    emacs_value func = env->make_function (env, 0, 1, test, NULL, NULL);
>    emacs_value symbol = env->intern (env, "test");
>    emacs_value args[] = {symbol, func};
>    env->funcall (env, env->intern (env, "defalias"), 2, args);
>    return 0;
>  }
>
> The 'test' function checks if the value of the argument is non-nil, and 'returns' a 1 if it is and a 0
> otherwise. It works fine when passing an argument, e.g. t or nil, but Emacs crashes when I don't pass
> an argument. Also, I tried to simply return the value (by replacing the return line with the line in the
> comment below it), which returns the value successfully when I pass an argument, but again Emacs
> crashes when I don't pass any argument.

I guess I'm confused: if you call your function with zero arguments,
then why do you expect to find anything useful in the args[] array, or
even assume that the args[] array can be accessed?

Don't you get nargs = 0 in 'test' in this case?

reply via email to

[Prev in Thread] Current Thread [Next in Thread]