rhino fork その 8

Proxyの実装が完了したらtype operator,annotationを実装しようと思う。

そうなると問題はMetaObjectの話。js1.*にはMachineTypesがないのでこれはNumberとnumberになる。登録されるMetaObjectもそれぞれNumbertypeとnumbertypeになる。
しかし、js1.*にはnumberという識別子は定義されていないので定義する必要があり、そのときnumberの型は何になるのかという問題がある。

js2.0/es4では[[Construct]]を持つのはFunction ObjectではなくClass ObjectでMachineTypesの[[Class]]はClass Objectとなる。各Class ObjectのMetaObjectsはそれに対応するClassTypeImpl Objectであるが、js1.*にClass Objectはない。

そこで──

  • プリミティブのboolean,number,stringはClassの代わりにコンストラクタ関数にしてそれに対してそれぞれのMetaObjectを登録するのか、それともboolean,number,stringが直接MetaObjectになるのか?
まず、これを解決しなければならない。

その後、type operator,annotationが実装できたのであればpattern match(switch type)とgeneric functionが実装できるのでこれも実装する。ただし、generic functionが使えたとしても今のところ演算子オーバーロードを実装する予定はない。それとgeneric functionは構文でのサポートが必要ないのであればproxyで実装できるので互換性のためにjavascriptで書くかもしれない。

それと話は変わるがNamespaceの実装予定はない。なぜならNamespaceはes4のclass構文でなければメリットが薄く──
namespace ns;
ns var x=10;
print(ns::x)
と出来たとしても
class C{
    ns function f() 20
}

var c = new C;
print(c.ns::f())
とできないならほとんど意味が無い為

rhino fork その7

ただいまdirect proxyを実装中。

rhinoのinternal methodの実装がecma-262を厳密に満たしていなかった事による変更箇所が沢山あるので時間がかかっている。
また、今行なっている大規模なes6の機能追加に関するcommitをまだ5つほどリモートにpushしていないのでいずれこのcommitをpushするとソースコードがまた大きく変わる事になる。

rhinoのCPU時間食っている部分

半分が正規表現でもう半分がバイトコードジェネレータが生成したバイトコード。および、そのバイトコードが呼び出しているruntime側の一部のslower code。
これがrhinoのセルフ時間を占める主なコード。

正規表現は仕方ないのでバイトコードをどうにかしなければいけない。むしろ、バイトコードジェネレータの品質がすごく悪いのでindy云々の前に差し替えなければならない。
しかし、問題はそれをやろうとするとparser、AST、バイトコードジェネレータすべてを見直す必要があること。大変なので当分後回し。この関係で構文に影響のあるes6の新機能はパス。

rhino fork その6

引き続きes6のiteratorの実装中。ArrayIteratorの実装は済んだけど関連する内部実装を色々変更中、これは少し大きな変更になる。
この変更に関連してコンストラクタ関数でないオブジェクトでinstanceof演算子が使えたバグが修正できる予定。ただし、Symbolを実装してないので@@hasInstanceとかはない。

getOwnPropertyメソッドをScriptableObjectからScriptableへ移動してScriptableにinternal [[Enumrate]] methodを実装している最中。これが終わったら他にも少し変えてdirect Proxy objectを実装予定。

これらの作業でまた、ほんの少しスコアの上昇とほとんど変わらないメモリ使用量の削減が見られた。

rhino fork その5

original rhinoにPRされているpatchの内、ArrowFunctionをmergeした。それと並行してSymbolとrest parameterを実装していたのだがparserを変更しなくちゃいけなくなったのでrest parameterを一旦放置。

代わりに、es6のiterator(generatorはまだ)を実装している。そこでes6のCommon Iteration Interfacesの定義だと
Iterable Interfaceは@@iteratorを持っていてIterator Interfaceはnextを持っている。

これはes4の
namespace iterator;

 type IterableType. = { 
     iterator::get: function (boolean=): IteratorType. 
 } 
 type IteratorType. = { 
     next: function(): T 
 }

と同じ意味だがes4のnamespaceと型システムに依存しているので代わりにSymbolを使っている。つまり、es6のiterator and generatorを実装するにはSymbolに依存しているので大変だ。
GlobalSymbolRegistryをどうやって実装したものか。javaの配列のlengthは符号付き32bitなので要素数が足らなくなるかもしれない。

とりあえず、%ArrayIteratorPrototype%と関連メソッドは実装したがArray.prototype.@@iteratorはSymbolの実装が終わってないので実装してない。
%StringIteratorPrototype%関連はサロゲートペア関係が面倒なので今からゆっくりと実装する。for-ofとgenerator functionは当分先になる。