SPVMエクスチェンジAPI仕様がこのドキュメントには記述されています。SPVMは、1.0のリリースに向けて、ベータテスト中です。SPVMエクスチェンジAPI仕様は、警告なく変更されることがあります。
最終更新日 2019年5月4日
SPVMエクスチェンジAPIとは、PerlとSPVMのデータ構造を変換、PerlからSPVMのサブルーチンを呼び出すためのAPIのことです。
SPVMで作成されたモジュールは、コンパイル終了後に、Perlのモジュールとして、そのまま実行できるようになります。
Perlのスカラ値をSPVMのSPVM::Byte型に変換するには、SPVM::Byte->newメソッドを使います。
my $spvm_byte = SPVM::Byte->new(98);
Perlのスカラ値は、perlapiとC99の型変換による以下の変換によって、SPVMのbyte型に変換され、その値が、SPVM::Byteのnewメソッドに渡され、SPVM::Byte型のオブジェクトが返されます。
(int8_t)SvIV(sv_value)
Perlのスカラ値をSPVMのSPVM::Short型に変換するには、SPVM::Short->newメソッドを使います。
my $spvm_short = SPVM::Short->new(9800);
Perlのスカラ値は、perlapiとC99の型変換による以下の変換によって、SPVMのshort型に変換され、その値が、SPVM::Shortのnewメソッドに渡され、SPVM::Short型のオブジェクトが返されます。
(int16_t)SvIV(sv_value)
Perlのスカラ値をSPVMのSPVM::Int型に変換するには、SPVM::Int->newメソッドを使います。
my $spvm_int = SPVM::Int->new(100000);
Perlのスカラ値は、perlapiとC99の型変換による以下の変換によって、SPVMのint型に変換され、その値が、SPVM::Intのnewメソッドに渡され、SPVM::Int型のオブジェクトが返されます。
(int32_t)SvIV(sv_value)
Perlのスカラ値をSPVMのSPVM::Long型に変換すると、SPVM::Long->newメソッドを使います。
my $spvm_long = SPVM::Long->new(98);
Perlのスカラ値は、perlapiとC99の型変換による以下の変換によって、SPVMのlong型に変換され、その値が、SPVM::Longのnewメソッドに渡され、SPVM::Long型のオブジェクトが返されます。
(int64_t)SvIV(sv_value)
Perlのスカラ値をSPVMのSPVM::Float型に変換するには、SPVM::Float->newメソッドを使います。
my $spvm_float = SPVM::Float->new(2.5);
Perlのスカラ値は、perlapiとC99の型変換による以下の変換によって、SPVMのfloat型に変換され、その値が、SPVM::Floatのnewメソッドに渡され、SPVM::Float型のオブジェクトが返されます。
(float)SvNV(sv_value)
Perlのスカラ値をSPVMのSPVM::Double型に変換するには、SPVM::Double->newメソッドを使います。
my $spvm_double = SPVM::Double->new(2.5);
Perlのスカラ値は、perlapiとC99の型変換による以下の変換によって、SPVMのdouble型に変換され、その値が、SPVM::Doubleのnewメソッドに渡され、SPVM::Double型のオブジェクトが返されます。
(double)SvNV(sv_value)
Perlの配列リファレンスをSPVMのbyte[]型に変換するには、SPVM::new_barray関数を使います。
my $spvm_nums = SPVM::new_barray([1, 2, 3]);
第一引数に配列のリファレンスを受け取ります。
配列のリファレンスのそれぞれの要素の値は、Perlのスカラ値から、perlapiとC99の型変換による以下の変換によって、SPVMのbyte型に変換されます。
(int8_t)SvIV(sv_value)
戻り値は、SPVMの「byte[]」型を表現した「SPVM::Data::Array」オブジェクトです。
第一引数が未定義値だった場合は、未定義値が返ります。
Perlの配列リファレンスをSPVMのshort[]型に変換するには、SPVM::new_sarray関数を使います。
my $spvm_nums = SPVM::new_sarray([1, 2, 3]);
第一引数に配列のリファレンスを受け取ります。
配列のリファレンスのそれぞれの要素の値は、Perlのスカラ値から、perlapiとC99の型変換による以下の変換によって、SPVMのshort型に変換されます。
(int16_t)SvIV(sv_value)
戻り値は、SPVMの「short[]」型を表現した「SPVM::Data::Array」オブジェクトです。
第一引数が未定義値だった場合は、未定義値が返ります。
Perlの配列リファレンスをSPVMのint[]型に変換するには、SPVM::new_iarray関数を使います。
my $spvm_nums = SPVM::new_iarray([1, 2, 3]);
第一引数に配列のリファレンスを受け取ります。
配列のリファレンスのそれぞれの要素の値は、Perlのスカラ値から、perlapiとC99の型変換による以下の変換によって、SPVMのint型に変換されます。
(int32_t)SvIV(sv_value)
戻り値は、SPVMの「int[]」型を表現した「SPVM::Data::Array」オブジェクトです。
第一引数が未定義値だった場合は、未定義値が返ります。
Perlの配列リファレンスをSPVMのlong[]型に変換するには、SPVM::new_larray関数を使います。
my $spvm_nums = SPVM::new_larray([1, 2, 3]);
第一引数に配列のリファレンスを受け取ります。
配列のリファレンスのそれぞれの要素の値は、Perlのスカラ値から、perlapiとC99の型変換による以下の変換によって、SPVMのlong型に変換されます。
(int64_t)SvIV(sv_value)
戻り値は、SPVMの「long[]」型を表現した「SPVM::Data::Array」オブジェクトです。
第一引数が未定義値だった場合は、未定義値が返ります。
Perlの配列リファレンスをSPVMのfloat[]型に変換するには、SPVM::new_farray関数を使います。
my $spvm_nums = SPVM::new_farray([1, 2, 3]);
第一引数に配列のリファレンスを受け取ります。
配列のリファレンスのそれぞれの要素の値は、Perlのスカラ値から、perlapiとC99の型変換による以下の変換によって、SPVMのfloat型に変換されます。
(float)SvNV(sv_value)
戻り値は、SPVMの「float[]」型を表現した「SPVM::Data::Array」オブジェクトです。
第一引数が未定義値だった場合は、未定義値が返ります。
Perlの配列リファレンスをSPVMのdouble[]型に変換するには、SPVM::new_darray関数を使います。
my $spvm_nums = SPVM::new_darray([1, 2, 3]);
第一引数に配列のリファレンスを受け取ります。
配列のリファレンスのそれぞれの要素の値は、Perlのスカラ値から、perlapiとC99の型変換による以下の変換によって、SPVMのdouble型に変換されます。
(double)SvNV(sv_value)
戻り値は、SPVMの「double[]」型を表現した「SPVM::Data::Array」オブジェクトです。
第一引数が未定義値だった場合は、未定義値が返ります。
Perlのバイナリ列をSPVMのbyte[]型に変換するには、SPVM::new_barray_from_bin関数を使います。
my $perl_binary = pack('c3', 97, 98, 99); my $spvm_byte_array = SPVM::new_barray_from_bin($perl_binary);
第一引数にPerlのバイナリ列を受け取ります。
バイナリ列は、実行環境のバイトオーダーで並んだ8bit符号付整数の並びと解釈されます。長さは、8bit符号付整数として解釈された場合の長さになります。
戻り値は、SPVMの「byte[]」型を表現した「SPVM::Data::Array」オブジェクトです。
第一引数が未定義値だった場合は、未定義値が返ります。
上記のサンプルは、次と同じ意味でもあります。バイナリ列は、8bit符号付整数の並びである場合は、packを使っても、Perlのdecodeされていない文字列でもかまいません。
my $binary = "abc"; my $spvm_byte_array = SPVM::new_barray_from_bin($perl_binary);
Perlのバイナリ列をSPVMのstring型に変換するには、SPVM::new_str_from_bin関数を使います。
my $perl_binary = pack('c3', 97, 98, 99); my $spvm_byte_array = SPVM::new_str_from_bin($perl_binary);
第一引数にPerlのバイナリ列を受け取ります。
バイナリ列は、実行環境のバイトオーダーで並んだ8bit符号付整数の並びと解釈されます。長さは、8bit符号付整数として解釈された場合の長さになります。
戻り値は、SPVMの「byte[]」型を表現した「SPVM::Data::Array」オブジェクトです。SPVMのstring型は実行時にはbyte[]型として扱われます。
第一引数が未定義値だった場合は、未定義値が返ります。
上記のサンプルは、次と同じ意味でもあります。バイナリ列は、8bit符号付整数の並びである場合は、packを使っても、Perlのdecodeされていない文字列でもかまいません。
my $binary = "abc"; my $spvm_byte_array = SPVM::new_barray_from_bin($perl_binary);
この関数は実際には、SPVM::new_barray_from_binのエイリアスです。
Perlのバイナリ列をSPVMのshort[]型に変換するには、SPVM::new_sarray_from_bin関数を使います。
my $perl_binary = pack('s3', 97, 98, 99); my $spvm_short_array = SPVM::new_sarray_from_bin($perl_binary);
第一引数にPerlのバイナリ列を受け取ります。
バイナリ列は、実行環境のバイトオーダーで並んだ16bit符号付整数の並びと解釈されます。長さは、16bit符号付整数として解釈された場合の長さになります。
戻り値は、SPVMの「short[]」型を表現した「SPVM::Data::Array」オブジェクトです。
第一引数が未定義値だった場合は、未定義値が返ります。
Perlのバイナリ列をSPVMのint[]型に変換するには、SPVM::new_iarray_from_bin関数を使います。
my $perl_binary = pack('l3', 97, 98, 99); my $spvm_int_array = SPVM::new_iarray_from_bin($perl_binary);
第一引数にPerlのバイナリ列を受け取ります。
バイナリ列は、実行環境のバイトオーダーで並んだ32bit符号付整数の並びと解釈されます。長さは、32bit符号付整数として解釈された場合の長さになります。
戻り値は、SPVMの「int[]」型を表現した「SPVM::Data::Array」オブジェクトです。
第一引数が未定義値だった場合は、未定義値が返ります。
Perlのバイナリ列をSPVMのlong[]型に変換するには、SPVM::new_larray_from_bin関数を使います。
my $perl_binary = pack('q3', 97, 98, 99); my $spvm_long_array = SPVM::new_larray_from_bin($perl_binary);
第一引数にPerlのバイナリ列を受け取ります。
バイナリ列は、実行環境のバイトオーダーで並んだ64bit符号付整数の並びと解釈されます。長さは、64bit符号付整数として解釈された場合の長さになります。
戻り値は、SPVMの「long[]」型を表現した「SPVM::Data::Array」オブジェクトです。
第一引数が未定義値だった場合は、未定義値が返ります。
Perlのバイナリ列をSPVMのfloat[]型に変換するには、SPVM::new_farray_from_bin関数を使います。
my $perl_binary = pack('f3', 0.5, 1.5, 2.5); my $spvm_float_array = SPVM::new_farray_from_bin($perl_binary);
第一引数にPerlのバイナリ列を受け取ります。
バイナリ列は、実行環境のバイトオーダーで並んだ32bit浮動小数点の並びと解釈されます。長さは、32bit浮動小数点として解釈された場合の長さになります。
戻り値は、SPVMの「float[]」型を表現した「SPVM::Data::Array」オブジェクトです。
第一引数が未定義値だった場合は、未定義値が返ります。
Perlのバイナリ列をSPVMのdouble[]型に変換するには、SPVM::new_darray_from_bin関数を使います。
my $perl_binary = pack('f3', 0.5, 1.5, 2.5); my $spvm_double_array = SPVM::new_darray_from_bin($perl_binary);
第一引数にPerlのバイナリ列を受け取ります。
バイナリ列は、実行環境のバイトオーダーで並んだ32bit浮動小数点の並びと解釈されます。長さは、32bit浮動小数点として解釈された場合の長さになります。
戻り値は、SPVMの「double[]」型を表現した「SPVM::Data::Array」オブジェクトです。
第一引数が未定義値だった場合は、未定義値が返ります。
Perlの文字列をSPVMのbyte[]型に変換するには、SPVM::new_barray_from_str関数を使います。Perlの文字列は、ここではデコードされた文字列を指します。
use utf8; my $spvm_byte_array = SPVM::new_barray_from_str("あいうえお");
第一引数にPerlの文字列を受け取ります。Perlの文字列は、ここではデコードされた文字列を指します。
長さは、UTF-8として、バイト列を数えた場合の長さになります。
戻り値は、SPVMの「byte[]」型を表現した「SPVM::Data::Array」オブジェクトです。
第一引数が未定義値だった場合は、未定義値が返ります。
Perlの文字列をSPVMのstring型に変換するには、SPVM::new_str関数を使います。Perlの文字列は、ここではデコードされた文字列を指します。
use utf8; my $spvm_string = SPVM::new_str("あいうえお");
第一引数にPerlの文字列を受け取ります。
長さは、UTF-8として、バイト列を数えた場合の長さになります。
戻り値は、SPVMの「byte[]」型を表現した「SPVM::Data::Array」オブジェクトです。SPVMのstring型は実行時にはbyte[]型として扱われます。
第一引数が未定義値だった場合は、未定義値が返ります。
この関数は実際には、SPVM::new_barray_from_strのエイリアスです。
その他のユーティリティです。
SPVMの例外を取得します。取得される文字列は、undefでなかった場合は、UTF-8とみなしてデコードされた文字列です。
my $exception = SPVM::exception();
SPVMの例外を設定します。引数は、デコードされた文字列かundefを指定します。
SPVM::set_exception("あいう"); SPVM::set_exception(undef);
memory_blocks_count関数を使うと、確保されたメモリブロックの数を取得できます。
my $count = SPVM::memory_blocks_count();
SPVMランタイムは、オブジェクトを生成するとき、ウィークリファレンスを新しく作成するときに、ヒープからメモリを確保します。一回のメモリ取得の操作によって確保されたメモリをメモリブロックと呼びます。
SPVMは、リファレンスカウント式のGCを持っており、通常は、メモリの確保と解放については、意識する必要がありませんが、ネイティブでサブルーチンを記述するときは、メモリリークが起こっていないことを試験で確認したいという場合があるでしょう。
# 最初のメモリブロックカウント my $start_memory_blocks_count = SPVM::memory_blocks_count(); # 処理 # ... # 最後のメモリブロックカウント my $end_memory_blocks_count = SPVM::memory_blocks_count(); unless ($end_memory_blocks_count == $start_memory_blocks_count) { die "Memroy leak"; }