NAME
SPVM::Document::NativeAPI - SPVM Native API(BETA before 1.0)
What is SPVM Native API
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.
C Function name must be the name which Replace :
of SPVM subroutine with _
, and add SPVM
to the top of it.
[SPVM subroutine] [C Function]
SPVM::TestCase::Extension::sum SPVM__TestCase__Extension__sum
Data Definision
SPVM_API
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);
}
Native API List
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);