Quercus上でのproperty_existsと__get

ソースを追ってみたところ、property_existsの方はClassesModuleと言うクラスにあり、内部的にはissetFieldと言う関数を参照していた。

名前から察する通りisset系なのでnullの場合はfalseになるようになっていた。

修正するとしたらissetFieldではなくhasFieldとか別の関数を用意して、それを呼ぶようにしたほうが良いか。

 

また、プロパティがnullの場合に__getに来てしまう問題だが、これはObjectExtValueと言うクラスにあるgetField系の中身をどうにかしてやる必要がありそうだった。

unsetもしくはnullの場合次の候補へ(__getなどへ)回す処理になっていたため、今回のような非互換な挙動になっていた。

 

どちらも実験的に上記のような対応を入れてみたところ、残るはisTrustedTagと言う関数をnullオブジェクトに対して呼び出していると言うエラーが出るところまで来た。

こちらの問題はSmartyのコードを見てみると、issetでオブジェクトがfalseかまたはオブジェクトに対してisTrustedTagを呼ぶと言うもので特に問題なく、echoなどで中身を見てみるとissetの結果が正しくない事が分かった。

 

が、流石にissetが常に正しく動いてなければ互換性もクソも無いだろうと思って実験コードを書いたらやはり挙動は正しく、何か複雑な組み合わせの際に間違った値になってしまっているように見えた。

ちなみに、ここはQuercus側を回収せずissetを!= nullに変えることでその後のエラーを見てみたが、そこを回避できれば簡易的なテンプレートは正しく表示されるところまではいけた。

 

調べ始めて1〜2日で判明してしまうレベルの問題が3件もあったように見えるが、実際の所これは何で解決されて無いんだろう。

更新頻度は低いが放置してるとまでは行っていないように思えるんだけどな。

 

あとは最終的に正しい修正箇所がわかった場合にどういった形で修正依頼を出せばいいのか、と言うところだな。githubを使った形跡はあるんだけど、現在はsvnしかなさそうだし、、、

SmartyがQuercusで動かない

しょっぱなから躓いた。ここにある理由の通り。

https://gist.github.com/4086394

property_existsはnullでもプロパティーが存在していればtrueなのにQuercusはそうなっていない。

Smartは__getや__callを結構駆使してるのでしょっぱなでコケる。

しょうがないのでソースを追いかけるか。

Quercus調査はじめる

半分趣味的な部分もあり、Quercusでどのくらい近くにあるPHPがそのまま動くか、動かないかを調べ始めようと思う。

 

目的は既存PHPシステムの脱PHP。

ほぼそのまま動くのであれば既存システムが動く状態を維持しながら別のJVM上で動く言語に少しずつ切り替えていくことが可能になる。

何かこれだけ書くと庇を貸して母屋を取られるみたいで怖いけど全然違うし問題無いです。