The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

Name

SPVM::ExchangeAPI - SPVM Exchange API

Description

SPVM::ExchangeAPI is APIs to convert Perl data structures to/from SPVM data structures, and to call SPVM methods from Perl.

Usage

  use SPVM ();
  my $api = SPVM::api();
  my $spvm_int_array = $api->new_int_array([1, 2, 3]);
  my $perl_array_ref = $spvm_int_array->to_array;
  
  my $spvm_string = $api->new_string("abc");
  my $perl_string = $spvm_string->to_string;
  
  use SPVM 'Int';
  my $int_object = Int->new(4);
  my $value = $int_object->value;

Loading SPVM Class

  # Load an SPVM class
  use SPVM 'SomeClass';
  
  # Load only SPVM module
  use SPVM ();

The use statement loads a SPVM class.

An SPVM class is loaded and is bound to a Perl module.

The bound Perl class name is prefixed with SPVM::.

Exceptions:

If the SPVM module cannot be loaded, an exception is thrown.

Examples:

  use SPVM 'Int';
  
  my $int_object = SPVM::Int->new(3);
  my $value = $int_object->value.

SPVM Functions

api

  my $api = SPVM::api();

Gets the global SPVM::ExchangeAPI object for this Perl interpreter.

Fields

env

  my $env = $api->env;

Gets the current execution environment.

stack

  my $stack = $api->stack;

Gets the current call stack.

Class Methods

  my $api = SPVM::ExchangeAPI->new(env => $env, stack => $stack);

Creates a new SPVM::ExchangeAPI object.

Options:

env

An execution environment.

env must be a SPVM::Bulder::Env or SPVM::BlessedObject::Class object of the Native::Env class.

stack

An call stack.

stack must be a SPVM::Bulder::Stack or SPVM::BlessedObject::Class object of the Native::Stack class.

new_string

  my $spvm_string = $api->new_string($string);

Converts the Perl scalar $string to an SPVM string using perlapi SvPV, and returns the object that converts it to a SPVM::BlessedObject::String object.

If $string is undef, returns undef.

If $string is a SPVM::BlessedObject::String object, returns itself.

Exceptions:

$string must be a non-reference scalar or an SPVM::BlessedObject::String object or undef. Otherwise an exception is thrown.

Examples:

  my $spvm_string = $api->new_string("abc");
  
  my $spvm_string = $api->new_string("あいう");

new_byte_array

  my $spvm_array = $api->new_byte_array($array);

Converts the Perl array reference $array to an SPVM byte array, and returns the object that converts it to a SPVM::BlessedObject::Array object.

Each element is converted by the conversion of "byte Type Argument".

If $array is undef, returns undef.

If $array is a SPVM::BlessedObject::Array object, returns itself.

Exceptions:

$array: If it is a reference, it must be an array reference. Otherwise an exception is thrown.

$array: If it is an SPVM::BlessedObject::Array object, the type must be the byte[] type. Otherwise an exception is thrown.

Examples:

  my $spvm_array = $api->new_byte_array([1, 2, 3]);

new_byte_array_unsigned

  my $spvm_array = $api->new_byte_array_unsigned($array);

The same as the "new_byte_array" method, but each element is converted by the SvUV perlapi and a type cast to uint8_t in the C language.

  (int8_t)(uint8_t)SvUV(perl_scalar);

new_byte_array_len

  my $spvm_array= $api->new_byte_array_len($length);

Creates an SPVM byte array with the length $length, and returns the object that converts it to a SPVM::BlessedObject::Array object.

Exceptions:

$length must be greater than or equal to 0. Otherwise an exception is thrown.

Examples:

  my $length = 10;
  my $spvm_array = $api->new_byte_array_len($length);

new_byte_array_from_bin

  my $spvm_array = $api->new_byte_array_from_bin($binary);

Converts the binary date $binary to an SPVM byte array, and returns the object that converts it to a SPVM::BlessedObject::Array object.

$binary is copied to an SPVM byte array by the memcpy function in the C laugnage. The length of the array is calcurated from $binary.

Exceptions:

$binary must be a defined non-reference scalar. Otherwise an exception is thrown.

Examples:

  my $binary = pack('c*', 97, 98, 99);
  my $spvm_array = $api->new_byte_array_from_bin($binary);

  my $string = "abc";
  my $spvm_array = $api->new_byte_array_from_bin($string);
  
  my $string = "あいう";
  my $spvm_array = $api->new_byte_array_from_bin($string);

new_short_array

  my $spvm_array = $api->new_short_array($array);

Converts the Perl array reference $array to an SPVM short array, and returns the object that converts it to a SPVM::BlessedObject::Array object.

Each element is converted by the conversion of "short Type Argument".

If $array is undef, returns undef.

If $array is a SPVM::BlessedObject::Array object, returns itself.

Exceptions:

$array: If it is a reference, it must be an array reference. Otherwise an exception is thrown.

$array: If it is an SPVM::BlessedObject::Array object, the type must be the short[] type. Otherwise an exception is thrown.

Examples:

  my $spvm_array = $api->new_short_array([1, 2, 3]);

new_short_array_unsigned

  my $spvm_array = $api->new_short_array_unsigned($array);

The same as the "new_short_array" method, but each element is converted by the SvUV perlapi and a type cast to uint16_t in the C language.

  (int16_t)(uint16_t)SvUV(perl_scalar);

new_short_array_len

  my $spvm_array = $api->new_short_array_len($length);

Creates an SPVM short array with the length $length, and returns the object that converts it to a SPVM::BlessedObject::Array object.

Exceptions:

$length must be greater than or equal to 0. Otherwise an exception is thrown.

Examples:

  my $length = 10;
  my $spvm_array = $api->new_short_array_len($length);

new_short_array_from_bin

  my $spvm_array = $api->new_short_array_from_bin($binary);

Converts the binary date $binary to an SPVM short array, and returns the object that converts it to a SPVM::BlessedObject::Array object.

$binary is copied to an SPVM short array by the memcpy function in the C laugnage. The length of the array is calcurated from $binary.

Exceptions:

$binary must be a defined non-reference scalar. Otherwise an exception is thrown.

The length of $binary must be divisible by 2. Otherwise an exception is thrown.

Examples:

  my $binary = pack('s*', 97, 98, 99);
  my $spvm_array = $api->new_short_array_from_bin($binary);

new_int_array

  my $spvm_array = $api->new_int_array($array);

Converts the Perl array reference $array to an SPVM int array, and returns the object that converts it to a SPVM::BlessedObject::Array object.

Each element is converted by the conversion of "int Type Argument".

If $array is undef, returns undef.

If $array is a SPVM::BlessedObject::Array object, returns itself.

Exceptions:

$array: If it is a reference, it must be an array reference. Otherwise an exception is thrown.

$array: If it is an SPVM::BlessedObject::Array object, the type must be the int[] type. Otherwise an exception is thrown.

Examples:

  my $spvm_array = $api->new_int_array([1, 2, 3]);

new_int_array_unsigned

  my $spvm_array = $api->new_int_array_unsigned($array);

The same as the "new_int_array" method, but each element is converted by the SvUV perlapi and a type cast to uint32_t in the C language.

  (int32_t)(uint32_t)SvUV(perl_scalar);

new_int_array_len

  my $spvm_array = $api->new_int_array_len($length);

Creates an SPVM int array with the length $length, and returns the object that converts it to a SPVM::BlessedObject::Array object.

Exceptions:

$length must be greater than or equal to 0. Otherwise an exception is thrown.

Examples:

  my $length = 10;
  my $spvm_array = $api->new_int_array_len($length);

new_int_array_from_bin

  my $spvm_array = $api->new_int_array_from_bin($binary);

Converts the binary date $binary to an SPVM int array, and returns the object that converts it to a SPVM::BlessedObject::Array object.

$binary is copied to an SPVM int array by the memcpy function in the C laugnage. The length of the array is calcurated from $binary.

Exceptions:

$binary must be defined. Otherwise an exception is thrown.

The length of $binary must be divisible by 4. Otherwise an exception is thrown.

Examples:

  my $binary = pack('l*', 97, 98, 99);
  my $spvm_array = $api->new_int_array_from_bin($binary);

new_long_array

  my $spvm_array = $api->new_long_array($array);

Converts the Perl array reference $array to an SPVM long array, and returns the object that converts it to a SPVM::BlessedObject::Array object. Each element is converted by the conversion of "long Type Argument".

If $array is undef, returns undef.

Exceptions:

$array: If it is a reference, it must be an array reference. Otherwise an exception is thrown.

$array: If it is an SPVM::BlessedObject::Array object, the type must be the long[] type. Otherwise an exception is thrown.

Examples:

  my $spvm_array = $api->new_long_array([1, 2, 3]);

new_long_array_unsigned

  my $spvm_array = $api->new_long_array_unsigned($array);

The same as the "new_long_array" method, but each element is converted by the SvUV perlapi and a type cast to uint64_t in the C language.

  (int64_t)(uint64_t)SvUV(perl_scalar);

new_long_array_len

  my $spvm_array = $api->new_long_array_len($length);

Creates an SPVM long array with the length $length, and returns the object that converts it to a SPVM::BlessedObject::Array object.

Exceptions:

$length must be greater than or equal to 0. Otherwise an exception is thrown.

Examples:

  my $length = 10;
  my $spvm_array = $api->new_long_array_len($length);

new_long_array_from_bin

  my $spvm_array = $api->new_long_array_from_bin($binary);

Converts the binary date $binary to an SPVM long array, and returns the object that converts it to a SPVM::BlessedObject::Array object.

$binary is copied to an SPVM long array by the memcpy function in the C laugnage. The length of the array is calcurated from $binary.

Exceptions:

$binary must be defined. Otherwise an exception is thrown.

The length of $binary must be divisible by 8. Otherwise an exception is thrown.

Examples:

  my $binary = pack('q*', 97, 98, 99);
  my $spvm_array = $api->new_long_array_from_bin($binary);

new_float_array

  my $spvm_array = $api->new_float_array($array);

Converts the Perl array reference $array to an SPVM float array, and returns the object that converts it to a SPVM::BlessedObject::Array object.

Each element is converted by the conversion of "float Type Argument".

If $array is undef, returns undef.

If $array is a SPVM::BlessedObject::Array object, returns itself.

Exceptions:

$array: If it is a reference, it must be an array reference. Otherwise an exception is thrown.

$array: If it is an SPVM::BlessedObject::Array object, the type must be the float[] type. Otherwise an exception is thrown.

Examples:

  my $spvm_array = $api->new_float_array([1, 2, 3]);

new_float_array_len

  my $spvm_array = $api->new_float_array_len($length);

Creates an SPVM float array with the length $length, and returns the object that converts it to a SPVM::BlessedObject::Array object.

Exceptions:

$length must be greater than or equal to 0. Otherwise an exception is thrown.

Examples:

  my $length = 10;
  my $spvm_array = $api->new_float_array_len($length);

new_float_array_from_bin

  my $spvm_array = $api->new_float_array_from_bin($binary);

Converts the binary date $binary to an SPVM float array, and returns the object that converts it to a SPVM::BlessedObject::Array object.

$binary is copied to an SPVM float array by the memcpy function in the C laugnage. The length of the array is calcurated from $binary.

Exceptions:

$binary must be defined. Otherwise an exception is thrown.

The length of $binary must be divisible by 4. Otherwise an exception is thrown.

Examples:

  my $binary = pack('f*', 97.1, 98.2, 99.3);
  my $spvm_array = $api->new_float_array_from_bin($binary);

new_double_array

  my $spvm_array = $api->new_double_array($array);

Converts the Perl array reference $array to an SPVM double array, and returns the object that converts it to a SPVM::BlessedObject::Array object.

Each element is converted by the conversion of "double Type Argument".

Exceptions:

$array: If it is a reference, it must be an array reference. Otherwise an exception is thrown.

$array: If it is an SPVM::BlessedObject::Array object, the type must be the double[] type. Otherwise an exception is thrown.

Examples:

  my $spvm_array = $api->new_double_array([1, 2, 3]);

new_double_array_len

  my $spvm_array = $api->new_double_array_len($length);

Creates an SPVM double array with the length $length, and returns the object that converts it to a SPVM::BlessedObject::Array object.

Exceptions:

$length must be greater than or equal to 0. Otherwise an exception is thrown.

Examples:

  my $length = 10;
  my $spvm_array = $api->new_double_array_len($length);

new_double_array_from_bin

  my $spvm_array = $api->new_double_array_from_bin($binary);

Converts the binary date $binary to an SPVM double array, and returns the object that converts it to a SPVM::BlessedObject::Array object.

$binary is copied to an SPVM double array by the memcpy function in the C laugnage. The length of the array is calcurated from $binary.

Exceptions:

$binary must be defined. Otherwise an exception is thrown.

The length of $binary must be divisible by 8. Otherwise an exception is thrown.

Examples:

  my $binary = pack('d*', 97.1, 98.2, 99.3);
  my $spvm_array = $api->new_double_array_from_bin($binary);

new_string_array

  my $spvm_array = $api->new_string_array($array);

Converts the Perl array reference $array to an SPVM string array, and returns the object that converts it to a SPVM::BlessedObject::Array object. Each element is converted by the "new_string" method.

If $array is undef, returns undef.

If $array is a SPVM::BlessedObject::Array object, returns itself.

Exceptions:

$array: If it is a reference, it must be an array reference. Otherwise an exception is thrown.

$array: If it is an SPVM::BlessedObject::Array object, the type must be the string[] type. Otherwise an exception is thrown.

Examples:

  my $spvm_array = $api->new_string_array(["foo", "bar", "baz"]);
  
  my $spvm_array = $api->new_string_array(["あい", "うえ", "お"]);

new_string_array_len

  my $spvm_array = $api->new_string_array_len($length);

Creates an SPVM string array with the length $length, and returns the object that converts it to a SPVM::BlessedObject::Array object.

Exceptions:

$length must be greater than or equal to 0. Otherwise an exception is thrown.

Examples:

  my $length = 10;
  my $spvm_array = $api->new_string_array_len($length);

new_object_array

  my $spvm_object_array = $api->new_object_array($type_name, $array);

Converts the Perl array reference $array to a value of the SPVM object array(1-dimensional) type $type_name, and returns the object that converts it to a SPVM::BlessedObject::Array object of $type_name type.

If $array is undef, it is converted to SPVM undef.

If $array is a SPVM::BlessedObject::Array object, returns itself.

Exceptions:

If the type name $type_name was parsed, but the class name could not be extracted, an exception is thrown.

$array: If it is a reference, it must be an array reference. Otherwise an exception is thrown.

$array: If it is an SPVM::BlessedObject::Array object, the type must be assignable. Otherwise an exception is thrown.

If the bacic type of the type $type_name is not found, an exception is thrown.

The dimension of the type $type_name must be 1. Otherwise an exception is thrown.

$type_name must be an object array type. Otherwise an exception is thrown.

Examples:

  my $point1 = SPVM::Point->new;
  my $point2 = SPVM::Point->new;
  my $spvm_array = $api->new_object_array("Point[]", [$point1, $point2]);

new_object_array_len

  my $spvm_array = $api->new_object_array_len($type_name, $length);

Creates an SPVM object array(1-dimensional) with the type name $type_name and the length $length, and returns the object that converts it to a SPVM::BlessedObject::Array object of $type_name type.

Exceptions:

If the type name $type_name was parsed, but the class name could not be extracted, an exception is thrown.

$length must be greater than or equal to 0. Otherwise an exception is thrown.

If the bacic type of the type $type_name is not found, an exception is thrown.

The dimension of the type $type_name must be 1. Otherwise an exception is thrown.

$type_name must be an object array type. Otherwise an exception is thrown.

Examples:

  my $length = 10;
  my $spvm_array = $api->new_object_array("Point[]", $length);

new_any_object_array

  my $byte_array = $api->new_any_object_array(
    [SPVM::Byte->new(1), SPVM::Byte>new(2), SPVM::Byte->new(3)]
  );

The alias for the following code using the "new_object_array" method.

  my $spvm_array = $api->new_object_array('object[]', $array);

new_any_object_array_len

  my $spvm_array = $api->new_any_object_array_len($length);

Creates an SPVM object array with the length $length, and returns the object that converts it to a SPVM::BlessedObject::Array object of $type_name.

Exceptions:

$length must be greater than or equal to 0. Otherwise an exception is thrown.

Examples:

  my $length = 10;
  my $spvm_array = $api->new_any_object_array("Point[]", $length);

new_options

  my $spvm_any_object_array = $api->new_options($options);

Converts the Perl hash reference $options to a value of the SPVM object[] type, and returns the object that converts it to a SPVM::BlessedObject::Array object.

Each key of $options is converted to a SPVM::BlessedObject::String object using the "new_string" method.

Exceptions:

The value of $options must be a SPVM::BlessedObject object. Otherwise an exception is thrown.

$options must be a hash reference. Otherwise an exception is thrown.

Examples:

  my $options = $api->new_options({
    x => SPVM::Int->new(1),
    y => SPVM::Int->new(2)
  });

new_mulnum_array

  my $spvm_mulnum_array = $api->new_mulnum_array($type_name, $array);

Converts the Perl array reference of a hash references $array to the SPVM multi-numeric array type $type_name, and returns the object that converts it to a SPVM::BlessedObject::Array object.

Each value of the hash reference is coverted by the conversion of "byte Type Argument", "short Type Argument", "int Type Argument", "long Type Argument", "float Type Argument", "double Type Argument" corresponding to the numeric type of the the element of $type.

Exceptions:

If the type name $type_name was parsed, but the class name could not be extracted, an exception is thrown.

All fields of the element type of $type_name must be defined. Otherwise an exception is thrown.

If the bacic type of the type $type_name is not found, an exception is thrown.

The dimension of the type $type_name must be 1. Otherwise an exception is thrown.

$array: If it is a reference, it must be an array reference. Otherwise an exception is thrown.

$array: If it is an SPVM::BlessedObject::Array object, the type must be assignable. Otherwise an exception is thrown.

Examples:

  my $values = [
    {x => 0, y => 1, z => 2},
    {x => 3, y => 4, z => 5},
    {x => 6, y => 7, z => 8},
  ];
  my $spvm_mulnum_array = $api->new_mulnum_array("TestCase::Point_3i[]", $values);

new_mulnum_array_len

  my $spvm_array = $api->new_mulnum_array_len($type_name, $length);

Creates an SPVM object array with the type name $type_name and the length $length, and returns the object that converts it to a SPVM::BlessedObject::Array object of $type_name.

Exceptions:

$length must be greater than or equal to 0. Otherwise an exception is thrown.

If the bacic type of the type $type_name is not found, an exception is thrown.

The dimension of $type_name must be 1. Otherwise an exception is thrown.

Examples:

  my $length = 10;
  my $spvm_array = $api->new_mulnum_array("Complex_2d[]", $length);

new_mulnum_array_from_bin

  my $spvm_mulnum_array = $api->new_mulnum_array_from_bin($type_name, $binary);

Converts the binary data $binary to an SPVM multi-numeric array type $type_name, and returns the object that converts it to a SPVM::BlessedObject::Array object.

$binary is copied to an SPVM multi-numeric array by the memcpy function in the C laugnage. The length of the array is calcurated from $binary.

Exceptions:

If the bacic type of the type $type_name is not found, an exception is thrown.

The dimension of the type $type_name must be 1. Otherwise an exception is thrown.

$binary must be an array reference. Otherwise an exception is thrown.

The length of $binary must be divisible by the length of fields * the byte size of the element type. Otherwise an exception is thrown.

Examples:

  # new_mulnum_array_from_bin - byte
  {
    my $binary = pack('c9', (0, 1, 2), (3, 4, 5), (6, 7, 8));
    my $spvm_mulnum_array = $api->new_mulnum_array_from_bin("TestCase::Point_3b[]", $binary);
  }

  # new_mulnum_array_from_bin - short
  {
    my $binary = pack('s9', (0, 1, 2), (3, 4, 5), (6, 7, 8));
    my $spvm_mulnum_array = $api->new_mulnum_array_from_bin("TestCase::Point_3s[]", $binary);
  }

  # new_mulnum_array_from_bin - int
  {
    my $binary = pack('l9', (0, 1, 2), (3, 4, 5), (6, 7, 8));
    my $spvm_mulnum_array = $api->new_mulnum_array_from_bin("TestCase::Point_3i[]", $binary);
  }

  # new_mulnum_array_from_bin - long
  {
    my $binary = pack('q9', (0, 1, 2), (3, 4, 5), (6, 7, 8));
    my $spvm_mulnum_array = $api->new_mulnum_array_from_bin("TestCase::Point_3l[]", $binary);
  }

  # new_mulnum_array_from_bin - float
  {
    my $binary = pack('f9', (0, 1, 2), (3, 4, 5), (6, 7, 8));
    my $spvm_mulnum_array = $api->new_mulnum_array_from_bin("TestCase::Point_3f[]", $binary);
  }

  # new_mulnum_array_from_bin - double
  {
    my $binary = pack('d9', (0, 1, 2), (3, 4, 5), (6, 7, 8));
    my $spvm_mulnum_array = $api->new_mulnum_array_from_bin("TestCase::Point_3d[]", $binary);
  }

new_muldim_array

  my $spvm_object_array = $api->new_muldim_array($type_name, $array);

Converts the Perl array reference $array to a value of the SPVM multi-dimensional array type $type_name, and returns the object that converts it to a SPVM::BlessedObject::Array object.

If $array is undef, it is converted to SPVM undef.

If $array is a SPVM::BlessedObject::Array object, returns itself.

Exceptions:

If $array is a reference other than the array reference, an exception is thrown.

$array: If it is a reference, it must be an array reference. Otherwise an exception is thrown.

$array: If it is an SPVM::BlessedObject::Array object, the type must be assignable. Otherwise an exception is thrown.

If the bacic type of the type $type_name is not found, an exception is thrown.

The dimension of $type_name must be greater than or equal to 2 and less than or equal to 255. Otherwise an exception is thrown.

The assignability of the element to the element type of $type_name is checked. If it is not assignable, an exception is thrown.

Examples:

  my $object1 = $api->new_int_array([1, 2, 3]);
  my $object2 = $api->new_int_array([4, 5, 6]);
  my $objects = $api->new_muldim_array("int[][]", [$object1, $object2]);

new_muldim_array_len

  my $spvm_array = $api->new_muldim_array_len($type_name, $length);

Creates an SPVM multi-dimensional array with the type name $type_name and the length $length, and returns the object that converts it to a SPVM::BlessedObject::Array object of $type_name.

Exceptions:

$length must be greater than or equal to 0. Otherwise an exception is thrown.

If the bacic type of the type $type_name is not found, an exception is thrown.

The dimension of $type_name must be greater than or equal to 2 and less than or equal to 255. Otherwise an exception is thrown.

Examples:

  my $length = 10;
  my $spvm_array = $api->new_muldim_array("int[][]", $length);

get_exception

  my $message = $api->get_exception();

Returns the exception of the current thread variables as a SPVM::BlessedObject::String object.

If the exception is not set, undef is returned.

set_exception

  $api->set_exception($message);

Sets a message given by $message to the exception of the current thread variables.

$message is converted to the SPVM string using the "new_string" method.

Exceptions:

Exceptions thrown by the "new_string" method are thrown.

Examples:

  $api->set_exception("Error");
  $api->set_exception(undef);

get_memory_blocks_count

  my $count = $api->get_memory_blocks_count();

Returns the count of memory blocks the current runtime allocates.

Examples:

  # First Memory Blocks Count
  my $start_memory_blocks_count = $api->get_memory_blocks_count();

  # Processing
  # ...

  # Last Memory Blocks Count
  my $end_memory_blocks_count = $api->get_memory_blocks_count();

  unless ($end_memory_blocks_count == $start_memory_blocks_count) {
    die"Memroy leak";
  }

class

  my $class = $api->class($basic_type_name);

Creates a new SPVM::ExchangeAPI::Class object with the class name $basic_type_name, and returns it.

Examples:

  my $class = $api->class('Int');
  my $spvm_object = $class->new(1);

dump

  my $dump = $api->dump($object);

Converts the SPVM object $object to a dumped string using the dump operator, and returns it.

Exceptions:

$object must be an SPVM::BlessedObject object. Otherwise an exception is thrown.

error

  my $error = $api->new_error;

Creates a new SPVM::ExchangeAPI::Error object, and returns it.

The error id is set to 0.

call_method

  my $ret = $api->call_method($invocant, $method_name, @args);
  
  my $ret = $api->call_method($invocant, $method_name, @args, $error);

Calls a class method or an instance method. If the invocant $invocant is a string, a class method is called. If the invocant $invocant is a SPVM::BlessedObject::Class, an instance method is called.

Each of the arguments @args are converted by the rule of "Argument Conversion".

The method name $method_name allows a static method name such as Foo::bar.

The return value is converted by the rule of "Return Value Conversion".

If a SPVM::ExchangeAPI::Error object is passed to the last of the arguments, and if an exception is thrown from an SPVM method, the error code is set to the code field of the object.

Exceptions:

If $invocant is an SPVM::BlessedObject, $invocant must be an SPVM::BlessedObject::Class object. Otherwise an exception is thrown.

The static method call must be valid. Otherwise an exception is thrown.

If the M method in the C class is not found, an exception is thrown.

If too few arguments are passed to the M method in the C class, an exception is thrown.

If too many arguments are passed to the M method in the C class, an exception is thrown.

If the "Argument Conversion" in argument conversion fails, an exception is thrown.

If the calling method throws an exception, the exception is thrown.

Examples:

  # Class method call
  my $obj_int = $api->call_method("Int", "new", 1);
  
  # Instance method call
  $api->call_method($obj_int, "set_value", 5);
  my $value = $api->call_method($obj_int, "value");
  
  # Call static instance method
  $api->call_method($object, "Foo::value");

Easy Ways:

Calling class methods can be made easier using the SPVM class loading feature.

  use SPVM 'Int';
  my $int_object = Int->new(4);

Instance method calls can be made easier using SPVM::BlessedObject::Class.

  my $value = $int_object->value;

Argument Conversion

Each argument passed to the "call_method" method are converted to an SPVM value according to the SPVM type before it passed to an SPVM method.

byte Type Argument

A Perl scalar is converted to a value of the SPVM byte type by the SvIV perlapi and a type cast to int8_t in the C language.

  (int8_t)SvIV(perl_scalar)

Exceptions:

The argument must be a non-reference scalar. Otherwise an exception is thrown.

short Type Argument

A Perl scalar is converted to a value of the SPVM short type by the SvIV perlapi and a type cast to int16_t in the C language.

  (int16_t)SvIV(perl_scalar)

Exceptions:

The argument must be a non-reference scalar. Otherwise an exception is thrown.

int Type Argument

A Perl scalar is converted to a value of the SPVM int type by the SvIV perlapi and a type cast to int32_t in the C language.

  (int32_t)SvIV(perl_scalar)

Exceptions:

The argument must be a non-reference scalar. Otherwise an exception is thrown.

Examples:

  my $int_object = SPVM::Int->new(10);

long Type Argument

A Perl scalar is converted to a value of the SPVM long type by the SvIV perlapi and a type cast to int64_t in the C language.

  (int64_t)SvIV(perl_scalar)

Exceptions:

The argument must be a non-reference scalar. Otherwise an exception is thrown.

Examples:

  my $long_object = SPVM::Long->new(10);

float Type Argument

A Perl scalar is converted to a value of the SPVM float type by the SvNV perlapi and a type cast to float in the C language.

  (float)SvNV(perl_scalar)

Exceptions:

The argument must be a non-reference scalar. Otherwise an exception is thrown.

Examples:

  my $float_object = SPVM::Float->new(10.5);

double Type Argument

A Perl scalar is converted to a value of the SPVM double type by the SvNV perlapi and a type cast to double in the C language.

  (double)SvNV(perl_scalar)

Exceptions:

The argument must be a non-reference scalar. Otherwise an exception is thrown.

Examples:

  my $double_object = SPVM::Double->new(10.5);

string Type Argument

A Perl scalar is converted to a value of the SPVM string type by the "new_string" method.

Exceptions:

Exceptions thrown by the "new_string" method are thrown.

Examples:

  my $substr = SPVM::Fn->substr("abcde", 0, 3);

Any Object Type Argument

No conversion is performed.

Exceptions:

The argument must be an SPVM::BlessedObject object or undef. Otherwise an exception is thrown.

Class Type Argument

No conversion is performed.

Exceptions:

The argument must be an SPVM::BlessedObject::Class object of a Z assignable type or undef. Otherwise an exception is thrown.

Interaface Type Argument

No conversion is performed.

Exceptions:

The argument must be an SPVM::BlessedObject::Class object of a Z assignable type or undef. Otherwise an exception is thrown.

Multi-Numeric Type Argument

Multi-Numeric byte

Converts a hash reference containing field names and its values of the multi-numeric byte type to a value of the multi-numeric byte type.

Each field value is coverted by the conversion of "byte Type Argument".

Exceptions:

The argument must be a hash reference. Otherwise an exception is thrown.

If a field is not found, an exception is thrown.

Examples:

  # Converts a Perl hash reference to MyClassPoint_2b type
  SPVM::MyClass->foo({x => 1, y => 2});

Multi-Numeric short Type Argument

Converts a hash reference containing field names and its values of the multi-numeric short type to a value of the multi-numeric short type.

Each field value is coverted by the conversion of "short Type Argument".

Exceptions:

The argument must be a hash reference. Otherwise an exception is thrown.

If a field is not found, an exception is thrown.

Examples:

  # Converts a Perl hash reference to MyClassPoint_2s type
  SPVM::MyClass->foo({x => 1, y => 2});

Multi-Numeric int Type Argument

Converts a hash reference containing field names and its values of the multi-numeric int type to a value of the multi-numeric int type.

Each field value is coverted by the conversion of "int Type Argument".

Exceptions:

The argument must be a hash reference. Otherwise an exception is thrown.

If a field is not found, an exception is thrown.

Examples:

  # Converts a Perl hash reference to MyClassPoint_2i type
  SPVM::MyClass->foo({x => 1, y => 2});

Multi-Numeric long Type Argument

Converts a hash reference containing field names and its values of the multi-numeric long type to a value of the multi-numeric long type.

Each field value is coverted by the conversion of "long Type Argument".

Exceptions:

The argument must be a hash reference. Otherwise an exception is thrown.

If a field is not found, an exception is thrown.

Examples:

  # Converts a Perl hash reference to MyClassPoint_2l type
  SPVM::MyClass->foo({x => 1, y => 2});

Multi-Numeric float Type Argument

Converts a hash reference containing field names and its values of the multi-numeric float type to a value of the multi-numeric float type.

Each field value is coverted by the conversion of "float Type Argument".

Exceptions:

The argument must be a hash reference. Otherwise an exception is thrown.

If a field is not found, an exception is thrown.

Examples:

  # Converts a Perl hash reference to MyClassPoint_2f type
  SPVM::MyClass->foo({x => 1.2, y => 2.3});

Multi-Numeric double Type Argument

Converts a hash reference containing field names and its values of the multi-numeric double type to a value of the multi-numeric double type.

Each field value is coverted by the conversion of "double Type Argument".

Exceptions:

The argument must be a hash reference. Otherwise an exception is thrown.

If a field is not found, an exception is thrown.

Examples:

  # Converts a Perl hash reference to MyClassPoint_2d type
  SPVM::MyClass->foo({x => 1.2, y => 2.3});

Numeric Reference Type Argument

byte Reference Type Argument

A Perl reference is converted to a value of the SPVM byte reference type.

The referenced value is converted to a value of the SPVM byte type by the conversion of "byte Type Argument".

After returning from the SPVM method, the referenced value is converted to a Perl scalar by the conversion of "byte Type Return Value"

Exceptions:

The argument must be a scalar reference. Otherwise an exception is thrown.

Examples:

  # Converts a Perl scalar reference to byte* type
  my $value = 23;
  SPVM::MyClass->foo(\$value);

short Reference Type Argument

A Perl reference is converted to a value of the SPVM short reference type.

The referenced value is converted to a value of the SPVM short type by the conversion of "short Type Argument".

After returning from the SPVM method, the referenced value is converted to a Perl scalar by the conversion of "short Type Return Value"

Exceptions:

The argument must be a scalar reference. Otherwise an exception is thrown.

Examples:

  # Converts a Perl scalar reference to short* type
  my $value = 23;
  SPVM::MyClass->foo(\$value);

int Reference Type Argument

A Perl reference is converted to a value of the SPVM int reference type.

The referenced value is converted to a value of the SPVM int type by the conversion of "int Type Argument".

After returning from the SPVM method, the referenced value is converted to a Perl scalar by the conversion of "int Type Return Value"

Exceptions:

The argument must be a scalar reference. Otherwise an exception is thrown.

Examples:

  # Converts a Perl scalar reference to int* type
  my $value = 23;
  SPVM::MyClass->foo(\$value);

long Reference Type Argument

A Perl reference is converted to a value of the SPVM long reference type.

The referenced value is converted to a value of the SPVM long type by the conversion of "long Type Argument".

After returning from the SPVM method, the referenced value is converted to a Perl scalar by the conversion of "long Type Return Value"

Exceptions:

The argument must be a scalar reference. Otherwise an exception is thrown.

Examples:

  # Converts a Perl scalar reference to long* type
  my $value = 23;
  SPVM::MyClass->foo(\$value);

float Reference Type Argument

A Perl reference is converted to a value of the SPVM float reference type.

The referenced value is converted to a value of the SPVM float type by the conversion of "float Type Argument".

After returning from the SPVM method, the referenced value is converted to a Perl scalar by the conversion of "float Type Return Value"

Exceptions:

The argument must be a scalar reference. Otherwise an exception is thrown.

Examples:

  # Converts a Perl scalar reference to float* type
  my $value = 23.5;
  SPVM::MyClass->foo(\$value);

double Reference Type Argument

A Perl reference is converted to a value of the SPVM double reference type.

The referenced value is converted to a value of the SPVM double type by the conversion of "double Type Argument".

After returning from the SPVM method, the referenced value is converted to a Perl scalar by the conversion of "double Type Return Value"

Exceptions:

The argument must be a scalar reference. Otherwise an exception is thrown.

Examples:

  # Converts a Perl scalar reference to double* type
  my $value = 23.5;
  SPVM::MyClass->foo(\$value);

Multi-Numeric Reference Type Argument

Multi-Numeric byte Reference Type Argument

A Perl reference is converted to an SPVM multi-numeric byte reference type.

Each field is converted to a value of the SPVM byte type by the conversion of "byte Type Argument".

After returning from the SPVM method, each field value is converted to a Perl scalar by the conversion of "byte Type Return Value".

Exceptions:

The reference must be a scalar reference to a hash reference. Otherwise an exception is thrown.

If a field is not found, an exception is thrown.

Examples:

  # Converts a Perl scalar reference to a hash reference to the MyClassPoint_2b* type
  my $value = {x => 1, y => 2};
  SPVM::MyClass->foo(\$value);

Multi-Numeric short Reference Type Argument

A Perl reference is converted to an SPVM multi-numeric short reference type.

Each field is converted to a value of the SPVM short type by the conversion of "short Type Argument".

After returning from the SPVM method, each field value is converted to a Perl scalar by the conversion of "short Type Return Value".

Exceptions:

The reference must be a scalar reference to a hash reference. Otherwise an exception is thrown.

If a field is not found, an exception is thrown.

Examples:

  # Converts a Perl scalar reference to a hash reference to the MyClassPoint_2s* type
  my $value = {x => 1, y => 2};
  SPVM::MyClass->foo(\$value);

Multi-Numeric int Reference Type Argument

A Perl reference is converted to an SPVM multi-numeric int reference type.

Each field is converted to a value of the SPVM int type by the conversion of "int Type Argument".

After returning from the SPVM method, each field value is converted to a Perl scalar by the conversion of "int Type Return Value".

Exceptions:

The reference must be a scalar reference to a hash reference. Otherwise an exception is thrown.

If a field is not found, an exception is thrown.

Examples:

  # Converts a Perl scalar reference to a hash reference to the SPVM MyClassPoint_2i* type
  my $value = {x => 1, y => 2};
  SPVM::MyClass->foo(\$value);

Multi-Numeric long Reference Type Argument

A Perl reference is converted to an SPVM multi-numeric long reference type.

Each field is converted to a value of the SPVM long type by the conversion of "long Type Argument".

After returning from the SPVM method, each field value is converted to a Perl scalar by the conversion of "long Type Return Value".

Exceptions:

The reference must be a scalar reference to a hash reference. Otherwise an exception is thrown.

If a field is not found, an exception is thrown.

Examples:

  # Converts a Perl scalar reference to a hash reference to the SPVM MyClassPoint_2l* type
  my $value = {x => 1, y => 2};
  SPVM::MyClass->foo(\$value);

Multi-Numeric float Reference Type Argument

A Perl reference is converted to an SPVM multi-numeric float reference type.

Each field is converted to a value of the SPVM float type by the conversion of "float Type Argument".

After returning from the SPVM method, each field value is converted to a Perl scalar by the conversion of "float Type Return Value".

Exceptions:

The reference must be a scalar reference to a hash reference. Otherwise an exception is thrown.

If a field is not found, an exception is thrown.

Examples:

  # Converts a Perl scalar reference to a hash reference to the SPVM MyClassPoint_2f* type
  my $value = {x => 1,2, y => 2.3};
  SPVM::MyClass->foo(\$value);

Multi-Numeric double Reference Type Argument

A Perl reference is converted to an SPVM multi-numeric double reference type.

Each field is converted to a value of the SPVM double type by the conversion of "double Type Argument".

After returning from the SPVM method, each field value is converted to a Perl scalar by the conversion of "double Type Return Value".

Exceptions:

The reference must be a scalar reference to a hash reference. Otherwise an exception is thrown.

If a field is not found, an exception is thrown.

Examples:

  # Converts a Perl scalar reference to a hash reference to the SPVM MyClassPoint_2d* type
  my $value = {x => 1.2, y => 2.3};
  SPVM::MyClass->foo(\$value);

Array Type Argument

byte[] Type Argument

A Perl array reference(or undef) is converted to a value of the byte[] type by the "new_byte_array" method.

Exceptions:

Exceptions thrown by the "new_byte_array" method are thrown.

Examples:

  # Converts a Perl array reference to the byte[] type
  SPVM::MyClass->foo([1, 2, 3]);

short[] Type Argument

A Perl array reference(or undef) is converted to a value of the short[] type by the "new_short_array" method.

Exceptions:

Exceptions thrown by the "new_short_array" method are thrown.

Examples:

  # Converts a Perl array reference to the short[] type
  SPVM::MyClass->foo([1, 2, 3]);

int[] Type Argument

A Perl array reference(or undef) is converted to a value of the int[] type by the "new_int_array" method.

Exceptions:

Exceptions thrown by the "new_int_array" method are thrown.

Examples:

  # Converts a Perl array reference to the int[] type
  SPVM::MyClass->foo([1, 2, 3]);

long[] Type Argument

A Perl array reference(or undef) is converted to a value of the long[] type by the "new_long_array" method.

Exceptions:

Exceptions thrown by the "new_long_array" method are thrown.

Examples:

  # Converts a Perl array reference to the long[] type
  SPVM::MyClass->foo([1, 2, 3]);

float[] Type Argument

A Perl array reference(or undef) is converted to a value of the float[] type by the "new_float_array" method.

Exceptions:

Exceptions thrown by the "new_float_array" method are thrown.

Examples:

  # Converts a Perl array reference to float[] type
  SPVM::MyClass->foo([1.2, 2.3, 3.4]);

double[] Type Argument

A Perl array reference(or undef) is converted to a value of the double[] type by the "new_double_array" method.

Exceptions:

Exceptions thrown by the "new_double_array" method are thrown.

Examples:

  # Converts a Perl array reference to the double[] type
  SPVM::MyClass->foo([1.2, 2.3, 3.4]);

string[] Type Argument

A Perl array reference(or undef) is converted to a value of the string[] type by the "new_string_array" method.

Exceptions:

Exceptions thrown by the "new_string_array" method are thrown.

Examples:

  # Converts a Perl array reference to the string[] type
  SPVM::MyClass->foo(["あい", "うえ", "お"]);

Any Object Array Type Argument

A Perl array reference(or undef) is converted to a value of the object[] type by the "new_object_array" method.

Exceptions:

Exceptions thrown by the "new_object_array" method are thrown.

Class Array Type Argument

A Perl array reference(or undef) is converted to a value of the class type by the "new_object_array" method.

Exceptions:

Exceptions thrown by the "new_object_array" method are thrown.

Interface Array Type Argument

A Perl array reference(or undef) is converted to a value of the interface type by the "new_object_array" method.

Exceptions:

Exceptions thrown by the "new_object_array" method are thrown.

Multi-Numeric Array Type Argument

A Perl array reference(or undef) is converted to a value of the multi-numeric array type by the "new_mulnum_array" method.

Exceptions:

Exceptions thrown by the "new_mulnum_array" method are thrown.

Examples:

  # Converts a Perl array reference of a hash reference to the Complex_2d[] type
  SPVM::MyClass->foo([{re => 1.2, im => 2.3}, {re => 3.4, im => 4.5}]);

Multi-Dimensional Array Type Argument

A Perl array reference(or undef) is converted to a value of the multi-dimensional array type by the "new_muldim_array" method.

Exceptions:

Exceptions thrown by the "new_muldim_array" method are thrown.

Return Value Conversion

An SPVM return value is converted to a Perl value according to the SPVM type.

void Type Return Value

The SPVM void return value is converted to Perl undef.

byte Type Return Value

A value of the SPVM byte type is converted to a Perl scalar using the newSViv perlapi.

short Type Return Value

A value of the SPVM short type is converted to a Perl scalar using the newSViv perlapi.

int Type Return Value

A value of the SPVM float type is converted to a Perl scalar using the newSViv perlapi.

long Type Return Value

A value of the SPVM float type is converted to a Perl scalar using the newSViv perlapi.

float Type Return Value

A value of the SPVM float type is converted to a Perl scalar using the newSVnv perlapi.

double Type Return Value

A value of the SPVM double type is converted to a Perl scalar using the newSVnv perlapi.

string Type Return Value

If the SPVM return value is undef, it is converted to Perl undef.

Otherwise it is converted to a SPVM::BlessedObject::String object.

Multi-Numeric Type Return Value

The value of the SPVM multi-numeric type is converted to a Perl hash reference that has the field names of the multi-numeric type as the keys.

Each field value is converted by the conversion of "byte Type Return Value", "short Type Return Value", "int Type Return Value", "long Type Return Value", "float Type Return Value", "double Type Return Value" according to the multi-numeric type.

Any Object Type Return Value

If the SPVM return value is undef, it is converted to Perl undef.

If the type of the return value is an array type, it is converted to a SPVM::BlessedObject::Array object.

If the type of the return value is an string type, it is converted to a SPVM::BlessedObject::String object.

Otherwise it is converted to a SPVM::BlessedObject::Class object.

Class Type Return Value

If the SPVM return value is undef, it is converted to Perl undef.

Otherwise it is converted to a SPVM::BlessedObject::Class object.

Interface Type Return Value

If the SPVM return value is undef, it is converted to Perl undef.

Otherwise it is converted to a SPVM::BlessedObject::Class object.

Array Type Return Value

If the SPVM return value is undef, it is converted to Perl undef.

Otherwise it is converted to a SPVM::BlessedObject::Array object.

Copyright & License

Copyright (c) 2023 Yuki Kimoto

MIT License