ここではJavaScriptを解析した際の PointerAnalysis から取得できる情報について説明する
(ここで扱う PointerAnalysis は従来の PointerAnalysis<InstanceKey> である)
基本的なクラスの説明
基本的にはJavaの場合と同じであるため、異なる箇所について説明する
PointerKey クラス
抽象的なポインタを表すオブジェクト
オブジェクトの種類によって表現する派生クラスが異なり、 以下のクラスで表現される
LocalPointerKey クラス
ローカル変数(ValueNumber)のポインタを表す
対応する CGNode と ValueNumber の情報を持つ
InstanceFieldKey クラス
Objectのプロパティのポインタ(式 x.y のyが指すもの)を表す
InstanceFieldKey.getField() でこのプロパティの情報、 InstanceFieldKey#getInstanceKey() でこのプロパティが属するObject(式 x.y のx)の InstanceKey が取得できる
TransitivePrototype クラス
オブジェクトがprototypeとして参照するオブジェクト一覧を表す
TransitivePrototype#getInstanceKey() で対象とするオブジェクトの InstanceKey が取得できる
ReturnValueKey クラス
関数がreturnで返しうる値のポインタを表す
CGNode の情報を持つ
ExceptionReturnValueKey クラス (ReturnValueKey の派生クラス)
関数がthrow等で返しうるエラーオブジェクト(TypeError等)のポインタを表す
ObjectPropertyCatalog クラス
あるObjectが持つプロパティ名の一覧を表す
ObjectPropertyCatalog#getObject() で一覧の対象とするObjectの InstanceKey が取得できる
例えば、プロパティ名 a, b, d を持つObject objを対象としている場合、 この ObjectPropertyCatalog が指す InstanceKey は "a", "b", "d" の文字列定数を持ち、 getObject() でobjのheap allocationを表す InstanceKey が取得できる
ReflectedField クラス
あるObjectをリフレクションとして参照できるオブジェクトの一覧を表す
例えば、Object objが obj.a = b であった場合、bというオブジェクトの InstanceKey がこの ReflectedField から参照できる
ReflectedField#getInstanceKey で対象となるオブジェクトの InstanceKey が取得できる。
AstGlobalPointerKey クラス
大域オブジェクトを表す
AstGlobalPointerKey#getName() で変数名が取得できる
UpwardFunargPointerKey クラス (AstGlobalPointerKey の派生クラス)
レキシカルスコープ変数を表す
UpwardFunargPointerKey#getDefiningNode() で定義された CGNode が取得できる
(しかし、ローカルクラスなのでこのメソッドにアクセスできない)
InstanceKey クラス
抽象的なheap locationを表すオブジェクト
オブジェクトの種類によって派生クラスが異なり、 以下のクラスで表現される
GlobalObjectKey クラス
JavaScriptにおける大域オブジェクト global を表す
この InstanceKey は1個だけ存在する
NormalAllocationInNode クラス
通常のheap allocationを表す
ScopeMappingInstanceKey クラス
クロージャ内で生成される関数の生成元(lexical parent)の情報を持つ
この InstanceKey によって別々の呼び出しで生成されるクロージャ内関数を外部から呼び出した時に 区別することができる
ScopeMappingInstanceKey#getBase() でクロージャ内で生成される関数を指す InstanceKey が取得でき、 ScopeMappingInstanceKey#getCreater() で生成元(lexical parent)の CGNode が取得できる
function create(message) {
function say() {
console.log(message);
}
return say;
}
// 2つは同じクロージャ内関数 say だが、
// 生成元のCGNode(この場合はcreate関数のCGNode)によって別々の関数として区別される
hello = create('hello!');
hello(); // こっちのsayは "create('hello!')" のCGNodeに紐づく
goodbye = create('goodbye!');
goodbye(); // こっちのsayは "create('goodbye!')" のCGNodeに紐づく
ConstantKey<T> クラス
定数を表し、その値の型はGeneric type Tに対応する
定数は ConstantKey#getValue() で取得できる
ConcreteTypeKey クラス
型オブジェクト(String, Array等)を表す