タグ

関連タグで絞り込む (1)

タグの絞り込みを解除

xsに関するhisaichi5518のブックマーク (24)

  • What does call_sv() return? - Islands in the byte stream (legacy)

    call_sv()の戻り値を正確に把握していないがために、Xslate で厄介なバグを引き起こしてしまった*1。具体的には、call_sv()でG_VOIDを指定すると常に1を返すと思い込んでいた。しかし、それは間違いだった。 検証: https://github.com/gfx/p5-XS-CallSV #!perl -w use strict; use Test::More; use B qw(/^G_/); use XS::SvCallTest; sub empty_pp { } sub return_empty_pp { return } sub return2_pp { return(10, 20) } sub fatal { die } note 'G_VOID'; is call_sv(\&empty_pp, G_VOID), 0; is call_sv(\&return_e

    What does call_sv() return? - Islands in the byte stream (legacy)
  • Perlゼミ(サンプルコードPerl入門)

    Perl入学式 全6回のPerl入門講座。東京、大阪、沖縄、札幌で開催。(東京は4月と10月スタート、それ以外は5月スタート) YAPC::Japan Perlを軸としたITに関わる全ての人のためのカンファレンス。 東京 吉祥寺.pm 五反田.pm 大阪 なにわPerl 沖縄 沖縄.pm

  • Perlゼミ(サンプルコードPerl入門)

    Perl入学式 全6回のPerl入門講座。東京、大阪、沖縄、札幌で開催。(東京は4月と10月スタート、それ以外は5月スタート) YAPC::Japan Perlを軸としたITに関わる全ての人のためのカンファレンス。 東京 吉祥寺.pm 五反田.pm 大阪 なにわPerl 沖縄 沖縄.pm

  • Perl XSにおけるデータ操作のためのAPI - サンプルコードPerl入門

    Perl › XS › here perlapiとはXSでPerlのデータを操作するための公式APIで、C言語で書かれたマクロや関数のことです。 出力、スカラ、標準入出力 PerlとXS(C言語)のAPIの対応がわかるとXSがわかりやすそうだ。 標準出力への出力 #Perl print "Hello"; # XS PerlIO_printf(PerlIO_stdout(), "Hello"); PerlIO_printfはC標準ライブラリのprintfにあたる関数。第一引数はPerlIO*型の変数、第二引数はchar*型の変数。標準出力はPerlIO_stdout関数で取得できる。XSでは標準入出力Cの標準ライブラリは使わずに、Perlで用意されている関数を使う。これはperlapioというドキュメントに詳しく乗せられている。 文字列 #Perl my $str = "Hello"; #

    Perl XSにおけるデータ操作のためのAPI - サンプルコードPerl入門
  • XSでCの文字列操作関数を使用するべきでない理由 - Islands in the byte stream (legacy)

    またはRe: PerlとC言語の型に対応する値への相互変換 XSでCの文字列操作関数の使用はなるべく避けるべきです。Cの文字列操作関数は危険で使いにくいものです。その代わりに、Perlが提供する安全で使いやすいSV APIを使ったほうが余計なことを考えずに済みます。 まずC言語でプログラミングする際の一般論として、strcat()やsprintf()などの文字列長を制御できない関数を使用するべきではない、というものがあります。これらの関数を使用して安全なプログラミングをするのは非常に困難であり、代わりにstrncat()やstrlcat()、あるいはsnprintf()といった文字列長を制御できる関数を使うべきです。 またPerl/XSに関して言うならば、そもそもCの文字列操作関数を使う必要はほとんどありません*1。char*の代わりにSV*を使うようにし、なるべくPerl API で文字

    XSでCの文字列操作関数を使用するべきでない理由 - Islands in the byte stream (legacy)
  • Perlゼミ(サンプルコードPerl入門)

    Perl入学式 全6回のPerl入門講座。東京、大阪、沖縄、札幌で開催。(東京は4月と10月スタート、それ以外は5月スタート) YAPC::Japan Perlを軸としたITに関わる全ての人のためのカンファレンス。 東京 吉祥寺.pm 五反田.pm 大阪 なにわPerl 沖縄 沖縄.pm

  • Perl XS入門 - XSの基礎を学ぼう - サンプルコードPerl入門

    Perl › here XSを使ったC/C++のバインディングについて解説します。まず最初に、XSモジュールを作成する方法について解説します。 1. XSモジュールの作成 では実際にXSモジュールを作成してみましょう。XSモジュール作成コマンド、Makefile.PL、makeについて丁寧に解説しています。 XSモジュールを作成する 2. perlapi XSからPerlのデータを操作する方法にについて解説します。PerlはC言語で実装されていますが、Perlの機能をC言語から呼び出すためのAPIがたくさん用意されています。 perlapi - XSにおけるデータ操作のためのAPI 3. Makefile.PL関連 Makefileを生成するために、Perlでは、Makefile.PLというファイルを作って、ExtUtil::MakeMakerというモジュールを使用します。このExtUti

    Perl XS入門 - XSの基礎を学ぼう - サンプルコードPerl入門
  • PresenTitlePlaceHolder

    TopicsPlaceHolder SectionTitlePlaceHolder TIME rest time current/total

  • Tsukuba.xs #1 無事終了! - Islands in the byte stream (legacy)

    Tsukuba.xs #1 Beer Talksですが、主催者が遅刻*1したりマック勢がプロジェクターへつながらなかったりといろいろハプニングはあったものの、無事終えることができました。 会場を提供していただいたリクルートさんありがとうございました! 無茶ぶりにも関わらず楽しいトークをしてくださった竹迫さんにも感謝致します! 私の発表分の資料は以下のURIからどうぞ。 Inside Xslate ちなみに今回のバズワードは「Don't write XS! 」でしたw (by kazuho, charsbar, and miyagawa)。 *1:すみません!

    Tsukuba.xs #1 無事終了! - Islands in the byte stream (legacy)
  • 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の日記
  • 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)
  • 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
  • おさかなラボ - [XS]いよいよMySQLからデータを取り出してハッシュ/配列にぶちこむ

    第5回目です。今回はいよいよキモのMySQLからデータを取り出し、ハッシュリファレンスの配列、のリファレンスにするところです。この手法は良く使うと思います。userとnameからなるテーブルがあったとすると、リザルトセットを次のように変換することで、データをレコードごとにループで処理できるので便利ですよね。今回はこの部分をやります。 [ { user => 1, name='canada' }, { user => 2, name ='osakana' }, { user => 3, name ='lab' }, ] さて、前回反応が悪かったので自分で読み返してみたら読みにくいことこの上なかったので猛省してます。ちょっと例題が悪かったなあ。XSのチュートリアルを書いてるのにmysqlAPIの話に終始するとは……。今回はこのコードの部分です。動作するコード全体は「ここ(MyQue

  • おさかなラボ - [XS]いきなりMySQLにアクセスしてみるよ

    XS第四回です。今回はいきなり75行ほどの長いプログラムを書きました。自分自身が、解説などを読んでいて理論だけ並べられると「それを実践では一体どう使うんだよ!」とキレてしまう方なので、いきなり難しい例題になりますが頑張って見ていきましょう。mysqlへのCインターフェイスをいきなり使うことになるので、分からないところがあったらMySQL家のリファレンスを参照して下さい。 それから、前回、コード中の私的文字列には必ずmy_を前置すると書きましたが、コードが非常に読みづらくなってしまったので止めました。すみません。 今回は、Perlでいうところの、以下の動きと同じ挙動をするプログラムを書いてきます。 use DBI; my $dbh_dbi = DBI->connect('DBI:mysql:database', 'user', pass'); my $sth = $dbh_db

  • おさかなラボ - [XS]Perl変数とPerl構造体の対応について

    当はPVに限った話をがっつりしようと思ったんだけど、順序が思いっきりperlgutsとかぶるので止めました。 繰り返すようですが、XSの中身というのは、始めたばかりの人にとっては何がなんだかさっぱり分からないと思います。特に配列やハッシュやリファレンス、オブジェクトなどはどうやって扱えばいいのか不安に思っている方は多いのではないでしょうか。今日はその話を簡単にします。 これらは、Perl内部では構造体で実現されています。主に次の構造体が用意されています。 SV スカラ値 AV 配列 HV ハッシュ値 RV リファレンス値 構造体って何?っていう人はK&Rを買って読んで下さい。Cの概念です。僕がXSについて書くときは、Cについての一通りの予備知識があることを前提とします。Perlの値には他にもグロブや無名関数などがありますが別項に譲ります。 次に不安なのが、これらの操作でし

  • おさかなラボ - [XS]XSのおさらいとtypemapについて

    前回のXSをとにかく作ってみる編の続編である。どこかに目次のエントリを作るか、Wikiにした方がいいような気がしてきた。今後、自身の学習・復習もかねてXSについて解説していく。対象は取り急ぎperl-5.8.8以上とする。なお、今回は話が思いっきりあさっての方向にそれたので、先にお詫びしておく。 XSとは何か。XSはPerlが用意したAPIに、C/C++でアクセスするためのマクロ言語である。そしてマクロ言語の記述フォーマットの名前である。「PerlAPIを叩くCプログラム」を総じてXSと呼ぶ向きもあるが厳密にはこれは正しくないことは前に述べた。 XSファイルは主に3つのパートに分けられる。Perlから関数として呼び出された時の引数を受け取る処理、そして核となるルーチン、そして演算結果をPerlに返す部分である。しかし引数と戻り値に関しては最初はあまり神経質になる必要はない。これらは大抵

  • おさかなラボ - PerlでXSを使ってみよう

    と思う人は多いと思う。気になっている人は多いだろう。しかし、XSに関する詳細なドキュメントは、ググってみると驚愕するくらい少ない。そして読みにくい。理由は後述する。 私もXSに関するドキュメントを書きたいのだが、カバーする範囲が広大すぎてどこから手を付けたらいいのか全く分からない。が書けそうな勢いだ。エントリを分けて書くのか、既存とは別のチュートリアル文書のようなものを書くのか、悩んでいるところである。その代わり、今回はXSってえる?って人には有用なエントリにしたいと思う。そして簡単なサンプルを書いてみたいと思う。 少々のことなら分かるしググるし大丈夫だぜ!という人は、以下のエントリ、およびリンク先を参照すると良いと思う。 XS by id:naoya まずはXSって何?ってことだが、この時点で何がなんだかさっぱり分からない人が多いと思う。それもそのはず、XSという言葉が包括的

  • にひりずむ::しんぷる - Win32::Unicode を XS 化させてみた

    MSWin32 で Perl を使っている人にしか価値のない Win32::Unicode ですが、ちょっと前に 0.19 をリリースしました。 今回は、cygwin 対応のコードが入ってます。 cygwin では 1.7.1 あたりから、UTF8 が基調となっていますが、それはターミナルだけではなく、Perl でもそうです。恐らく cygwin の API が UTT8 化されたので、 Perl でそいつを呼び出す場合もそうなったんでしょう。(てきとーです) 何はともあれ、最近の cygwin-perl では、Win32::Unicode を使わずとも Unicode ファイルが扱えたりする(CORE::readdir で UTF8 で帰ってきたりする)ので、使う意味はないんですが、とりあえず CPAN-Testers でいつも cygwin がコケてるのでちょろっと対応した次第。まだ

  • XS code template - 動的にXSUBを生成する - エキスパートPerl - Perl-users.jp

    XSコードはふつうPerlコードよりも多機能で高速ですが,書くのが難しいため敷居が高いことも事実です。また,いちいちコンパイルしなければならないのも煩わしい点です。 ところで,Perlにはクロージャという仕組みがあり,動的にコードを生成することができます。したがって,XSでクロージャに等しいことを実現できれば,XSコードの煩わしさを避けつつXSの利益を享受することができます。 なお,この文書はXSによるコード例を解説していますが,XSそのものについては解説しません。 XSについてはperlxstutやperlxs,perlapiを参照してください。 クロージャの分析 まず,Perlのクロージャを分析します。Perlのクロージャは以下のようなものです。 sub make_accessor{ my($name) = @_; return sub{ $_[0]->{$name} }; } my

  • 続・XSのlooks_like_number() - Perl日記

    前回の続き。 ListUtil.xs #if (PERL_VERSION < 8) || (PERL_VERSION == 8 && PERL_SUBVERSION <5) if (SvPOK(sv) || SvPOKp(sv)) { RETVAL = looks_like_number(sv); } else { RETVAL = SvFLAGS(sv) & (SVf_NOK|SVp_NOK|SVf_IOK|SVp_IOK); } #else RETVAL = looks_like_number(sv); #endif OUTPUT: RETVAL C言語のプリプロセッサってどんなんだったけ…?、というレベルの僕です。 参考サイト: 「C言語 プリプロセッサ」 「Yahoo!¥¸¥ª¥·¥Æ¥£¡¼¥º」 ありがとうございます。 #if (PERL_VERSION < 8) || (PE

    続・XSのlooks_like_number() - Perl日記