タグ

xsとperlに関するkamipoのブックマーク (56)

  • PerlXS: sv_2mortal()やhv_store()のこと - EchizenBlog-Zwei

    そろそろXSをちゃんとやろうと思ったので、メモリ周辺のことが良くわからなくて放置していたsv_2mortal()やhv_store()のことについて調べた。 参考: perlguts http://www.kt.rim.or.jp/~kbk/perl5.005/perlguts.html 最初に結論を書いてしまうと [1: sv_2mortal()] - returnしない変数は常にsv_2mortal()を通す (揮発性をもたせる) - SVはreturnするときはsv_2mortal()を通してはダメ - AV, HVはreturnするときもsv_2mortal()を通す [2: newRV_inc()] - リファレンス変数(RV)を作るときはnewRV_inc()を 使い参照カウントをインクリメントしておく (newRV_noinc()はダメ) - リファレンス変数もsv_2mor

    PerlXS: sv_2mortal()やhv_store()のこと - EchizenBlog-Zwei
    kamipo
    kamipo 2012/09/26
  • IV, NV などを B モジュールで調べる - 日向夏特殊応援部隊

    makamaka さんが YAPC Asia 2010 にて発表した XSからPPへ - YAPC::Asia Tokyo 2010 に既に書いてあるんだけど、備忘録を兼ねて。 JSON にする際に違いが出てくる訳ですがまずは論より証拠。 $ perl -MJSON -e 'warn encode_json(+{ foo => 1, bar => "1", baz => 0 + "1" })' {"bar":"1","baz":1,"foo":1} at -e line 1.これらは IV なのか PV なのかばっちり判定してくれる訳ですね。API なんかのユースケースだとこの辺りを厳密にやらねばならないので、この辺りの制御はちゃんとやらないといかんのです。 その前に Devel::Peek で中を見てみると、 $ perl -MDevel::Peek -e 'my $i = "1"; D

    IV, NV などを B モジュールで調べる - 日向夏特殊応援部隊
    kamipo
    kamipo 2011/03/09
  • XSでC++を使おうとしたけど挫折したので教えてクン>< - Kentaro Kuribayashi's blog

    追記 コメントでご教示いただいた通り、とりあえず#include を、ファイルの一番最初にもっていけば、エラーは起こらなくなるようです。id:tokuhiromさん、通りすがりさん、ありがとうございました!!1 C++の勉強がてら、XSでC++ライブラリのバインディングを作ってみようと思いました。しかし、超初歩的なところでつまづいてしまいました……。どうすればいいかさっぱりわからない><。。。そこで偉いひとの降臨を待つことにしました。誰か教えてくれくれクンだお><。。。 概要 MacOSX/Debian双方において、UncoというモジュールのためにUnco.xsを書いてるとして、下記のようにC++ライブラリのヘッダファイルを #include <iostream> とかしてincludeした途端、いろいろうまくいかなくなる。環境については、このエントリの下部に記載。 やったこと 準備する。

    XSでC++を使おうとしたけど挫折したので教えてクン>< - Kentaro Kuribayashi's blog
    kamipo
    kamipo 2010/11/07
  • perlXSでSTLのstd::mapを使ってみる - download_takeshi’s diary

    ここのところC++でコードを書いているんですが、やっぱりそいつをperlから使いたい。 ということでXSについてお勉強中です。 ごく簡単なものなら書けるようになってきましたが「perlから渡したハッシュをC++側でstd::mapとして受け取りたい」といった特殊なケースではまってしまったのでメモっておきます。 いろいろ悩みはしましたが、結論から言うと「hollyなblog」さんのところでまさにドンピシャな記事を書いてくれていたので、これを参考に頑張ってみました。 以下、サンプルコードと実践手順です。 C++コード hashを渡してstd::mapを返すというケースを想定しているので、以下のようなクラスを準備しました。コサイン類似度を計算するコードです。 vector_tool.hとして以下を用意します。 #include <iostream> #include <map> #include

    perlXSでSTLのstd::mapを使ってみる - download_takeshi’s diary
    kamipo
    kamipo 2010/07/09
  • XSでメモリークを避けるたった一つの方法 - Islands in the byte stream (legacy)

    XSでメモリリークを避ける基原則は、それほど難しくない。すなわち、作ったSV(およびSVファミリ)はすぐsv_2mortal()するのである。mortalなSVはスコープ*1から抜けるときに解放されるため、メモリリークは起こらない。つまり、あるスコープ内で新しく作ったすべてのSVをmortalな状態にしておくということだ。 この原則のもとでコードを書くと、誤ってリファレンスカウントを増やさなかったケースでは警告が頻繁に起きる。しかし、少なくともメモリリークは起こらない*2。メモリリークの検出は難しいので、警告が出るのは福音であろう。 もちろんこれは原則で、メモリリークにまつわることで覚えなければならないことは決して少なくない。 たとえば、XSUBの戻り値をSV*にするとき、sv_2mortal(RETVAL)してはいけない。これはPerlの仕様ではなくxsubppが勝手にsv_2mort

    XSでメモリークを避けるたった一つの方法 - Islands in the byte stream (legacy)
    kamipo
    kamipo 2010/06/04
  • XS基礎文法最速マスター - Islands in the byte stream (legacy)

    元ネタ:Perl基礎文法最速マスター(id:perlcodesample) XSを始めるための手順といくつかの要素の解説です。C言語をある程度知っている人でも,これを読んだだけでXSの基礎をマスターしてXSを書くことができるようにはなっていません。リファレンスでもありません。 XSとは,狭義ではPerlでエクステンションを書くためのマクロ言語の名前ですが,広義ではエクステンションを書くための技術の総称です。ここでは,広義のXSを俯瞰します。 XSはいろいろと特殊なのでテンプレは無視で行きます。 目次: h2xsで空のディストリビューションを作る XSファイルの構成 スレッドコンテキスト SVファミリ GCとスコープ さらなる学習のために h2xsで空のディストリビューションを作る 以下のコマンドで空のXSディストリビューションを作ることができます。 h2xs -A -b 5.8.1 -n

    XS基礎文法最速マスター - Islands in the byte stream (legacy)
    kamipo
    kamipo 2010/02/03
  • wakaponさんの超☆痛々しいPerl備忘帳: threads.xsめもめも

    threads.xsで使われているインタプリタスレッドの構造についてまとめたものをめもめ.最初にPerlithreadsの概要について説明してから,管理構造,提供されるメソッド,マジックについて説明していく. 1. Perlのスレッドの概要 Perlのスレッドはインタプリタスレッド(ithreads)と呼ばれる.スレッドのモデルはネイティブスレッドモデルである.1つのインタプリタスレッドは,1つのネイティブスレッド上で実行される.1インタプリタスレッドの親スレッドから指定されたサブルーチンは,インタプリタスレッド上に用意されたインタプリタインスタンスで実行される. スレッド間でのデータ共有は明示的に行う.1つのインタプリタスレッドから新たなスレッドを生成した場合,親スレッドのインタプリタインスタンスの内容がすべて子スレッド中のインタプリタインスタンス内にコピーされる.そのため,明示的に共

  • CFStringRefをSVに変換 - とほほのN88-BASIC日記

    追記: id:tokuhirom先生に添削してもらった。 malloc使うべからず -> NewXX()系でアロケート、SafeFree()で解放すべし(そういえばid:hirose31さんも言ってた) newSVpvの第二引数(STRLEN)は明示的に指定すべし -> 0で自動計算は\0 終端前提 SV * getString(CFStringRef var) { char *buf; SV *sv; CFIndex len = CFStringGetLength(val); CFIndex max = CFStringGetMaximumSizeForEncoding(len, kCFStringEncodingUTF8); buf = Newxz(max + 1); CFStringGetCString(val, buf, max + 1, kCFStringEncodingUTF8

    CFStringRefをSVに変換 - とほほのN88-BASIC日記
    kamipo
    kamipo 2009/08/19
  • はてなグループの終了日を2020年1月31日(金)に決定しました - はてなの告知

    はてなグループの終了日を2020年1月31日(金)に決定しました 以下のエントリの通り、今年末を目処にはてなグループを終了予定である旨をお知らせしておりました。 2019年末を目処に、はてなグループの提供を終了する予定です - はてなグループ日記 このたび、正式に終了日を決定いたしましたので、以下の通りご確認ください。 終了日: 2020年1月31日(金) エクスポート希望申請期限:2020年1月31日(金) 終了日以降は、はてなグループの閲覧および投稿は行えません。日記のエクスポートが必要な方は以下の記事にしたがって手続きをしてください。 はてなグループに投稿された日記データのエクスポートについて - はてなグループ日記 ご利用のみなさまにはご迷惑をおかけいたしますが、どうぞよろしくお願いいたします。 2020-06-25 追記 はてなグループ日記のエクスポートデータは2020年2月28

    はてなグループの終了日を2020年1月31日(金)に決定しました - はてなの告知
    kamipo
    kamipo 2009/08/17
  • tokuhirom blog

    Blog Search when-present<#else>when-missing. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: ${entry.path} [in template "__entry.ftlh" at line 3, column 25] - Reached through: #include "__entry.ftlh" [in template "entry.ftlh" at

    kamipo
    kamipo 2009/08/04
  • Module::Install::XSUtil - Manages XS modules - Islands in the byte stream (legacy)

    Makefile.PLを書くためのビルドユーティリティの一つであるModule::Installは非常に便利だが,XSモジュールのサポートが弱い。 そこで,Module::InstallのプラグインとしてModule::Install::XSUtilを書いてみた。 http://search.cpan.org/dist/Module-Install-XSUtil/ (CPAN) git://github.com/gfx/Perl-Module-Install-XSUtil.git (github) XSモジュールを利用は,Perlから利用する場合とXSから利用する場合の二つの状況がある。ほとんどのXSモジュールはPerlから利用するが,まれにXSからの利用するモジュール(メタXSモジュール)もある。XSUtilはこの二つを両方サポートする。 通常のXSモジュールの場合 XSモジュールでは一

    Module::Install::XSUtil - Manages XS modules - Islands in the byte stream (legacy)
    kamipo
    kamipo 2009/07/30
  • perlxsねた - holly's wiki

    holly's wiki hollyさんのwiki トップページページ一覧メンバー掲示板編集 perlxsねた 最終更新: kurt0027 2011年01月05日(水) 23:57:17履歴 Tweet もう忘れてしまってるのでよくわからん 参考になりそうなところ 私的 XS メモ - IT戦記 v8 (Google JavaScript Engine) を Perl XS モジュールにしてみた - daily dayflower Perl XS メモ - typemap と MAGIC をからめて - daily dayflower 複数ファイルを使った中規模 XS の開発 - daily dayflower XS(とC++)入門したい - はこべにっき# モダンなXSの書き方 - use GFx::WebLog; XSでCの文字列操作関数を使用するべきでない理由 - use GFx:

    perlxsねた - holly's wiki
    kamipo
    kamipo 2009/07/22
  • XSをモジュールなしでロードするには? - clouder's blog

    よくわかってないんだけど、とりあえず動いたので忘れないようにメモ。 (ただしこれはOSX上でのことなので他のOSだとところどこパスなどで違う部分があると思う) 1. hoge.xsを作る 今回は単純にパッケージ名をPACKAGENAMEで、メソッド名methodnameというのが1つあるだけのhoge.xsだとする。 2. xsubppというコマンドでhoge.xsをhoge.cに変換する typemapが必要なのでExtUtilsのパッケージの中のを使う。 % xsubpp -typemap /System/Library/Perl/5.8.8/ExtUtils/typemap hoge.xs > hoge.c 3. hoge.cをコンパイルする前にppport.hというのを生成しておく % perl -MDevel::PPPort -e 'Devel::PPPort::WriteFil

    XSをモジュールなしでロードするには? - clouder's blog
    kamipo
    kamipo 2009/05/20
  • XSで共有文字列を活用する - Islands in the byte stream (legacy)

    Perl 5.8以降には共有文字列というメカニズムがあり,非常に限定的ながら,うまく使用するとメモリと速度の双方を節約できる。 基的な使い方: SV* sv = newSVpvn_share(pv, len, hash); SV* sv = newSVpvs_share("..."); これでsvの文字列部分がインタプリタ全体で共有されるため,同じ文字列を複数個生成してもmalloc(3)は一度で済む。 実際には,共有文字列SVの生成速度そのものは通常の文字列SVよりも遅いことがある。しかし,共有文字列の真価は,ハッシュキーとして使用する際に発揮される。 ハッシュからキーを検索する際にはキーとなる文字列の照合*1を行わなければならないが,共有文字列はポインタ値がインタプリタを通して等しいので,文字列の照合は行わなくてすむ。また,共有化文字列SVは内部にハッシュ値*2を持っているので,ハッ

    XSで共有文字列を活用する - Islands in the byte stream (legacy)
    kamipo
    kamipo 2009/05/09
  • tokuhirom blog

    Blog Search when-present<#else>when-missing. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: ${entry.path} [in template "__entry.ftlh" at line 3, column 25] - Reached through: #include "__entry.ftlh" [in template "entry.ftlh" at

    kamipo
    kamipo 2009/04/28
  • 初めてのDevel::BindPP - とほほのN88-BASIC日記

    Standard C++ foo-bar.cpp #include <iostream> int main () { std::cout << "Hello World"; } $ gcc -o foo-bar foo-bar.cpp -lstdc++ $ foo-bar Hello Wolrd Devel::BindPP $ perl -MDevel::BindPP -e 'use Devel::BindPP::WriteFile()'foo-bar.cpp include <iostream> #include "bindpp.h" XS(xs_hello_world) { std::cout << "Hello World"; } extern "C" { XS(boot_Foo__Bar) { pl::BootstrapCtx bc; pl::Package pkg("Foo::B

    初めてのDevel::BindPP - とほほのN88-BASIC日記
    kamipo
    kamipo 2009/04/28
  • tokuhirom blog

    Blog Search when-present<#else>when-missing. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: ${entry.path} [in template "__entry.ftlh" at line 3, column 25] - Reached through: #include "__entry.ftlh" [in template "entry.ftlh" at

    kamipo
    kamipo 2009/04/16
  • PerlのXSからPerlの関数を簡単に呼び出せるようにしてみた (C++で) - moriyoshiの日記

    Perlの謎APIをwrapして、Perlスクリプトの関数をC++から簡単に呼び出せるようにしてみた。 てか、 リファレンスカウントを透過的に行えるようpimpl形式のコンテナを使ってみる mortalを透過的に行えるようcall_sv()による関数呼び出しを完全にブラックボックス化する って実験をやりたかっただけなのにDevel::BindPPとは完全に別プロダクトになっちゃいました。 test1() は、任意の数の引数を取り、引数の合計値を返す add()という関数 *1 を C++ から呼び出す例。 test2() は、MIME::Base64::encode_base64() を呼び出す例。 test3() は、複数個の値を返す関数を処理する例。 test4() は、perl::value() の演算子オーバロードのテスト。 #include <iostream> #include

    PerlのXSからPerlの関数を簡単に呼び出せるようにしてみた (C++で) - moriyoshiの日記
    kamipo
    kamipo 2009/04/03
  • C++ で Perl 拡張を書くためのモジュールを書いた - TokuLog 改めB日記

    Blog Search when-present<#else>when-missing. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: ${entry.path} [in template "__entry.ftlh" at line 3, column 25] - Reached through: #include "__entry.ftlh" [in template "entry.ftlh" at

  • DynaLoader に関する基礎知識 - tokuhirom's blog

    Perl で XS をよむには DynaLoader か XSLoader をつかうのだが、XSLoader は DynaLoader を簡単によぶためのラッパーにすぎない。いうなれば ExtUtils::MakeMaker にたいする Module::Install のようなものだ。 DLL に対応した perl はDynaLoader をくみこんでいるので、DynaLoader.pm はなくても XS でかかれた部分は普通につかえる。DynaLoader::boot_DynaLoader() すると、DynaLoader::* の関数のうち XS でかかれたものはよべるようにセットアップされる。 DynaLoader の利用を禁止したい場合には、質的な解決策としては、必要な XS module を static link して、dynamic loading を禁止した perl

    kamipo
    kamipo 2009/03/14