SPVM::Document::Extension - C/C++ Binding using SPVM Extension(BETA before 1.0)
If you use the feature Runtime Compile Native Function, you can write program using C language in runtime. This is similar with Extension::C, but SPVM implement this feature by default.
# TestCase/Extension.spvm package TestCase::Extension { native sub sum : int ($num1 : int, $num2 : int); } // TestCase/Extension.native/Extension.c #include <spvm_native.h> int32_t SPVM_NATIVE_TestCase__Extension__sum(SPVM_ENV* env, SPVM_VALUE* stack) { int32_t total = stack[0].ival + stack[1].ival; // Return value is set to stack[0] stack[0].ival = total; // If function success, return SPVM_SUCCESS return SPVM_SUCCESS; }
At first, you specify native descripter at SPVM subroutine.
native
package TestCase::Extension { # native descripter native sub sum : int ($num1 : int, $num2 : int); }
Next, you create "TestCase/Extension/Extension.c" file
TestCase/Extension.spvm TestCase/Extension.native/Extension.c
Next, you write C language. You include spvm_native.h.
spvm_native.h
#include <spvm_native.h>
C Function name start with SPVM_NATIVE_. C Function name must be replace : with <_>. If SPVM subroutine belong to TestCase::Extension package and subroutine name is Csum>, Declaration is the following.
SPVM_NATIVE_
:
TestCase::Extension
int32_t SPVM_NATIVE_TestCase__Extension__sum(SPVM_ENV* env, SPVM_VALUE* stack) { int32_t total = stack[0].ival + stack[1].ival; // Return value is set to stack[0] stack[0].ival = total; // If function success, return SPVM_SUCCESS return SPVM_SUCCESS; }
First argument is env. This is the pointer to SPVM_ENV. Second argument is stack. stack constains arguments.
env
SPVM_ENV
stack
SPVM_VALUE is union of C language. If you want to get int value, you do the followng.
stack[0].ival
You can get all type of value by the following member.
stack[0].bval stack[0].sval stack[0].ival stack[0].lval stack[0].fval stack[0].dval stack[0].oval
Type of return value is corresponding the folloing type.
[SPVM] [C] byte int8_t short int16_t int int32_t long int64_t float float double double [Object value] void*
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.