Skip to content

Commit

Permalink
feat: add Node-API macros for binary functions
Browse files Browse the repository at this point in the history
PR-URL: stdlib-js#1687

---------

Signed-off-by: Pranav <85227306+Pranavchiku@users.noreply.github.com>
Signed-off-by: Athan Reines <kgryte@gmail.com>
Co-authored-by: Pranav <85227306+Pranavchiku@users.noreply.github.com>
Co-authored-by: Athan Reines <kgryte@gmail.com>
Reviewed-by: Pranav <85227306+Pranavchiku@users.noreply.github.com>
Reviewed-by: Athan Reines <kgryte@gmail.com>
Reviewed-by: Philipp Burckhardt <pburckhardt@outlook.com>
  • Loading branch information
3 people authored and Utkarsh Gupta committed Mar 7, 2024
1 parent 7ec1ab8 commit 074ae60
Show file tree
Hide file tree
Showing 3 changed files with 336 additions and 0 deletions.
122 changes: 122 additions & 0 deletions lib/node_modules/@stdlib/math/base/napi/binary/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -331,6 +331,86 @@ The function accepts the following arguments:
void stdlib_math_base_napi_di_d( napi_env env, napi_callback_info info, double (*fcn)( double, int32_t ) );
```

#### stdlib_math_base_napi_ii_i( env, info, fcn )

Invokes a binary function accepting and returning signed 32-bit integers.

```c
#include <node_api.h>
#include <stdint.h>

// ...

static int32_t mul( const int32_t x, const int32_t y ) {
return x * y;
}

// ...

/**
* Receives JavaScript callback invocation data.
*
* @param env environment under which the function is invoked
* @param info callback data
* @return Node-API value
*/
napi_value addon( napi_env env, napi_callback_info info ) {
return stdlib_math_base_napi_ii_i( env, info, mul );
}

// ...
```
The function accepts the following arguments:
- **env**: `[in] napi_env` environment under which the function is invoked.
- **info**: `[in] napi_callback_info` callback data.
- **fcn**: `[in] int32_t (*fcn)( int32_t, int32_t )` binary function.
```c
void stdlib_math_base_napi_ii_i( napi_env env, napi_callback_info info, int32_t (*fcn)( int32_t, int32_t ) );
```

#### stdlib_math_base_napi_ii_d( env, info, fcn )

Invokes a binary function accepting signed 32-bit integers and returning a double-precision floating-point number.

```c
#include <node_api.h>
#include <stdint.h>

// ...

static double mul( const int32_t x, const int32_t y ) {
return x * y;
}

// ...

/**
* Receives JavaScript callback invocation data.
*
* @param env environment under which the function is invoked
* @param info callback data
* @return Node-API value
*/
napi_value addon( napi_env env, napi_callback_info info ) {
return stdlib_math_base_napi_ii_d( env, info, mul );
}

// ...
```
The function accepts the following arguments:
- **env**: `[in] napi_env` environment under which the function is invoked.
- **info**: `[in] napi_callback_info` callback data.
- **fcn**: `[in] double (*fcn)( int32_t, int32_t )` binary function.
```c
void stdlib_math_base_napi_ii_d( napi_env env, napi_callback_info info, double (*fcn)( int32_t, int32_t ) );
```

#### stdlib_math_base_napi_fi_f( env, info, fcn )

Invokes a binary function accepting a single-precision floating-point number and a signed 32-bit integer and returning a single-precision floating-point number.
Expand Down Expand Up @@ -496,6 +576,48 @@ The macro expects the following arguments:
When used, this macro should be used **instead of** `NAPI_MODULE`. The macro includes `NAPI_MODULE`, thus ensuring Node-API module registration.
#### STDLIB_MATH_BASE_NAPI_MODULE_II_I( fcn )
Macro for registering a Node-API module exporting an interface for invoking a binary function accepting and returning signed 32-bit integers.
```c
static int32_t add( const int32_t x, const int32_t y ) {
return x + y;
}
// ...
// Register a Node-API module:
STDLIB_MATH_BASE_NAPI_MODULE_II_I( add );
```

The macro expects the following arguments:

- **fcn**: `int32_t (*fcn)( int32_t, int32_t )` binary function.

When used, this macro should be used **instead of** `NAPI_MODULE`. The macro includes `NAPI_MODULE`, thus ensuring Node-API module registration.

#### STDLIB_MATH_BASE_NAPI_MODULE_II_D( fcn )

Macro for registering a Node-API module exporting an interface for invoking a binary function accepting signed 32-bit integers and returning a double-precision floating-point number.

```c
static double add( const int32_t x, const int32_t y ) {
return x + y;
}

// ...

// Register a Node-API module:
STDLIB_MATH_BASE_NAPI_MODULE_II_D( add );
```
The macro expects the following arguments:
- **fcn**: `double (*fcn)( int32_t, int32_t )` binary function.
When used, this macro should be used **instead of** `NAPI_MODULE`. The macro includes `NAPI_MODULE`, thus ensuring Node-API module registration.
#### STDLIB_MATH_BASE_NAPI_MODULE_FF_F( fcn )
Macro for registering a Node-API module exporting an interface for invoking a binary function accepting and returning single-precision floating-point numbers.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,86 @@
}; \
NAPI_MODULE( NODE_GYP_MODULE_NAME, stdlib_math_base_napi_dd_d_init )

/**
* Macro for registering a Node-API module exporting an interface invoking a binary function accepting and returning signed 32-bit integers.
*
* @param fcn binary function
*
* @example
* static int_32 add( const int_32 x, const int_32 y ) {
* return x + y;
* }
*
* // ...
*
* // Register a Node-API module:
* STDLIB_MATH_BASE_NAPI_MODULE_II_I( add );
*/
#define STDLIB_MATH_BASE_NAPI_MODULE_II_I( fcn ) \
static napi_value stdlib_math_base_napi_ii_i_wrapper( \
napi_env env, \
napi_callback_info info \
) { \
return stdlib_math_base_napi_ii_i( env, info, fcn ); \
}; \
static napi_value stdlib_math_base_napi_ii_i_init( \
napi_env env, \
napi_value exports \
) { \
napi_value fcn; \
napi_status status = napi_create_function( \
env, \
"exports", \
NAPI_AUTO_LENGTH, \
stdlib_math_base_napi_ii_i_wrapper, \
NULL, \
&fcn \
); \
assert( status == napi_ok ); \
return fcn; \
}; \
NAPI_MODULE( NODE_GYP_MODULE_NAME, stdlib_math_base_napi_ii_i_init )

/**
* Macro for registering a Node-API module exporting an interface invoking a binary function accepting signed 32-bit integers and returning a double-precision floating-point number.
*
* @param fcn binary function
*
* @example
* static double add( const int_32 x, const int_32 y ) {
* return x + y;
* }
*
* // ...
*
* // Register a Node-API module:
* STDLIB_MATH_BASE_NAPI_MODULE_II_D( add );
*/
#define STDLIB_MATH_BASE_NAPI_MODULE_II_D( fcn ) \
static napi_value stdlib_math_base_napi_ii_d_wrapper( \
napi_env env, \
napi_callback_info info \
) { \
return stdlib_math_base_napi_ii_d( env, info, fcn ); \
}; \
static napi_value stdlib_math_base_napi_ii_d_init( \
napi_env env, \
napi_value exports \
) { \
napi_value fcn; \
napi_status status = napi_create_function( \
env, \
"exports", \
NAPI_AUTO_LENGTH, \
stdlib_math_base_napi_ii_d_wrapper, \
NULL, \
&fcn \
); \
assert( status == napi_ok ); \
return fcn; \
}; \
NAPI_MODULE( NODE_GYP_MODULE_NAME, stdlib_math_base_napi_ii_d_init )

/**
* Macro for registering a Node-API module exporting an interface invoking a binary function accepting and returning single-precision floating-point numbers.
*
Expand Down Expand Up @@ -522,6 +602,16 @@ napi_value stdlib_math_base_napi_cc_c( napi_env env, napi_callback_info info, st
*/
napi_value stdlib_math_base_napi_di_d( napi_env env, napi_callback_info info, double (*fcn)( double, int32_t ) );

/**
* Invokes a binary function accepting signed 32-bit integers and returning a double-precision floating-point number.
*/
napi_value stdlib_math_base_napi_ii_d( napi_env env, napi_callback_info info, double (*fcn)( int32_t, int32_t ) );

/**
* Invokes a binary function accepting and returning signed 32-bit integers.
*/
napi_value stdlib_math_base_napi_ii_i( napi_env env, napi_callback_info info, int32_t (*fcn)( int32_t, int32_t ) );

/**
* Invokes a binary function accepting a single-precision floating-point number and a signed 32-bit integer and returning a single-precision floating-point number.
*/
Expand Down
124 changes: 124 additions & 0 deletions lib/node_modules/@stdlib/math/base/napi/binary/src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -524,6 +524,130 @@ napi_value stdlib_math_base_napi_di_d( napi_env env, napi_callback_info info, do
return v;
}

/**
* Invokes a binary function accepting signed 32-bit integers and returning a double-precision floating-point number.
*
* ## Notes
*
* - This function expects that the callback `info` argument provides access to the following JavaScript arguments:
*
* - `x`: input value.
* - `y`: input value.
*
* @param env environment under which the function is invoked
* @param info callback data
* @param fcn binary function
* @return function return value as a Node-API double-precision floating-point number
*/
napi_value stdlib_math_base_napi_ii_d( napi_env env, napi_callback_info info, double (*fcn)( int32_t, int32_t ) ) {
napi_status status;

size_t argc = 2;
napi_value argv[ 2 ];
status = napi_get_cb_info( env, info, &argc, argv, NULL, NULL );
assert( status == napi_ok );

if ( argc < 2 ) {
status = napi_throw_error( env, NULL, "invalid invocation. Must provide two numbers." );
assert( status == napi_ok );
return NULL;
}

napi_valuetype vtype0;
status = napi_typeof( env, argv[ 0 ], &vtype0 );
assert( status == napi_ok );
if ( vtype0 != napi_number ) {
status = napi_throw_type_error( env, NULL, "invalid argument. First argument must be a number." );
assert( status == napi_ok );
return NULL;
}

napi_valuetype vtype1;
status = napi_typeof( env, argv[ 1 ], &vtype1 );
assert( status == napi_ok );
if ( vtype1 != napi_number ) {
status = napi_throw_type_error( env, NULL, "invalid argument. Second argument must be a number." );
assert( status == napi_ok );
return NULL;
}

int32_t x;
status = napi_get_value_int32( env, argv[ 0 ], &x );
assert( status == napi_ok );

int32_t y;
status = napi_get_value_int32( env, argv[ 1 ], &y );
assert( status == napi_ok );

napi_value v;
status = napi_create_double( env, fcn( x, y ), &v );
assert( status == napi_ok );

return v;
}

/**
* Invokes a binary function accepting and returning signed 32-bit integers.
*
* ## Notes
*
* - This function expects that the callback `info` argument provides access to the following JavaScript arguments:
*
* - `x`: input value.
* - `y`: input value.
*
* @param env environment under which the function is invoked
* @param info callback data
* @param fcn binary function
* @return function return value as a Node-API signed 32-bit integer
*/
napi_value stdlib_math_base_napi_ii_i( napi_env env, napi_callback_info info, int32_t (*fcn)( int32_t, int32_t ) ) {
napi_status status;

size_t argc = 2;
napi_value argv[ 2 ];
status = napi_get_cb_info( env, info, &argc, argv, NULL, NULL );
assert( status == napi_ok );

if ( argc < 2 ) {
status = napi_throw_error( env, NULL, "invalid invocation. Must provide two numbers." );
assert( status == napi_ok );
return NULL;
}

napi_valuetype vtype0;
status = napi_typeof( env, argv[ 0 ], &vtype0 );
assert( status == napi_ok );
if ( vtype0 != napi_number ) {
status = napi_throw_type_error( env, NULL, "invalid argument. First argument must be a number." );
assert( status == napi_ok );
return NULL;
}

napi_valuetype vtype1;
status = napi_typeof( env, argv[ 1 ], &vtype1 );
assert( status == napi_ok );
if ( vtype1 != napi_number ) {
status = napi_throw_type_error( env, NULL, "invalid argument. Second argument must be a number." );
assert( status == napi_ok );
return NULL;
}

int32_t x;
status = napi_get_value_int32( env, argv[ 0 ], &x );
assert( status == napi_ok );

int32_t y;
status = napi_get_value_int32( env, argv[ 1 ], &y );
assert( status == napi_ok );

napi_value v;
status = napi_create_int32( env, fcn( x, y ), &v );
assert( status == napi_ok );

return v;
}

/**
* Invokes a binary function accepting a single-precision floating-point number and a signed 32-bit integer and returning a single-precision floating-point number.
*
Expand Down

0 comments on commit 074ae60

Please sign in to comment.