=head1 NAME

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

=head1 Tutorial

=head2 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 L<Extension::C>, but L<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 C<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 C<spvm_native.h>.

  #include <spvm_native.h>

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

  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 C<env>. This is the pointer to C<SPVM_ENV>. Second argument is C<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*

