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.

# 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 SPNATIVE__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.

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.

#include <spvm_native.h>

C Function name start with SPNATIVE__. C Function name must be replace : with <_>. If SPVM subroutine belong to TestCase::Extension package and subroutine name is Csum>, Declaration is the following.

int32_t SPNATIVE__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.

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*