タグ

xsに関するkamipoのブックマーク (59)

  • 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
  • gdbでxsをデバッグ - フリーフォーム フリークアウト

    移転しました http://please-sleep.cou929.nu/20090805.html

    gdbでxsをデバッグ - フリーフォーム フリークアウト
  • 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::Object::Magic をつかって Magic なオブジェクトをあつかうの法 - tokuhirom's blog

    マルチスレッドで云々とかかんがえないでよいケースでは、XS::Object::Magic をつかうと楽にできる。 xs/typemap というファイルに以下の内容をコピペする。 TYPEMAP MyStruct * T_PTROBJ_MG INPUT T_PTROBJ_MG $var = ($type)xs_object_magic_get_struct_rv_pretty(aTHX_ $arg, \"$var\");xs_object_magic.h を http://frepan.64p.org/src/NUFFIN/XS-Object-Magic-0.02/xs_object_magic.h このへんとかからとってきて、おく。 あとは、普通に XS をかけばいい。magic まわりの諸々は隠蔽されているので、気にする必要がない。 #include "xshelper.h" #incl

    kamipo
    kamipo 2011/01/12
  • 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
  • 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)
    kamipo
    kamipo 2010/09/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