@@ -617,6 +617,25 @@ module Public {
617617 */
618618 LocalVariable asUninitialized ( ) { result = this .( UninitializedNode ) .getLocalVariable ( ) }
619619
620+ /**
621+ * Gets the uninitialized local variable corresponding to this node behind
622+ * `index` number of indirections, if any.
623+ */
624+ LocalVariable asIndirectUninitialized ( int index ) {
625+ exists ( IndirectUninitializedNode indirectUninitializedNode |
626+ this = indirectUninitializedNode and
627+ indirectUninitializedNode .getIndirectionIndex ( ) = index
628+ |
629+ result = indirectUninitializedNode .getLocalVariable ( )
630+ )
631+ }
632+
633+ /**
634+ * Gets the uninitialized local variable corresponding to this node behind
635+ * a number indirections, if any.
636+ */
637+ LocalVariable asIndirectUninitialized ( ) { result = this .asIndirectUninitialized ( _) }
638+
620639 /**
621640 * Gets the positional parameter corresponding to the node that represents
622641 * the value of the parameter after `index` number of loads, if any. For
@@ -761,16 +780,13 @@ module Public {
761780 final override Type getType ( ) { result = this .getPreUpdateNode ( ) .getType ( ) }
762781 }
763782
764- /**
765- * The value of an uninitialized local variable, viewed as a node in a data
766- * flow graph.
767- */
768- class UninitializedNode extends Node {
783+ abstract private class AbstractUninitializedNode extends Node {
769784 LocalVariable v ;
785+ int indirectionIndex ;
770786
771- UninitializedNode ( ) {
787+ AbstractUninitializedNode ( ) {
772788 exists ( SsaImpl:: Definition def , SsaImpl:: SourceVariable sv |
773- def .getIndirectionIndex ( ) = 0 and
789+ def .getIndirectionIndex ( ) = indirectionIndex and
774790 def .getValue ( ) .asInstruction ( ) instanceof UninitializedInstruction and
775791 SsaImpl:: defToNode ( this , def , sv ) and
776792 v = sv .getBaseVariable ( ) .( SsaImpl:: BaseIRVariable ) .getIRVariable ( ) .getAst ( )
@@ -781,6 +797,25 @@ module Public {
781797 LocalVariable getLocalVariable ( ) { result = v }
782798 }
783799
800+ /**
801+ * The value of an uninitialized local variable, viewed as a node in a data
802+ * flow graph.
803+ */
804+ class UninitializedNode extends AbstractUninitializedNode {
805+ UninitializedNode ( ) { indirectionIndex = 0 }
806+ }
807+
808+ /**
809+ * The value of an uninitialized local variable behind one or more levels of
810+ * indirection, viewed as a node in a data flow graph.
811+ */
812+ class IndirectUninitializedNode extends AbstractUninitializedNode {
813+ IndirectUninitializedNode ( ) { indirectionIndex > 0 }
814+
815+ /** Gets the indirection index of this node. */
816+ int getIndirectionIndex ( ) { result = indirectionIndex }
817+ }
818+
784819 /**
785820 * The value of a parameter at function entry, viewed as a node in a data
786821 * flow graph. This includes both explicit parameters such as `x` in `f(x)`
0 commit comments