SPVM::Document::NativeAPI - SPVM Native API(BETA before 1.0)
SPVM Native API is the API to Manipulate Array and Object, and call Subroutine in C Level.
To mprove peformance, you can write programing logic by C language and Native API.
You can do the following by SPVM Native API.
Create Array and Object.
Get Array Length.
Get numeric Array elements. Get and set object Array element.
Get and set Field.
Get and set Exception
I write some Examples for you to understand Native API.
1. Add two int value:
#include <spvm_api.h> int32_t SPVM__TestCase__Extension__sum(SPVM_API* api, SPVM_API_VALUE* args) { int32_t total = args[0].int_value + args[1].int_value; return total; }
You must include spvm_api.h to use SPVM Native API.
spvm_api.h
C Function name must be the name which Replace : of SPVM subroutine with _, and add SPVM to the top of it.
:
_
SPVM
[SPVM subroutine] [C Function] SPVM::TestCase::Extension::sum SPVM__TestCase__Extension__sum
SPVM Native API object. This object is always First Argument of native function .
int32_t SPVM__TestCase__Extension__array_sum(SPVM_API* api, SPVM_API_VALUE* args) { }
You can call Native API from this object, and First Argument of Native API is always this object.
int32_t SPVM__TestCase__Extension__array_sum(SPVM_API* api, SPVM_API_VALUE* args) { // Call SPVM Native API int32_t length = api->get_array_length(api, args[0].object_value); }
int32_t (*get_array_length)(SPVM_API*, SPVM_API_OBJECT*); int8_t* (*get_byte_array_elements)(SPVM_API*, SPVM_API_OBJECT*); int16_t* (*get_short_array_elements)(SPVM_API*, SPVM_API_OBJECT*); int32_t* (*get_int_array_elements)(SPVM_API*, SPVM_API_OBJECT*); int64_t* (*get_long_array_elements)(SPVM_API*, SPVM_API_OBJECT*); float* (*get_float_array_elements)(SPVM_API*, SPVM_API_OBJECT*); double* (*get_double_array_elements)(SPVM_API*, SPVM_API_OBJECT*); SPVM_API_OBJECT* (*get_object_array_element)(SPVM_API*, SPVM_API_OBJECT*, int32_t index); void (*set_object_array_element)(SPVM_API*, SPVM_API_OBJECT*, int32_t index, SPVM_API_OBJECT* value); int32_t (*get_field_id)(SPVM_API*, SPVM_API_OBJECT*, const char*); int8_t (*get_byte_field)(SPVM_API*, SPVM_API_OBJECT*, int32_t); int16_t (*get_short_field)(SPVM_API*, SPVM_API_OBJECT*, int32_t); int32_t (*get_int_field)(SPVM_API*, SPVM_API_OBJECT*, int32_t); int64_t (*get_long_field)(SPVM_API*, SPVM_API_OBJECT*, int32_t); float (*get_float_field)(SPVM_API*, SPVM_API_OBJECT*, int32_t); double (*get_double_field)(SPVM_API*, SPVM_API_OBJECT*, int32_t); SPVM_API_OBJECT* (*get_object_field)(SPVM_API*, SPVM_API_OBJECT*, int32_t); void (*set_byte_field)(SPVM_API*, SPVM_API_OBJECT*, int32_t, int8_t); void (*set_short_field)(SPVM_API*, SPVM_API_OBJECT*, int32_t, int16_t); void (*set_int_field)(SPVM_API*, SPVM_API_OBJECT*, int32_t, int32_t); void (*set_long_field)(SPVM_API*, SPVM_API_OBJECT*, int32_t, int64_t); void (*set_float_field)(SPVM_API*, SPVM_API_OBJECT*, int32_t, float); void (*set_double_field)(SPVM_API*, SPVM_API_OBJECT*, int32_t, double); void (*set_object_field)(SPVM_API*, SPVM_API_OBJECT*, int32_t, SPVM_API_OBJECT*); int32_t (*get_sub_id)(SPVM_API*, const char*); void (*call_void_sub)(SPVM_API* api, int32_t sub_id, SPVM_API_VALUE* args); int8_t (*call_byte_sub)(SPVM_API* api, int32_t sub_id, SPVM_API_VALUE* args); int16_t (*call_short_sub)(SPVM_API* api, int32_t sub_id, SPVM_API_VALUE* args); int32_t (*call_int_sub)(SPVM_API* api, int32_t sub_id, SPVM_API_VALUE* args); int64_t (*call_long_sub)(SPVM_API* api, int32_t sub_id, SPVM_API_VALUE* args); float (*call_float_sub)(SPVM_API* api, int32_t sub_id, SPVM_API_VALUE* args); double (*call_double_sub)(SPVM_API* api, int32_t sub_id, SPVM_API_VALUE* args); SPVM_API_OBJECT* (*call_object_sub)(SPVM_API* api, int32_t sub_id, SPVM_API_VALUE* args); int32_t (*get_type_id)(SPVM_API*, const char*); SPVM_API_OBJECT* (*new_object)(SPVM_API*, int32_t); SPVM_API_OBJECT* (*new_byte_array)(SPVM_API*, int32_t); SPVM_API_OBJECT* (*new_short_array)(SPVM_API*, int32_t); SPVM_API_OBJECT* (*new_int_array)(SPVM_API*, int32_t); SPVM_API_OBJECT* (*new_long_array)(SPVM_API*, int32_t); SPVM_API_OBJECT* (*new_float_array)(SPVM_API*, int32_t); SPVM_API_OBJECT* (*new_double_array)(SPVM_API*, int32_t); SPVM_API_OBJECT* (*new_object_array)(SPVM_API*, int32_t, int32_t); SPVM_API_OBJECT* (*get_exception)(SPVM_API* api); void (*set_exception)(SPVM_API* api, SPVM_API_OBJECT* exception); int32_t (*get_ref_count)(SPVM_API* api, SPVM_API_OBJECT* base_object); void (*inc_ref_count)(SPVM_API* api, SPVM_API_OBJECT* base_object); void (*dec_ref_count)(SPVM_API* api, SPVM_API_OBJECT* base_object); void (*inc_dec_ref_count)(SPVM_API* api, SPVM_API_OBJECT* base_object); int32_t (*get_objects_count)(SPVM_API* api); SPVM_API_RUNTIME* (*get_runtime)(SPVM_API* api); SPVM_API_OBJECT* (*new_string)(SPVM_API* api, const char* string);
To install SPVM, copy and paste the appropriate command in to your terminal.
cpanm
cpanm SPVM
CPAN shell
perl -MCPAN -e shell install SPVM
For more information on module installation, please visit the detailed CPAN module installation guide.