NAME

SPVM::Document::Extension - C/C++ Binding using SPVM Extension(BETA before 1.0)

Tutorial

Runtime Compile Native Function

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.

# SPVM/TestCase/Extension.spvm
package TestCase::Extension {
  sub sum : native int ($num1 : int, $num2 : int);
}

// SPVM/TestCase/Extension.native/Extension.c
#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;
}

At first, you specify native descripter at SPVM subroutine.

package TestCase::Extension {
  # native descripter
  sub sum : native int ($num1 : int, $num2 : int);
}

Next, you create "SPVM/TestCase/Extension/Extension.c" file

SPVM/TestCase/Extension.spvm
SPVM/TestCase/Extension.native/Extension.c

Next, you write C language. You include spvm_api.h.

#include <spvm_api.h>

C Function name must be replace : with <_> and add SPVM__ to top of SPVM subroutine name. SPVM subroutine absolute name is TestCase::Extension::sum. C function name is SPVM__TestCase__Extension__sum.

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;
}

First argument is api. This is the pointer to SPVM_API. Second argument is args. This is array of SPVM_API_VALUE.

SPVM_API_VALUE is union of C language. If you want to get int value, you do the followng.

args[0].int_value

You can get all type of value by the following member.

args[0].byte_value
args[0].short_value
args[0].int_value
args[0].long_value
args[0].float_value
args[0].double_value
args[0].object_value

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