SPVMエクスチェンジAPI仕様 1.0ベータ

SPVMドキュメント > SPVMエクスチェンジAPI仕様

SPVMエクスチェンジAPI仕様

SPVMエクスチェンジAPI仕様がこのドキュメントには記述されています。SPVMは、1.0のリリースに向けて、ベータテスト中です。SPVMエクスチェンジAPI仕様は、警告なく変更されることがあります。

最終更新日 2019年5月14日

目次

SPVMエクスチェンジAPIとは

SPVMエクスチェンジAPIとは、PerlとSPVMのデータ構造を変換、PerlからSPVMのサブルーチンを呼び出すためのAPIのことです。

SPVMで作成されたモジュールは、コンパイル終了後に、Perlのモジュールとして、そのまま実行できるようになります。

Perlのデータ構造をSPVMのデータ構造に変換する

Perlのスカラ値をSPVMのSPVM::Byte型に変換 - SPVM::Byte->new

Perlのスカラ値をSPVMのSPVM::Byte型に変換するには、SPVM::Byte->newメソッドを使います。

my $spvm_byte = SPVM::Byte->new(98);

Perlのスカラ値は、Perlのスカラ値をSPVMの数値型に変換する規則よって、SPVMのbyte型に変換され、その値が、SPVM::Byteのnewメソッドに渡され、SPVM::Byte型のオブジェクトが返されます。

Perlのスカラ値をSPVMのSPVM::Short型に変換 - SPVM::Short->new

Perlのスカラ値をSPVMのSPVM::Short型に変換するには、SPVM::Short->newメソッドを使います。

my $spvm_short = SPVM::Short->new(9800);

Perlのスカラ値は、Perlのスカラ値をSPVMの数値型に変換する規則よって、SPVMのshort型に変換され、その値が、SPVM::Shortのnewメソッドに渡され、SPVM::Short型のオブジェクトが返されます。

Perlのスカラ値をSPVMのSPVM::Int型に変換 - SPVM::Int->new

Perlのスカラ値をSPVMのSPVM::Int型に変換するには、SPVM::Int->newメソッドを使います。

my $spvm_int = SPVM::Int->new(100000);

Perlのスカラ値は、Perlのスカラ値をSPVMの数値型に変換する規則によって、SPVMのint型に変換され、その値が、SPVM::Intのnewメソッドに渡され、SPVM::Int型のオブジェクトが返されます。

Perlのスカラ値をSPVMのSPVM::Long型に変換 - SPVM::Long->new

Perlのスカラ値をSPVMのSPVM::Long型に変換すると、SPVM::Long->newメソッドを使います。

my $spvm_long = SPVM::Long->new(98);

Perlのスカラ値は、Perlのスカラ値をSPVMの数値型に変換する規則によって、SPVMのlong型に変換され、その値が、SPVM::Longのnewメソッドに渡され、SPVM::Long型のオブジェクトが返されます。

Perlのスカラ値をSPVMのSPVM::Float型に変換 - SPVM::Float->new

Perlのスカラ値をSPVMのSPVM::Float型に変換するには、SPVM::Float->newメソッドを使います。

my $spvm_float = SPVM::Float->new(2.5);

Perlのスカラ値は、Perlのスカラ値をSPVMの数値型に変換する規則によって、SPVMのfloat型に変換され、その値が、SPVM::Floatのnewメソッドに渡され、SPVM::Float型のオブジェクトが返されます。

Perlのスカラ値をSPVMのSPVM::Double型に変換 - SPVM::Double->new

Perlのスカラ値をSPVMのSPVM::Double型に変換するには、SPVM::Double->newメソッドを使います。

my $spvm_double = SPVM::Double->new(2.5);

Perlのスカラ値は、Perlのスカラ値をSPVMの数値型に変換する規則によって、SPVMのdouble型に変換され、その値が、SPVM::Doubleのnewメソッドに渡され、SPVM::Double型のオブジェクトが返されます。

Perlの配列リファレンスをSPVMのbyte[]型に変換 - SPVM::new_barray

Perlの配列リファレンスをSPVMのbyte[]型に変換するには、SPVM::new_barray関数を使います。

my $spvm_nums = SPVM::new_barray([1, 2, 3]);

第一引数に配列リファレンスを受け取ります。

配列リファレンスのそれぞれの要素の値は、Perlのスカラ値から、Perlのスカラ値をSPVMの数値型に変換する規則によって、SPVMのbyte型に変換されます。

戻り値は、SPVMの「byte[]」型を表現した「SPVM::Data::Array」オブジェクトです。

第一引数が未定義値だった場合は、未定義値が返ります。

Perlの配列リファレンスをSPVMのshort[]型に変換

Perlの配列リファレンスをSPVMのshort[]型に変換するには、SPVM::new_sarray関数を使います。

my $spvm_nums = SPVM::new_sarray([1, 2, 3]);

第一引数に配列リファレンスを受け取ります。

配列リファレンスのそれぞれの要素の値は、Perlのスカラ値から、Perlのスカラ値をSPVMの数値型に変換する規則によって、SPVMのshort型に変換されます。

戻り値は、SPVMの「short[]」型を表現した「SPVM::Data::Array」オブジェクトです。

第一引数が未定義値だった場合は、未定義値が返ります。

Perlの配列リファレンスをSPVMのint[]型に変換

Perlの配列リファレンスをSPVMのint[]型に変換するには、SPVM::new_iarray関数を使います。

my $spvm_nums = SPVM::new_iarray([1, 2, 3]);

第一引数に配列リファレンスを受け取ります。

配列リファレンスのそれぞれの要素の値は、Perlのスカラ値から、Perlのスカラ値をSPVMの数値型に変換する規則によって、SPVMのint型に変換されます。

戻り値は、SPVMの「int[]」型を表現した「SPVM::Data::Array」オブジェクトです。

第一引数が未定義値だった場合は、未定義値が返ります。

Perlの配列リファレンスをSPVMのlong[]型に変換

Perlの配列リファレンスをSPVMのlong[]型に変換するには、SPVM::new_larray関数を使います。

my $spvm_nums = SPVM::new_larray([1, 2, 3]);

第一引数に配列リファレンスを受け取ります。

配列リファレンスのそれぞれの要素の値は、Perlのスカラ値から、perlapiとC99の型変換による以下の変換によって、SPVMのlong型に変換されます。

(int64_t)SvIV(perl_value)

戻り値は、SPVMの「long[]」型を表現した「SPVM::Data::Array」オブジェクトです。

第一引数が未定義値だった場合は、未定義値が返ります。

Perlの配列リファレンスをSPVMのfloat[]型に変換

Perlの配列リファレンスをSPVMのfloat[]型に変換するには、SPVM::new_farray関数を使います。

my $spvm_nums = SPVM::new_farray([1, 2, 3]);

第一引数に配列リファレンスを受け取ります。

配列リファレンスのそれぞれの要素の値は、Perlのスカラ値から、perlapiとC99の型変換による以下の変換によって、SPVMのfloat型に変換されます。

(float)SvNV(perl_value)

戻り値は、SPVMの「float[]」型を表現した「SPVM::Data::Array」オブジェクトです。

第一引数が未定義値だった場合は、未定義値が返ります。

Perlの配列リファレンスをSPVMのdouble[]型に変換

Perlの配列リファレンスをSPVMのdouble[]型に変換するには、SPVM::new_darray関数を使います。

my $spvm_nums = SPVM::new_darray([1, 2, 3]);

第一引数に配列リファレンスを受け取ります。

配列リファレンスのそれぞれの要素の値は、Perlのスカラ値から、perlapiとC99の型変換による以下の変換によって、SPVMのdouble型に変換されます。

(double)SvNV(perl_value)

戻り値は、SPVMの「double[]」型を表現した「SPVM::Data::Array」オブジェクトです。

第一引数が未定義値だった場合は、未定義値が返ります。

Perlの配列リファレンスをSPVMのオブジェクトの配列型に変換 - SPVM::new_oarray

Perlの配列リファレンスをSPVMのオブジェクトの配列型に変換するには、SPVM::new_oarray関数を使います。

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

第一引数は、型名を指定します。これは、存在する基本型を要素とする配列型でなければなりません。そうでない場合は、例外が発生します。

第二引数は、Perlの配列リファレンスです。要素は、SPVMのオブジェクト型を表現した「SPVM::Data」を継承しているオブジェクトか、未定義値でなければなりません。そうでない場合は、例外が発生します。

戻り値は、SPVMの配列型を表現した「SPVM::Data::Array」オブジェクトです。

多次元配列を生成することもできます。

my $object1 = SPVM::new_iarray([1, 2, 3]);
my $object2 = SPVM::new_iarray([4, 5, 6]);
my $oarray = SPVM::new_oarray("int[][]", [$object1, $object2]);

Perlの配列リファレンスをSPVMの値の配列型に変換 - SPVM::new_varray

Perlの配列リファレンスをSPVMの値の配列型に変換するには、SPVM::new_varray関数を使用します。

    my $perl_values = [
      {x => 0, y => 1, z => 2},
      {x => 3, y => 4, z => 5},
      {x => 6, y => 7, z => 8},
    ];
    my $spvm_value_array = SPVM::new_varray("TestCase::Point_3i[]", $values);

第一引数は、SPVMの値の配列型を指定します。

第二引数は、ハッシュリファレンスを要素に持つ、配列リファレンスです。ハッシュのリファレンスのキーには、値型のすべてのフィールドの値が含まれていなければなりません。そうでない場合は、例外が発生します。

戻り値は、SPVMの値の配列型を表現した「SPVM::Data::Array」オブジェクトです。

ハッシュリファレンスに含まれる値は、Perlのスカラ値をSPVMの数値型に変換する規則によって、変換されます。

いくつかのサンプルです。

# new_varray - byte
{
  my $values = [
    {x => 0, y => 1, z => 2},
    {x => 3, y => 4, z => 5},
    {x => 6, y => 7, z => 8},
  ];
  my $spvm_value_array = SPVM::new_varray("TestCase::Point_3b[]", $values);
}

# new_varray - short
{
  my $values = [
    {x => 0, y => 1, z => 2},
    {x => 3, y => 4, z => 5},
    {x => 6, y => 7, z => 8},
  ];
  my $spvm_value_array = SPVM::new_varray("TestCase::Point_3s[]", $values);
}

# new_varray - int
{
  my $values = [
    {x => 0, y => 1, z => 2},
    {x => 3, y => 4, z => 5},
    {x => 6, y => 7, z => 8},
  ];
  my $spvm_value_array = SPVM::new_varray("TestCase::Point_3i[]", $values);
}

# new_varray - long
{
  my $values = [
    {x => 0, y => 1, z => 2},
    {x => 3, y => 4, z => 5},
    {x => 6, y => 7, z => 8},
  ];
  my $spvm_value_array = SPVM::new_varray("TestCase::Point_3l[]", $values);
}

# new_varray - float
{
  my $values = [
    {x => 0, y => 1, z => 2},
    {x => 3, y => 4, z => 5},
    {x => 6, y => 7, z => 8},
  ];
  my $spvm_value_array = SPVM::new_varray("TestCase::Point_3f[]", $values);
}

# new_varray - double
{
  my $values = [
    {x => 0, y => 1, z => 2},
    {x => 3, y => 4, z => 5},
    {x => 6, y => 7, z => 8},
  ];
  my $spvm_value_array = SPVM::new_varray("TestCase::Point_3d[]", $values);
  ok(TestCase::ExchangeAPI->spvm_new_varray_double($spvm_value_array));
  my $out_values = $spvm_value_array->to_elems;
  is_deeply($out_values, $values);
}

Perlのバイナリ列をSPVMのbyte[]型に変換 - SPVM::new_barray_from_bin

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

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

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

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

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

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

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の値の配列型に変換 - SPVM::new_varray_from_bin

Perlのパックされたバイナリを、SPVMの値の配列型に変換するには、SPVM::new_varray_from_bin関数を使用します。

    my $binary = pack('l9', ($INT_MIN, 1, 2), (3, 4, 5), (6, 7, 8));
    my $spvm_value_array = SPVM::new_varray_from_bin("TestCase::Point_3i[]", $binary);

第一引数は、Perlのパックされたバイナリを指定します。バイナリの長さは、値型のフィールドの個数とフィールド幅をかけたもので、割り切れる必要があります。そうでない場合は、例外が発生します。

第二引数は、SPVMの値の配列型を指定します。

戻り値は、SPVMの値の配列型を表現した「SPVM::Data::Array」オブジェクトです。返される配列の長さは、バイナリの長さを、値型のフィールドの個数とフィールド幅をかけたもので、割った長さになります。

いくつかのサンプルです。

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

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

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

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

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

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

第一引数は、SPVMの値の配列型を指定します。

第二引数は、ハッシュリファレンスを要素に持つ、配列リファレンスです。ハッシュのリファレンスのキーには、値型のすべてのフィールドの値が含まれていなければなりません。そうでない場合は、例外が発生します。

PerlのハッシュリファレンスをSPVMのSPVM::Hash型に変換 - SPVM::hash

PerlのハッシュリファレンスをSPVMのSPVM::Hash型に変換するにはSPVM::hash関数を使用します。

my $perl_hash_ref = {x => SPVM::Int->new(1), y => SPVM::Double->new(2.5)};
my $spvm_hash = SPVM::hash($perl_hash_ref);

ハッシュのキーは、UTF-8にエンコードされます。値は、SPVM::Dataオブジェクトか、そのサブクラスである必要があります。そうでない場合は、例外が発生します。

SPVMのデータ構造をPerlのデータ構造に変換する

SPVMの配列をPerlの配列リファレンスに変換 - to_elems

SPVMの配列をPerlの配列リファレンスに変換するにはSPVM::Data::Arrayのto_elemsメソッドを使用します。

my $perl_array_ref = $spvm_array->to_elems;

SPVMの配列の要素が、数値型である場合は、SPVMの数値型をPerlのスカラ値に変換する規則によって変換されます。

SPVMの配列の要素が、オブジェクト型である場合は、対応するSPVM::Dataあるいは、そのサブクラスが作成されます。

SPVMの配列の要素が、値型である場合は、フィールドのキーと値を持つ、ハッシュリファレンスが作成されます。値は、SPVMの数値型をPerlのスカラ値に変換する規則によって変換されます。

SPVMの配列の要素が、未定義値である場合は、Perlの未定義値に変換されます。

SPVMの配列をPerlのバイナリ列に変換 - to_bin

SPVMの配列をPerlのバイナリ列に変換るにはSPVM::Data::Arrayのto_binメソッドを使用します。

my $perl_binary = $spvm_array->to_bin;

SPVMの配列が、数値の配列型、あるいは、値の配列型である場合は、SPVMにおけるバイナリ表現が、そのままスカラ変数にコピーされます。

SPVMの配列がそれ以外の型である場合は、例外が発生します。

SPVMの文字列をPerlの文字列に変換 - to_str

SPVMの文字列をPerlの文字列に変換するにはSPVM::Data::Arrayのto_strメソッドを使用します。

my $perl_array_ref = $spvm_array->to_str;

SPVMの型がbyte[]型あるいはstring型である場合は、PerlのUTF-8でデコードされた文字列に変換されます。

SPVMのデータが未定義値である場合は、Perlの未定義値に変換されます。

SPVMのデータが、上記以外の型である場合は、例外が発生します。

SPVMの文字列の配列をPerlの文字列の配列リファレンスに変換 - to_strs

SPVMの文字列の配列をPerlの文字列の配列リファレンスに変換するにはSPVM::Data::Arrayのto_strsメソッドを使用します。

my $perl_array_ref = $spvm_array->to_strs;

SPVMの型がbyte[][]型あるいはstring[]型である場合は、PerlのUTF-8でデコードされた文字列の配列のリファレンスに変換されます。

SPVMの配列型の要素が未定義値であった場合は、Perlの未定義値に変換されます。

SPVMのデータが、上記以外の型である場合は、例外が発生します。

ユーティリティ

その他のユーティリティです。

SPVMの例外の取得 - exception

SPVMの例外を取得します。取得される文字列は、undefでなかった場合は、UTF-8とみなしてデコードされた文字列です。

my $exception = SPVM::exception();

Perlの文字列をSPVMのbyte[]型に変換 - SPVM::new_barray_from_str

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の文字列を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の例外の設定 - set_exception

SPVMの例外を設定します。引数は、デコードされた文字列かundefを指定します。

SPVM::set_exception("あいう");
SPVM::set_exception(undef);

確保されたメモリブロックの数を取得 - memory_blocks_count

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

Perlのスカラ値をSPVMの数値型に変換する規則

Perlのスカラ値をSPVMの数値型に変換する規則は以下で定義されます。

変換規則は、C言語で記述されます。SvIVとSvNVは、perlapiで定義された関数です。int8_t, int16_t, int32_t, int64_t, float, doubleは、C99で定義されている型です。

Perlのスカラ値をSPVMのbyte型に変換

(int8_t)SvIV(perl_value)

Perlのスカラ値をSPVMのshort型に変換

(int16_t)SvIV(perl_value)

Perlのスカラ値をSPVMのint型に変換

(int32_t)SvIV(perl_value)

Perlのスカラ値をSPVMのlong型に変換

(int64_t)SvIV(perl_value)

Perlのスカラ値をSPVMのfloat型に変換

(float)SvNV(perl_value)

Perlのスカラ値をSPVMのdouble型に変換

(double)SvNV(perl_value)

SPVMの数値型をPerlのスカラ値に変換する規則

Perlのスカラ値をSPVMの数値型に変換する規則は以下で定義されます。

変換規則は、C言語で記述されます。newSVivとnewSVnvは、perlapiで定義された関数です。int8_t, int16_t, int32_t, int64_t, float, doubleは、C99で定義されている型です。

SPVMの値は、コードのサンプルでは、不定になっていますが、値が入っているものと考えて下さい。

Perlのスカラ値をSPVMのbyte型に変換

int8_t spvm_value;
newSViv(spvm_value)

Perlのスカラ値をSPVMのshort型に変換

int16_t spvm_value;
newSViv(spvm_value)

Perlのスカラ値をSPVMのint型に変換

int32_t spvm_value;
newSViv(spvm_value)

Perlのスカラ値をSPVMのlong型に変換

int64_t spvm_value;
newSViv(spvm_value)

Perlのスカラ値をSPVMのfloat型に変換

float spvm_value;
newSVnv(spvm_value)

Perlのスカラ値をSPVMのdouble型に変換

double spvm_value;
newSVnv(spvm_value)