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: Eli Zaretskii
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:15:36 +0200

> 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]