arkanalyzer 1.0.92 → 1.0.93

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/lib/callgraph/algorithm/AbstractAnalysis.d.ts +6 -0
  2. package/lib/callgraph/algorithm/AbstractAnalysis.d.ts.map +1 -1
  3. package/lib/callgraph/algorithm/AbstractAnalysis.js +17 -8
  4. package/lib/callgraph/algorithm/ClassHierarchyAnalysis.d.ts +1 -0
  5. package/lib/callgraph/algorithm/ClassHierarchyAnalysis.d.ts.map +1 -1
  6. package/lib/callgraph/algorithm/ClassHierarchyAnalysis.js +9 -3
  7. package/lib/callgraph/algorithm/RapidTypeAnalysis.d.ts +147 -0
  8. package/lib/callgraph/algorithm/RapidTypeAnalysis.d.ts.map +1 -1
  9. package/lib/callgraph/algorithm/RapidTypeAnalysis.js +803 -76
  10. package/lib/callgraph/model/CallGraph.d.ts +1 -0
  11. package/lib/callgraph/model/CallGraph.d.ts.map +1 -1
  12. package/lib/callgraph/model/CallGraph.js +4 -0
  13. package/lib/callgraph/model/CallSite.d.ts +88 -1
  14. package/lib/callgraph/model/CallSite.d.ts.map +1 -1
  15. package/lib/callgraph/model/CallSite.js +58 -4
  16. package/lib/core/common/ArkIRTransformer.d.ts.map +1 -1
  17. package/lib/core/common/ArkIRTransformer.js +1 -1
  18. package/lib/core/common/IRInference.js +2 -2
  19. package/lib/core/common/SdkUtils.js +1 -1
  20. package/lib/core/common/TypeInference.d.ts.map +1 -1
  21. package/lib/core/common/TypeInference.js +3 -0
  22. package/lib/core/graph/builder/SwitchBuilder.d.ts.map +1 -1
  23. package/lib/core/graph/builder/SwitchBuilder.js +11 -1
  24. package/lib/core/model/builder/ArkClassBuilder.js +4 -4
  25. package/lib/core/model/builder/ArkMethodBuilder.d.ts +2 -1
  26. package/lib/core/model/builder/ArkMethodBuilder.d.ts.map +1 -1
  27. package/lib/core/model/builder/ArkMethodBuilder.js +5 -1
  28. package/lib/frontend/cppFrontend/graph/builder/SwitchBuilder.d.ts.map +1 -1
  29. package/lib/frontend/cppFrontend/graph/builder/SwitchBuilder.js +11 -1
  30. package/package.json +1 -1
@@ -28,8 +28,14 @@ export declare abstract class AbstractAnalysis {
28
28
  resolveInvokeExpr(invokeExpr: AbstractInvokeExpr): ArkMethod | undefined;
29
29
  getClassHierarchy(arkClass: ArkClass): ArkClass[];
30
30
  start(displayGeneratedMethod: boolean): void;
31
+ /**
32
+ * Whole-project CG: scan every non-SDK method once (`isProject=true`, no call-edge enqueue).
33
+ * `processedMethod` is initialized so RTA late callback edges (`emitCallbackEdge`) can query it
34
+ * without going through `init()`, which would seed the entry worklist.
35
+ */
31
36
  projectStart(displayGeneratedMethod: boolean): void;
32
37
  protected processCallSite(method: FuncID, cs: CallSite, displayGeneratedMethod: boolean, isProject?: boolean): void;
38
+ protected initProcessedMethod(): void;
33
39
  protected init(): void;
34
40
  protected processMethod(methodID: FuncID, displayGeneratedMethod: boolean, isProject?: boolean): void;
35
41
  protected getParamAnonymousMethod(invokeExpr: AbstractInvokeExpr): MethodSignature[];
@@ -1 +1 @@
1
- {"version":3,"file":"AbstractAnalysis.d.ts","sourceRoot":"","sources":["../../../src/callgraph/algorithm/AbstractAnalysis.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAgC,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAE1E,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAkB,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEhF,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,oCAAoC,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAiB,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAA2B,cAAc,EAAqB,MAAM,0BAA0B,CAAC;AAItG,8BAAsB,gBAAgB;IAClC,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC;IACvB,SAAS,CAAC,EAAE,EAAE,SAAS,CAAC;IACxB,SAAS,CAAC,SAAS,EAAG,gBAAgB,CAAC;IACvC,SAAS,CAAC,QAAQ,EAAE,WAAW,CAAqB;IACpD,SAAS,CAAC,eAAe,EAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACnD,OAAO,CAAC,mBAAmB,CAA8C;IACzE,sEAAsE;IACtE,OAAO,CAAC,iBAAiB,CAAkB;IAC3C,OAAO,CAAC,gBAAgB,CAAkB;IAC1C,OAAO,CAAC,gBAAgB,CAA4B;gBAExC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS;IAK5B,QAAQ,IAAI,KAAK;IAIjB,YAAY,IAAI,SAAS;IAIhC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,GAAG,QAAQ,EAAE;IAClF,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,EAAE;IAExD,iBAAiB,CAAC,UAAU,EAAE,kBAAkB,GAAG,SAAS,GAAG,SAAS;IAQxE,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,QAAQ,EAAE;IAoCjD,KAAK,CAAC,sBAAsB,EAAE,OAAO,GAAG,IAAI;IAqB5C,YAAY,CAAC,sBAAsB,EAAE,OAAO,GAAG,IAAI;IAoB1D,SAAS,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,sBAAsB,EAAE,OAAO,EAAE,SAAS,GAAE,OAAe,GAAG,IAAI;IAqB1H,SAAS,CAAC,IAAI,IAAI,IAAI;IAOtB,SAAS,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,sBAAsB,EAAE,OAAO,EAAE,SAAS,GAAE,OAAe,GAAG,IAAI;IA2B5G,SAAS,CAAC,uBAAuB,CAAC,UAAU,EAAE,kBAAkB,GAAG,eAAe,EAAE;IAapF,SAAS,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,sBAAsB,EAAE,OAAO,GAAG,IAAI;CAU5H"}
1
+ {"version":3,"file":"AbstractAnalysis.d.ts","sourceRoot":"","sources":["../../../src/callgraph/algorithm/AbstractAnalysis.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAgC,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAE1E,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAkB,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEhF,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,oCAAoC,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAiB,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAA2B,cAAc,EAAqB,MAAM,0BAA0B,CAAC;AAItG,8BAAsB,gBAAgB;IAClC,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC;IACvB,SAAS,CAAC,EAAE,EAAE,SAAS,CAAC;IACxB,SAAS,CAAC,SAAS,EAAG,gBAAgB,CAAC;IACvC,SAAS,CAAC,QAAQ,EAAE,WAAW,CAAqB;IACpD,SAAS,CAAC,eAAe,EAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACnD,OAAO,CAAC,mBAAmB,CAA8C;IACzE,sEAAsE;IACtE,OAAO,CAAC,iBAAiB,CAAkB;IAC3C,OAAO,CAAC,gBAAgB,CAAkB;IAC1C,OAAO,CAAC,gBAAgB,CAA4B;gBAExC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS;IAK5B,QAAQ,IAAI,KAAK;IAIjB,YAAY,IAAI,SAAS;IAIhC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,GAAG,QAAQ,EAAE;IAClF,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,EAAE;IAExD,iBAAiB,CAAC,UAAU,EAAE,kBAAkB,GAAG,SAAS,GAAG,SAAS;IAQxE,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,QAAQ,EAAE;IAoCjD,KAAK,CAAC,sBAAsB,EAAE,OAAO,GAAG,IAAI;IAqBnD;;;;OAIG;IACI,YAAY,CAAC,sBAAsB,EAAE,OAAO,GAAG,IAAI;IAqB1D,SAAS,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,sBAAsB,EAAE,OAAO,EAAE,SAAS,GAAE,OAAe,GAAG,IAAI;IAqB1H,SAAS,CAAC,mBAAmB,IAAI,IAAI;IAIrC,SAAS,CAAC,IAAI,IAAI,IAAI;IAOtB,SAAS,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,sBAAsB,EAAE,OAAO,EAAE,SAAS,GAAE,OAAe,GAAG,IAAI;IAyB5G,SAAS,CAAC,uBAAuB,CAAC,UAAU,EAAE,kBAAkB,GAAG,eAAe,EAAE;IAapF,SAAS,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,sBAAsB,EAAE,OAAO,GAAG,IAAI;CAU5H"}
@@ -117,16 +117,24 @@ class AbstractAnalysis {
117
117
  }
118
118
  this.cg.endStat();
119
119
  }
120
+ /**
121
+ * Whole-project CG: scan every non-SDK method once (`isProject=true`, no call-edge enqueue).
122
+ * `processedMethod` is initialized so RTA late callback edges (`emitCallbackEdge`) can query it
123
+ * without going through `init()`, which would seed the entry worklist.
124
+ */
120
125
  projectStart(displayGeneratedMethod) {
121
126
  this.cg.startStat();
122
127
  this.cgBuilder.buildCGNodes(this.scene.getMethods());
123
- for (let n of this.cg.getNodesIter()) {
124
- let cgNode = n;
125
- if (cgNode.isSdkMethod()) {
128
+ this.initProcessedMethod();
129
+ for (const n of this.cg.getNodesIter()) {
130
+ const cgNode = n;
131
+ const id = cgNode.getID();
132
+ if (cgNode.isSdkMethod() || this.processedMethod.contains(id)) {
126
133
  continue;
127
134
  }
128
- this.preProcessMethod(cgNode.getID());
129
- this.processMethod(cgNode.getID(), displayGeneratedMethod, true);
135
+ this.processedMethod.insert(id);
136
+ this.preProcessMethod(id);
137
+ this.processMethod(id, displayGeneratedMethod, true);
130
138
  }
131
139
  this.cgBuilder.setEntries();
132
140
  this.cg.endStat();
@@ -148,8 +156,11 @@ class AbstractAnalysis {
148
156
  logger.trace(`New workList item ${cs.calleeFuncID}: ${(_a = this.cg.getArkMethodByFuncID(cs.calleeFuncID)) === null || _a === void 0 ? void 0 : _a.getSignature().toString()}`);
149
157
  }
150
158
  }
151
- init() {
159
+ initProcessedMethod() {
152
160
  this.processedMethod = new ((0, PtsDS_1.createPtsCollectionCtor)(PtsDS_1.PtsCollectionType.BitVector))();
161
+ }
162
+ init() {
163
+ this.initProcessedMethod();
153
164
  this.cg.getEntries().forEach(entryFunc => {
154
165
  this.workList.push(entryFunc);
155
166
  });
@@ -170,8 +181,6 @@ class AbstractAnalysis {
170
181
  return;
171
182
  }
172
183
  this.resolveCall(cgNode.getID(), stmt).forEach(callSite => {
173
- this.cg.addStmtToCallSiteMap(stmt, callSite);
174
- this.cg.addMethodToCallSiteMap(callSite.calleeFuncID, callSite);
175
184
  this.processCallSite(methodID, callSite, displayGeneratedMethod, isProject);
176
185
  });
177
186
  });
@@ -7,6 +7,7 @@ import { CallGraphBuilder } from '../model/builder/CallGraphBuilder';
7
7
  export declare class ClassHierarchyAnalysis extends AbstractAnalysis {
8
8
  constructor(scene: Scene, cg: CallGraph, cb: CallGraphBuilder);
9
9
  resolveCall(callerMethod: NodeID, invokeStmt: Stmt): CallSite[];
10
+ private newRecordedCallSite;
10
11
  protected preProcessMethod(): CallSite[];
11
12
  private checkSuperInvoke;
12
13
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ClassHierarchyAnalysis.d.ts","sourceRoot":"","sources":["../../../src/callgraph/algorithm/ClassHierarchyAnalysis.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAE5C,OAAO,EAAE,MAAM,EAAE,MAAM,oCAAoC,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAIrE,qBAAa,sBAAuB,SAAQ,gBAAgB;gBAC5C,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,gBAAgB;IAKtD,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,GAAG,QAAQ,EAAE;IA8DtE,SAAS,CAAC,gBAAgB,IAAI,QAAQ,EAAE;IAKxC,OAAO,CAAC,gBAAgB;CAU3B"}
1
+ {"version":3,"file":"ClassHierarchyAnalysis.d.ts","sourceRoot":"","sources":["../../../src/callgraph/algorithm/ClassHierarchyAnalysis.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAE5C,OAAO,EAAE,MAAM,EAAE,MAAM,oCAAoC,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAIrE,qBAAa,sBAAuB,SAAQ,gBAAgB;gBAC5C,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,gBAAgB;IAKtD,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,GAAG,QAAQ,EAAE;IAuDtE,OAAO,CAAC,mBAAmB;IAM3B,SAAS,CAAC,gBAAgB,IAAI,QAAQ,EAAE;IAKxC,OAAO,CAAC,gBAAgB;CAU3B"}
@@ -33,7 +33,7 @@ class ClassHierarchyAnalysis extends AbstractAnalysis_1.AbstractAnalysis {
33
33
  // process anonymous method call
34
34
  this.getParamAnonymousMethod(invokeExpr).forEach(method => {
35
35
  const nodeID = this.cg.getCallGraphNodeByMethod(method).getID();
36
- resolveResult.push(this.cg.getCallSiteManager().newCallSite(invokeStmt, undefined, nodeID, callerMethod));
36
+ resolveResult.push(this.newRecordedCallSite(invokeStmt, nodeID, callerMethod));
37
37
  });
38
38
  let calleeMethod = this.resolveInvokeExpr(invokeExpr);
39
39
  if (!calleeMethod) {
@@ -46,7 +46,7 @@ class ClassHierarchyAnalysis extends AbstractAnalysis_1.AbstractAnalysis {
46
46
  this.checkSuperInvoke(invokeStmt, declareClass, stmtDeclareClass)) {
47
47
  // get specific method
48
48
  const nodeID = this.cg.getCallGraphNodeByMethod(calleeMethod.getSignature()).getID();
49
- resolveResult.push(this.cg.getCallSiteManager().newCallSite(invokeStmt, undefined, nodeID, callerMethod));
49
+ resolveResult.push(this.newRecordedCallSite(invokeStmt, nodeID, callerMethod));
50
50
  }
51
51
  else {
52
52
  const classHierarchy = this.getClassHierarchy(declareClass);
@@ -61,12 +61,18 @@ class ClassHierarchyAnalysis extends AbstractAnalysis_1.AbstractAnalysis {
61
61
  continue;
62
62
  }
63
63
  if (possibleCalleeMethod && !possibleCalleeMethod.isAbstract()) {
64
- resolveResult.push(this.cg.getCallSiteManager().newCallSite(invokeStmt, undefined, this.cg.getCallGraphNodeByMethod(possibleCalleeMethod.getSignature()).getID(), callerMethod));
64
+ const nodeID = this.cg.getCallGraphNodeByMethod(possibleCalleeMethod.getSignature()).getID();
65
+ resolveResult.push(this.newRecordedCallSite(invokeStmt, nodeID, callerMethod));
65
66
  }
66
67
  }
67
68
  }
68
69
  return resolveResult;
69
70
  }
71
+ newRecordedCallSite(invokeStmt, calleeFuncID, callerMethod) {
72
+ const cs = this.cg.getCallSiteManager().newCallSite(invokeStmt, undefined, calleeFuncID, callerMethod);
73
+ this.cg.recordCallSite(invokeStmt, cs);
74
+ return cs;
75
+ }
70
76
  preProcessMethod() {
71
77
  // do nothing
72
78
  return [];
@@ -10,14 +10,161 @@ export declare class RapidTypeAnalysis extends AbstractAnalysis {
10
10
  private ignoredCalls;
11
11
  private virtualDispatchIndex;
12
12
  private enableThisPrune;
13
+ private callbackBindings;
14
+ private callbackFieldBindings;
15
+ private closureTraceVisited;
16
+ private aliasTypeUnwrapVisited;
17
+ private executableCalleeScratch;
18
+ private builtinArrayClassSignature;
19
+ private builtinArrayClassResolved;
20
+ private static readonly CALLBACK_CLASS_SIG_KEY;
13
21
  constructor(scene: Scene, cg: CallGraph, cb: CallGraphBuilder, enableThisPrune?: boolean);
14
22
  protected init(): void;
15
23
  resolveCall(callerMethod: NodeID, invokeStmt: Stmt): CallSite[];
24
+ private resolveDirectOrVirtual;
25
+ /**
26
+ * Single args scan:
27
+ * - if any executable real callee exists (or declared callee has CFG), record callback bindings
28
+ * (concrete FunctionType) or forward parameter bindings into callee slots;
29
+ * - otherwise, for no-CFG SDK / built-in / unresolved (`%unk`) callees, append virtual
30
+ * callback CallSites for concrete FunctionType args, parameter bindings, and callback
31
+ * fields.
32
+ */
33
+ private processCallbackArguments;
34
+ /**
35
+ * Bind a FunctionType callback argument to the callee's parameter binding slot.
36
+ * Extracted from processCallbackArguments for readability.
37
+ */
38
+ private bindFunctionTypeCallback;
39
+ /**
40
+ * Bind a ClassType callback (Callback<T>, AsyncCallback<T>, ...) argument to the
41
+ * callee's parameter binding slot via field binding state.
42
+ * Extracted from processCallbackArguments for readability.
43
+ */
44
+ private bindClassTypeCallback;
45
+ private scanExecutableCallees;
46
+ private handleNoExecutableCalleePath;
47
+ /**
48
+ * Unresolved declaring file (`@%unk/%unk:...`) — common when type inference fails for
49
+ * built-ins such as Promise.constructor in large apps.
50
+ */
51
+ private isUnresolvedProjectName;
52
+ /**
53
+ * Built-in container APIs that accept FunctionType values without invoking them
54
+ * (writes such as push/set, and lookups such as indexOf/has). Caller must already
55
+ * know the method is a `@built-in` SDK method.
56
+ */
57
+ private isBuiltInContainerNonInvokingMethod;
58
+ private isBuiltInContainerNonInvokingMethodByMethodName;
59
+ /**
60
+ * Whether a no-CFG callee should synthesize virtual edges into callback args.
61
+ * OH SDK and unresolved (`%unk`) APIs always qualify. Built-ins qualify by default
62
+ * except container non-invoking APIs (Array.push / Array.indexOf / Map.set / ...).
63
+ * Resolves the CG node and declaring projectName once.
64
+ */
65
+ private shouldSynthesizeVirtualCallback;
66
+ /**
67
+ * Invoke-site gate when {@link resolveInvokeExpr} cannot produce a usable declared method
68
+ * (e.g. `@%unk/%unk: Promise.constructor` with no Scene body).
69
+ */
70
+ private shouldSynthesizeVirtualCallbackFromInvoke;
71
+ /**
72
+ * No-CFG callee that invokes callbacks: emit virtual edges into every callback-shaped argument.
73
+ * Caller must have already gated on {@link shouldSynthesizeVirtualCallback}. Built-in container
74
+ * non-invoking APIs (Array.push / Array.indexOf / Map.set / ...) remain excluded by that gate.
75
+ */
76
+ private appendVirtualCallbackCallSites;
77
+ private resolvePtrInvoke;
78
+ /**
79
+ * Resolve a callback value through all supported representations.
80
+ * A value may have both a concrete static target and a field/binding origin;
81
+ * both paths are retained so later field targets cannot be hidden by the
82
+ * concrete FunctionType fast path.
83
+ */
84
+ private appendCallbackValueCallSites;
85
+ private appendCallbackCallSite;
86
+ private subscribeToCallbackField;
87
+ /**
88
+ * Subscribe invokeStmt to bindingState and collect already-known targets as CallSites.
89
+ * Late-arriving targets are delivered via addCallbackTarget → emitCallbackEdge.
90
+ */
91
+ private subscribeAndCollectBoundTargets;
92
+ private getTypeFromAliasType;
93
+ /**
94
+ * Whether a type can serve as a callback — FunctionType (direct or aliased)
95
+ * or a ClassType callback wrapper (Callback<T>, AsyncCallback<T>, ...).
96
+ *
97
+ * Unlike {@link unwrapFunctionType}, this accepts ClassType callbacks whose real
98
+ * FunctionType is only discoverable at the assignment site (right-hand side),
99
+ * not from the ClassType itself. This lets the field-subscription and field-store
100
+ * pipelines accept `private cb: Callback<X> = (...) => {...}` fields.
101
+ */
102
+ private isCallbackType;
103
+ /**
104
+ * Peel AliasType layers until a FunctionType is found.
105
+ * Fast-path: FunctionType returns immediately; non-alias types return undefined
106
+ * without touching the visited scratch set.
107
+ */
108
+ private unwrapFunctionType;
109
+ private resolveFuncPtrToBindingState;
110
+ private resolveFuncPtrToBindingKey;
111
+ /**
112
+ * Resolve a function-pointer local to an instance callback field.
113
+ * The short-term field model follows one local alias at most; it does not
114
+ * perform receiver points-to analysis.
115
+ */
116
+ private resolveFuncPtrToFieldRef;
117
+ private resolveFuncPtrValueToBindingKey;
118
+ /**
119
+ * AliasType-typed ptr locals on invoke exprs may lack declaringStmt even when the
120
+ * method body has a same-named local that carries the real definition.
121
+ */
122
+ private recoverLocalWithDeclaringStmt;
123
+ /**
124
+ * Recursively trace a Local back to a parameter binding key.
125
+ * Follows local aliases and unique closure captures until an ArkParameterRef is
126
+ * found; returns the packed (ownerFuncID, logicalArgIndex) key, or undefined if
127
+ * the value does not originate from a parameter slot.
128
+ */
129
+ private resolveFuncPtrToBindingKeyRec;
130
+ private toLogicalArgIndex;
131
+ private encodeCallbackBindingKey;
132
+ private decodeOwnerFuncID;
133
+ private decodeLogicalArgIndex;
134
+ private getOrCreateBindingState;
135
+ private getCallbackFieldKey;
136
+ private getOrCreateCallbackFieldState;
137
+ private linkCallbackField;
138
+ private addCallbackFieldTarget;
139
+ /**
140
+ * Link a callback field to a callee parameter binding slot. When the field's
141
+ * targets are populated later (e.g. field initializer processed after the
142
+ * call site due to RTA workList ordering), targets propagate to the binding
143
+ * slot via {@link addCallbackFieldTarget} → bindingForwards → addCallbackTarget.
144
+ */
145
+ private linkFieldToBinding;
146
+ private subscribeAndCollectFieldTargets;
147
+ private recordCallbackFieldStore;
148
+ /**
149
+ * Link source parameter binding to a callee parameter slot and copy existing targets.
150
+ * Future addCallbackTarget calls on the source also propagate through forwards.
151
+ */
152
+ private linkCallbackBinding;
153
+ private addCallbackTarget;
154
+ /**
155
+ * Create a CallbackCallSite, register it via CallSiteManager (for ID allocation
156
+ * and getCallSiteById lookup) and via CallGraph maps (for getCallSiteByStmt and
157
+ * getCallSitesByMethod lookup). The argIndex is set for callback virtual edges
158
+ * and left undefined for regular (direct/virtual/constructor) call sites.
159
+ */
160
+ private newRTACallSite;
161
+ private emitCallbackEdge;
16
162
  private getOrBuildVirtualDispatchRows;
17
163
  private tryResolveAggressiveThisPruneCall;
18
164
  private resolveConstructorClassFromNew;
19
165
  protected preProcessMethod(funcID: FuncID): CallSite[];
20
166
  private collectInstancedClassesInMethod;
167
+ private getBuiltinArrayClassSignature;
21
168
  addIgnoredCalls(arkClass: ClassSignature, callerID: FuncID, calleeID: FuncID, invokeStmt: Stmt): void;
22
169
  }
23
170
  //# sourceMappingURL=RapidTypeAnalysis.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"RapidTypeAnalysis.d.ts","sourceRoot":"","sources":["../../../src/callgraph/algorithm/RapidTypeAnalysis.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAiB,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAE3D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,MAAM,EAAE,MAAM,oCAAoC,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAGtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAarE,qBAAa,iBAAkB,SAAQ,gBAAgB;IAEnD,OAAO,CAAC,gBAAgB,CAAkC;IAE1D,OAAO,CAAC,YAAY,CAA2F;IAC/G,OAAO,CAAC,oBAAoB,CAAoE;IAChG,OAAO,CAAC,eAAe,CAAU;gBAErB,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,gBAAgB,EAAE,eAAe,GAAE,OAAe;IAM/F,SAAS,CAAC,IAAI,IAAI,IAAI;IAYf,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,GAAG,QAAQ,EAAE;IAgFtE,OAAO,CAAC,6BAA6B;IA6CrC,OAAO,CAAC,iCAAiC;IAkCzC,OAAO,CAAC,8BAA8B;IAqCtC,SAAS,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,EAAE;IA2BtD,OAAO,CAAC,+BAA+B;IA+BhC,eAAe,CAAC,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,GAAG,IAAI;CAK/G"}
1
+ {"version":3,"file":"RapidTypeAnalysis.d.ts","sourceRoot":"","sources":["../../../src/callgraph/algorithm/RapidTypeAnalysis.ts"],"names":[],"mappings":"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"}