SlideShare a Scribd company logo
PHP   in    Ruby
             2012/09/01
           闇PHP勉強会
                 do_aki
@do_aki

http://do-aki.net/
Php in ruby
概要
Php in ruby
Php in ruby
Ruby on PHP sample (PHP Script)
<?php

ruby_eval(<<<'EOC'
 def hello_ruby_on_php
   "HELLO Ruby on PHP!!!"
 end
EOC
);

echo ruby_eval('hello_ruby_on_php()');
Ruby on PHP の 構造
php script


   php-extension


            libruby
反転させてみた
RubyscriptPHP の 構造
ruby   on



    ruby-extension

embed
 SAPI         libphp5
php_embed sample (Ruby Script)
# encoding: UTF-8
require 'php_embed'

p PhpEmbed.eval('1')              #1
p PhpEmbed.eval('true')           # true
p PhpEmbed.eval('null')           # nil
p PhpEmbed.eval('array(1,2,3)')   # [1, 2, 3]
導入
Install
1. php-embed SAPI を用意
  – コンパイル                            CentOS6

  – OS Package (php-embedded / php-devel)
2. ruby 1.9 環境
  – 1.8 では動きません
  – rbenv/ruby-builid が便利
3. gem install php-embed
php-embed SAPI
• ./configure --enable-embed=shared (or static)

• Windows 版もある

• 開発止まってる……?

php-build 使ってる場合は
PHP_BUILD_CONFIGURE_OPTS=‘--enable-embed’
で指定しましょー
ruby 1.9
• OS 標準はだいたい 1.8

• rbenv / ruby-build 使えば導入は簡単
 – https://github.com/sstephenson/rbenv
 – https://github.com/sstephenson/ruby-build
ruby 1.9 構築手順
$ cd
$ git clone git://github.com/sstephenson/rbenv.git .rbenv
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >>
~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

# ここで再ログイン

$ mkdir -p ~/.rbenv/plugins
$ cd ~/.rbenv/plugins
$ git clone git://github.com/sstephenson/ruby-build.git

$ rbenv install 1.9.3-p194


                                           readme に書いてあるけどね
gem install php-embed
• gem : Ruby のパッケージ管理ツール
 – 1.9 からは標準
 – rubygems.org
 – Pure Ruby or C拡張 関係ないみたい


• bundler で超簡単にライブラリ公開
PHP Programming (in Ruby)
# encoding: UTF-8
require 'php_embed'

p PhpEmbed::VERSION
p PhpEmbed.call('phpversion')

p PhpEmbed.call(‘array_intersect’, [1,2,3],
[2,3,4]) # [2,3]
深部
php-embed の簡単な使い方
#include <sapi/embed/php_embed.h>

int main(int argc, char* argv[]) {
   PHP_EMBED_START_BLOCK(argc, argv);
   zend_eval_string(
      "echo 'Hello Embeded PHP Workd';"
      , NULL, (char*)"Embeded PHP" TSRMLS_CC
   );
         PHP_EMBED_END_BLOCK();
         return 0;
}
// gcc sample.c –lphp5
zend_eval_stringl
• php code を実行
  – create_function / preg / ereg で使われてる
• 第3引数 retval_ptr
  – NULL  -> そのまま実行
  – 非NULL -> “return” と “;” で囲んで実行
• zend_compile_string (= compile_string)
  – Zend/zend_language_scanner.c
• zend_execute (=dtrace_execute or execute)
  – Zend/zend_dtrace.c
  – Zend/zend_vm_execute.h
PHP_EMBED_START(END)_BLOCK
• マクロ
• ZTS (Zend Thread Safety) の有無で分岐

• php_embed_init
• try – catch
• php_embed_shutdown
PHP_EMBED_*_BLOCK を展開(非ZTS)
int main(int argc, char* argv[])
{
      php_embed_init(argc, argv);
      zend_first_try {
             zend_eval_string(...)
      } zend_catch {

      } zend_end_try();
      php_embed_shutdown(TSRMLS_C);

      return 0;
}
さらに展開
php_embed_init(argc, argv);
EG(bailout)=NULL;
{
       JMP_BUF *__orig_bailout = EG(bailout);
       JMP_BUF __bailout;

      EG(bailout) = &__bailout;
      if (SETJMP(__bailout)==0) {
               zend_eval_string(...)
      } else {
               EG(bailout) = __orig_bailout;
      }
      EG(bailout) = __orig_bailout;
}
php_embed_shutdown(TSRMLS_C);
出力のハンドリング
static int php_ub_write(const char *str, unsigned int
str_length TSRMLS_DC) { return str_length }

static void php_log_message(char *message) {}

static void php_sapi_error(int type, const char *fmt, ...) {}


php_embed_module.ub_write = php_ub_write;
php_embed_module.log_message = php_log_message;
php_embed_module.sapi_error = php_sapi_error;
zval と VALUE
• zval                    構造体
  – php の内部表現
  – _zval_struct 構造体
  – = zvalue_value 構造体+ リファレンスカウンタ

• VALUE                  ポインタ
  – ruby の内部表現
  – ポインタと同じサイズを持つ unsigned な整数
  – RVALUE 構造体が実体 (FIXNUM を除いて)
TYPE(VALUE)
•   T_NONE          •   T_FILE
•   T_NIL           •   T_FIXNUM
•   T_OBJECT        •   T_TRUE
•   T_CLASS         •   T_FALSE
•   T_ICLASS        •   T_DATA
•   T_MODULE        •   T_MATCH
•   T_FLOAT         •   T_SYMBOL
•   T_STRING        •   T_RATIONAL
•   T_REGEXP        •   T_COMPLEX
•   T_ARRAY         •   T_UNDEF
•   T_HASH          •   T_NODE
•   T_STRUCT        •   T_ZOMBIE
•   T_BIGNUM
Z_TYPE (zval)
•   IS_NULL
•   IS_LONG
•   IS_DOUBLE
•   IS_BOOL
•   IS_ARRAY
•   IS_OBJECT
•   IS_STRING
•   IS_RESOURCE
•   IS_CONSTANT
•   IS_CONSTANT_ARRAY
•   IS_CALLABLE
相互変換
• それぞれの最終的な内部表現に応じて変
  換
• いずれも 言語が用意しているマクロや関
  数を介して操作

• まだ対応してない型も多い
• RESOURCE 型は難しいかもね
嵌ったこと
• Ruby 側も、setjmp / longjmp を使っている
  らしい
• 入れ子状態によってはコアダンプ
最後に
• ruby から php のコードを実行できるライ
  ブラリを作りました

• もうちょいきちんと作り込んで PHP
  Conference 2012 で発表するつもり
1




Questions?

More Related Content

What's hot (20)

PDF
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
Yoshio Hanawa
 
PDF
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
hecomi
 
PDF
JIT のコードを読んでみた
y-uti
 
PPTX
signal の話 或いは Zend Signals とは何か
do_aki
 
PPTX
PHPとシグナル、その裏側
do_aki
 
PDF
PECL operator で演算子オーバーロード
y-uti
 
PDF
PHPの今とこれから2014
Rui Hirokawa
 
PDF
PECL を数えてみた
y-uti
 
PDF
HHVM Hack
Masaaki Yonebayashi
 
PDF
Hack/HHVM 入門
y-uti
 
PPT
about Thrift
Naoya Ito
 
PDF
Task Spooler を試した
y-uti
 
PDF
PHP の GC の話
y-uti
 
PDF
実"戦"CakePHP Plugin
Kenichirou Oyama
 
PDF
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Shintarou Okada
 
PPTX
BoostAsioで可読性を求めるのは間違っているだろうか
Yuki Miyatake
 
PDF
CodeIgniter入門
Sho A
 
PDF
emc++ chapter32
Tatsuki SHIMIZU
 
PDF
Windows で拡張モジュールをビルドしてみた
y-uti
 
PDF
Good Parts of PHP and the UNIX Philosophy
Yuya Takeyama
 
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
Yoshio Hanawa
 
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
hecomi
 
JIT のコードを読んでみた
y-uti
 
signal の話 或いは Zend Signals とは何か
do_aki
 
PHPとシグナル、その裏側
do_aki
 
PECL operator で演算子オーバーロード
y-uti
 
PHPの今とこれから2014
Rui Hirokawa
 
PECL を数えてみた
y-uti
 
Hack/HHVM 入門
y-uti
 
about Thrift
Naoya Ito
 
Task Spooler を試した
y-uti
 
PHP の GC の話
y-uti
 
実"戦"CakePHP Plugin
Kenichirou Oyama
 
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Shintarou Okada
 
BoostAsioで可読性を求めるのは間違っているだろうか
Yuki Miyatake
 
CodeIgniter入門
Sho A
 
emc++ chapter32
Tatsuki SHIMIZU
 
Windows で拡張モジュールをビルドしてみた
y-uti
 
Good Parts of PHP and the UNIX Philosophy
Yuya Takeyama
 

Viewers also liked (6)

PDF
20111206 GLT vol.40
kashew_nuts
 
PDF
ゆるLTのススメ+α
joker1007
 
KEY
闇RubyKaigi
suga masao
 
KEY
JoJoに学ぶプログラマが知るべきたった一つのこと
Daisuke Kasuya
 
PDF
Over The Rainbow
Jun OHWADA
 
PDF
moon and strategy
toshihiro ichitani
 
20111206 GLT vol.40
kashew_nuts
 
ゆるLTのススメ+α
joker1007
 
闇RubyKaigi
suga masao
 
JoJoに学ぶプログラマが知るべきたった一つのこと
Daisuke Kasuya
 
Over The Rainbow
Jun OHWADA
 
moon and strategy
toshihiro ichitani
 
Ad

Similar to Php in ruby (20)

PPTX
php in ruby
do_aki
 
PPTX
20111029 rubyon php
do_aki
 
PDF
PHP で実行中のスクリプトの動作を下から覗き見る
shinjiigarashi
 
PDF
人類の役に立たないDSL、そしていつからRubyが最高の言語だと錯覚してた? with PHP
Kenta USAMI
 
PDF
Modern PHP Programming @ PFI Seminar
Sotaro Karasawa
 
PDF
YAPC::Asia 2014 - 半端なPHPDisでPHPerに陰で笑われないためのPerl Monger向け最新PHP事情
Junichi Ishida
 
PPTX
詳説ぺちぺち
do_aki
 
PDF
はじめてのPHP
Go Tanaka
 
PPTX
PHP基礎勉強会
Yuji Otani
 
PDF
徹底攻略!PHP5.4
Takuya Sato
 
PDF
Pの付く言語の話
Satoshi Hirata
 
PDF
PHP初心者セッション2023 〜ChatGPT時代の簡単な始め方〜
Hideo Kashioka
 
PDF
PHPの今とこれから2019
Rui Hirokawa
 
PDF
PHPの今とこれから2021
Rui Hirokawa
 
PDF
PHPの今とこれから 2013
Rui Hirokawa
 
PDF
スクリプト言語PHP攻略法
Rui Hirokawa
 
PPT
PHP, Now and Then 2011
Rui Hirokawa
 
PDF
PHPの今とこれから2023
Rui Hirokawa
 
PPTX
Immortal
do_aki
 
PDF
お前は PHP の歴史的な理由の数を覚えているのか
Kousuke Ebihara
 
php in ruby
do_aki
 
20111029 rubyon php
do_aki
 
PHP で実行中のスクリプトの動作を下から覗き見る
shinjiigarashi
 
人類の役に立たないDSL、そしていつからRubyが最高の言語だと錯覚してた? with PHP
Kenta USAMI
 
Modern PHP Programming @ PFI Seminar
Sotaro Karasawa
 
YAPC::Asia 2014 - 半端なPHPDisでPHPerに陰で笑われないためのPerl Monger向け最新PHP事情
Junichi Ishida
 
詳説ぺちぺち
do_aki
 
はじめてのPHP
Go Tanaka
 
PHP基礎勉強会
Yuji Otani
 
徹底攻略!PHP5.4
Takuya Sato
 
Pの付く言語の話
Satoshi Hirata
 
PHP初心者セッション2023 〜ChatGPT時代の簡単な始め方〜
Hideo Kashioka
 
PHPの今とこれから2019
Rui Hirokawa
 
PHPの今とこれから2021
Rui Hirokawa
 
PHPの今とこれから 2013
Rui Hirokawa
 
スクリプト言語PHP攻略法
Rui Hirokawa
 
PHP, Now and Then 2011
Rui Hirokawa
 
PHPの今とこれから2023
Rui Hirokawa
 
Immortal
do_aki
 
お前は PHP の歴史的な理由の数を覚えているのか
Kousuke Ebihara
 
Ad

More from do_aki (20)

PPTX
Tritonn から Elasticsearch への移行話
do_aki
 
PPTX
再考:列挙型
do_aki
 
PPTX
Writing php extensions in golang
do_aki
 
PPTX
N対1 レプリケーション + Optimizer Hint
do_aki
 
PPTX
20150212 プレゼンテーションzen
do_aki
 
PPTX
MySQL Casual Talks 7 「N:1 レプリケーション ~進捗どうですか?~」
do_aki
 
PPTX
20141017 introduce razor
do_aki
 
PPTX
20141011 mastering mysqlnd
do_aki
 
PPTX
PHP から Groonga を使うにはこんなコードになるよ!
do_aki
 
PPTX
N:1 Replication meets MHA
do_aki
 
PDF
Php radomize
do_aki
 
PPTX
セキュアそうでセキュアじゃない少しセキュアな気分になれるmysql_config_editor
do_aki
 
PPTX
マスタN対スレーブ1レプリケーションの作り方 ~あれから~
do_aki
 
PPTX
Excel is image viewer
do_aki
 
PDF
A bridge between php and ruby
do_aki
 
PDF
Ruby and comparison_and...php
do_aki
 
PPTX
Sore php
do_aki
 
PPTX
Ruby enumerable source code reading
do_aki
 
PPTX
続マスタN対スレーブ1レプリケーションの作り方
do_aki
 
PPTX
Mod lua
do_aki
 
Tritonn から Elasticsearch への移行話
do_aki
 
再考:列挙型
do_aki
 
Writing php extensions in golang
do_aki
 
N対1 レプリケーション + Optimizer Hint
do_aki
 
20150212 プレゼンテーションzen
do_aki
 
MySQL Casual Talks 7 「N:1 レプリケーション ~進捗どうですか?~」
do_aki
 
20141017 introduce razor
do_aki
 
20141011 mastering mysqlnd
do_aki
 
PHP から Groonga を使うにはこんなコードになるよ!
do_aki
 
N:1 Replication meets MHA
do_aki
 
Php radomize
do_aki
 
セキュアそうでセキュアじゃない少しセキュアな気分になれるmysql_config_editor
do_aki
 
マスタN対スレーブ1レプリケーションの作り方 ~あれから~
do_aki
 
Excel is image viewer
do_aki
 
A bridge between php and ruby
do_aki
 
Ruby and comparison_and...php
do_aki
 
Sore php
do_aki
 
Ruby enumerable source code reading
do_aki
 
続マスタN対スレーブ1レプリケーションの作り方
do_aki
 
Mod lua
do_aki
 

Recently uploaded (13)

PDF
第3回デジタル理学療法研究会学術大会シンポジウム「デジタル理学療法の組織活用:教育・管理・研究を繋ぐ新たな地平」の講演資料.
Matsushita Laboratory
 
PDF
論文紹介:AutoPrompt: Eliciting Knowledge from Language Models with Automatically ...
Toru Tamaki
 
PDF
安尾 萌, 北村 茂生, 松下 光範. 災害発生時における被害状況把握を目的とした情報共有システムの基礎検討, 電子情報通信学会HCGシンポジウム2018...
Matsushita Laboratory
 
PDF
マルチAIエージェントの産業界での実践に向けたオープンソース活動の展望 - Japan Regional User Group (RUG) Meet-Up
Kosaku Kimura
 
PDF
API認可を支えるKeycloakの基本と設計の考え方 ~ OAuth/OIDCによるAPI保護のベストプラクティス ~
Hitachi, Ltd. OSS Solution Center.
 
PDF
漁船に搭載されている電子装備と漁法について_VRC海洋学研究会_海のLT会発表資料
Yuuitirou528 default
 
PDF
AIツールを使った研究の効率化 Improving Research Efficiency with AI Tools
Tohoku University
 
PDF
安尾 萌, 松下 光範. 環境馴致を計量可能にするための試み,人工知能学会第4回仕掛学研究会, 2018.
Matsushita Laboratory
 
PDF
SIG-AUDIO 2025 Vol.02 オンラインセミナー 「GDC2025 オーディオ報告会」SIG-Audio_GDC2025_報告会資料_渡辺さ...
IGDA Japan SIG-Audio
 
PDF
論文紹介:Unbiasing through Textual Descriptions: Mitigating Representation Bias i...
Toru Tamaki
 
PDF
第3回デジタル理学療法学会のシンポジウム「デジタル理学療法の組織活用:教育・管理・研究を繋ぐ新たな地平」での話題提供
Matsushita Laboratory
 
PDF
SIG-AUDIO 2025 Vol.02 オンラインセミナー 「GDC2025 オーディオ報告会」SIG-Audio_GDC2024_報告会資料_増野さ...
IGDA Japan SIG-Audio
 
PDF
安尾 萌, 藤代 裕之, 松下 光範. 協調的情報トリアージにおけるコミュニケーションの影響についての検討, 第11回データ工学と情報マネジメントに関する...
Matsushita Laboratory
 
第3回デジタル理学療法研究会学術大会シンポジウム「デジタル理学療法の組織活用:教育・管理・研究を繋ぐ新たな地平」の講演資料.
Matsushita Laboratory
 
論文紹介:AutoPrompt: Eliciting Knowledge from Language Models with Automatically ...
Toru Tamaki
 
安尾 萌, 北村 茂生, 松下 光範. 災害発生時における被害状況把握を目的とした情報共有システムの基礎検討, 電子情報通信学会HCGシンポジウム2018...
Matsushita Laboratory
 
マルチAIエージェントの産業界での実践に向けたオープンソース活動の展望 - Japan Regional User Group (RUG) Meet-Up
Kosaku Kimura
 
API認可を支えるKeycloakの基本と設計の考え方 ~ OAuth/OIDCによるAPI保護のベストプラクティス ~
Hitachi, Ltd. OSS Solution Center.
 
漁船に搭載されている電子装備と漁法について_VRC海洋学研究会_海のLT会発表資料
Yuuitirou528 default
 
AIツールを使った研究の効率化 Improving Research Efficiency with AI Tools
Tohoku University
 
安尾 萌, 松下 光範. 環境馴致を計量可能にするための試み,人工知能学会第4回仕掛学研究会, 2018.
Matsushita Laboratory
 
SIG-AUDIO 2025 Vol.02 オンラインセミナー 「GDC2025 オーディオ報告会」SIG-Audio_GDC2025_報告会資料_渡辺さ...
IGDA Japan SIG-Audio
 
論文紹介:Unbiasing through Textual Descriptions: Mitigating Representation Bias i...
Toru Tamaki
 
第3回デジタル理学療法学会のシンポジウム「デジタル理学療法の組織活用:教育・管理・研究を繋ぐ新たな地平」での話題提供
Matsushita Laboratory
 
SIG-AUDIO 2025 Vol.02 オンラインセミナー 「GDC2025 オーディオ報告会」SIG-Audio_GDC2024_報告会資料_増野さ...
IGDA Japan SIG-Audio
 
安尾 萌, 藤代 裕之, 松下 光範. 協調的情報トリアージにおけるコミュニケーションの影響についての検討, 第11回データ工学と情報マネジメントに関する...
Matsushita Laboratory
 

Php in ruby

  • 1. PHP in Ruby 2012/09/01 闇PHP勉強会 do_aki
  • 7. Ruby on PHP sample (PHP Script) <?php ruby_eval(<<<'EOC' def hello_ruby_on_php "HELLO Ruby on PHP!!!" end EOC ); echo ruby_eval('hello_ruby_on_php()');
  • 8. Ruby on PHP の 構造 php script php-extension libruby
  • 10. RubyscriptPHP の 構造 ruby on ruby-extension embed SAPI libphp5
  • 11. php_embed sample (Ruby Script) # encoding: UTF-8 require 'php_embed' p PhpEmbed.eval('1') #1 p PhpEmbed.eval('true') # true p PhpEmbed.eval('null') # nil p PhpEmbed.eval('array(1,2,3)') # [1, 2, 3]
  • 13. Install 1. php-embed SAPI を用意 – コンパイル CentOS6 – OS Package (php-embedded / php-devel) 2. ruby 1.9 環境 – 1.8 では動きません – rbenv/ruby-builid が便利 3. gem install php-embed
  • 14. php-embed SAPI • ./configure --enable-embed=shared (or static) • Windows 版もある • 開発止まってる……? php-build 使ってる場合は PHP_BUILD_CONFIGURE_OPTS=‘--enable-embed’ で指定しましょー
  • 15. ruby 1.9 • OS 標準はだいたい 1.8 • rbenv / ruby-build 使えば導入は簡単 – https://github.com/sstephenson/rbenv – https://github.com/sstephenson/ruby-build
  • 16. ruby 1.9 構築手順 $ cd $ git clone git://github.com/sstephenson/rbenv.git .rbenv $ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile $ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile # ここで再ログイン $ mkdir -p ~/.rbenv/plugins $ cd ~/.rbenv/plugins $ git clone git://github.com/sstephenson/ruby-build.git $ rbenv install 1.9.3-p194 readme に書いてあるけどね
  • 17. gem install php-embed • gem : Ruby のパッケージ管理ツール – 1.9 からは標準 – rubygems.org – Pure Ruby or C拡張 関係ないみたい • bundler で超簡単にライブラリ公開
  • 18. PHP Programming (in Ruby) # encoding: UTF-8 require 'php_embed' p PhpEmbed::VERSION p PhpEmbed.call('phpversion') p PhpEmbed.call(‘array_intersect’, [1,2,3], [2,3,4]) # [2,3]
  • 20. php-embed の簡単な使い方 #include <sapi/embed/php_embed.h> int main(int argc, char* argv[]) { PHP_EMBED_START_BLOCK(argc, argv); zend_eval_string( "echo 'Hello Embeded PHP Workd';" , NULL, (char*)"Embeded PHP" TSRMLS_CC ); PHP_EMBED_END_BLOCK(); return 0; } // gcc sample.c –lphp5
  • 21. zend_eval_stringl • php code を実行 – create_function / preg / ereg で使われてる • 第3引数 retval_ptr – NULL -> そのまま実行 – 非NULL -> “return” と “;” で囲んで実行 • zend_compile_string (= compile_string) – Zend/zend_language_scanner.c • zend_execute (=dtrace_execute or execute) – Zend/zend_dtrace.c – Zend/zend_vm_execute.h
  • 22. PHP_EMBED_START(END)_BLOCK • マクロ • ZTS (Zend Thread Safety) の有無で分岐 • php_embed_init • try – catch • php_embed_shutdown
  • 23. PHP_EMBED_*_BLOCK を展開(非ZTS) int main(int argc, char* argv[]) { php_embed_init(argc, argv); zend_first_try { zend_eval_string(...) } zend_catch { } zend_end_try(); php_embed_shutdown(TSRMLS_C); return 0; }
  • 24. さらに展開 php_embed_init(argc, argv); EG(bailout)=NULL; { JMP_BUF *__orig_bailout = EG(bailout); JMP_BUF __bailout; EG(bailout) = &__bailout; if (SETJMP(__bailout)==0) { zend_eval_string(...) } else { EG(bailout) = __orig_bailout; } EG(bailout) = __orig_bailout; } php_embed_shutdown(TSRMLS_C);
  • 25. 出力のハンドリング static int php_ub_write(const char *str, unsigned int str_length TSRMLS_DC) { return str_length } static void php_log_message(char *message) {} static void php_sapi_error(int type, const char *fmt, ...) {} php_embed_module.ub_write = php_ub_write; php_embed_module.log_message = php_log_message; php_embed_module.sapi_error = php_sapi_error;
  • 26. zval と VALUE • zval 構造体 – php の内部表現 – _zval_struct 構造体 – = zvalue_value 構造体+ リファレンスカウンタ • VALUE ポインタ – ruby の内部表現 – ポインタと同じサイズを持つ unsigned な整数 – RVALUE 構造体が実体 (FIXNUM を除いて)
  • 27. TYPE(VALUE) • T_NONE • T_FILE • T_NIL • T_FIXNUM • T_OBJECT • T_TRUE • T_CLASS • T_FALSE • T_ICLASS • T_DATA • T_MODULE • T_MATCH • T_FLOAT • T_SYMBOL • T_STRING • T_RATIONAL • T_REGEXP • T_COMPLEX • T_ARRAY • T_UNDEF • T_HASH • T_NODE • T_STRUCT • T_ZOMBIE • T_BIGNUM
  • 28. Z_TYPE (zval) • IS_NULL • IS_LONG • IS_DOUBLE • IS_BOOL • IS_ARRAY • IS_OBJECT • IS_STRING • IS_RESOURCE • IS_CONSTANT • IS_CONSTANT_ARRAY • IS_CALLABLE
  • 29. 相互変換 • それぞれの最終的な内部表現に応じて変 換 • いずれも 言語が用意しているマクロや関 数を介して操作 • まだ対応してない型も多い • RESOURCE 型は難しいかもね
  • 30. 嵌ったこと • Ruby 側も、setjmp / longjmp を使っている らしい • 入れ子状態によってはコアダンプ
  • 31. 最後に • ruby から php のコードを実行できるライ ブラリを作りました • もうちょいきちんと作り込んで PHP Conference 2012 で発表するつもり