@@ -13,6 +13,8 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
1313@contributor {Mark Hills - [email protected] (CWI)}1414module lang ::php ::analysis ::cfg ::BuildCFG
1515
16+ // TODO: In \catch nodes the name can now be an expr, properly extract labels and edges
17+
1618import lang ::php ::ast ::AbstractSyntax ;
1719import lang ::php ::analysis ::NamePaths ;
1820import lang ::php ::analysis ::cfg ::CFG ;
@@ -522,10 +524,12 @@ public set[Lab] init(Expr e, LabelState lstate) {
522524
523525 case fetchArrayDim (Expr var , OptionExpr _) : return init (var , lstate );
524526
525- case fetchClassConst (name (Name _), str _) : return { e .lab };
527+ case fetchClassConst (name (Name _), name (Name _)) : return { e .lab };
528+
529+ case fetchClassConst (expr (Expr className ), NameOrExpr _) : return init (className , lstate );
530+
531+ case fetchClassConst (name (Name _), expr (Expr constName )) : return init (constName , lstate );
526532
527- case fetchClassConst (expr (Expr className ), str _) : return init (className , lstate );
528-
529533 case assign (Expr _, Expr assignExpr ) : return init (assignExpr , lstate );
530534
531535 case assignWOp (Expr _, Expr assignExpr , Op _) : return init (assignExpr , lstate );
@@ -1475,7 +1479,7 @@ public tuple[FlowEdges,LabelState] internalFlow(Stmt s, LabelState lstate) {
14751479 lstate .nodes = lstate .nodes + footerNode (s , headernode , footernode )[lab =footernode ];
14761480
14771481 oldHandlers = lstate .catchHandlers ;
1478- for (\catch (_, str xt , cbody ) <- catches ) {
1482+ for (\catch (list [ Name ] xtypes ,_, cbody ) <- catches , name ( xt ) <- xtypes ) {
14791483 if (size (cbody ) > 0 && size (init (head (cbody ), lstate )) > 0 ) {
14801484 lstate .catchHandlers [xt ] = getOneFrom (init (head (cbody ), lstate ));
14811485 } else {
@@ -1511,7 +1515,7 @@ public tuple[FlowEdges,LabelState] internalFlow(Stmt s, LabelState lstate) {
15111515 lstate .nodes = lstate .nodes + footerNode (s , headernode , footernode )[lab =footernode ];
15121516
15131517 oldHandlers = lstate .catchHandlers ;
1514- for (\catch (_, str xt , cbody ) <- catches ) {
1518+ for (\catch (list [ Name ] xtypes ,_, cbody ) <- catches , name ( xt ) <- xtypes ) {
15151519 if (size (cbody ) > 0 && size (init (head (cbody ), lstate )) > 0 ) {
15161520 lstate .catchHandlers [xt ] = getOneFrom (init (head (cbody ), lstate ));
15171521 } else if (size (finallyBody ) > 0 && size (init (head (finallyBody ), lstate )) > 0 ) {
@@ -1651,11 +1655,22 @@ public tuple[FlowEdges,LabelState] internalFlow(Expr e, LabelState lstate) {
16511655 edges += makeEdges (final (var , lstate ), finalLabels );
16521656 }
16531657
1654- case fetchClassConst (expr (Expr className ), str _ ) : {
1658+ case fetchClassConst (expr (Expr className ), name ( Name _) ) : {
16551659 < edges , lstate > = addExpEdges (edges , lstate , className );
16561660 edges += makeEdges (final (className , lstate ), finalLabels );
16571661 }
1658-
1662+
1663+ case fetchClassConst (name (Name _), expr (Expr constName )) : {
1664+ < edges , lstate > = addExpEdges (edges , lstate , constName );
1665+ edges += makeEdges (final (constName , lstate ), finalLabels );
1666+ }
1667+
1668+ case fetchClassConst (expr (Expr className ), expr (Expr constName )) : {
1669+ < edges , lstate > = addExpEdges (edges , lstate , className );
1670+ < edges , lstate > = addExpEdges (edges , lstate , constName );
1671+ edges = edges + makeEdges (final (className , lstate ), init (constName , lstate )) + makeEdges (final (constName , lstate ), finalLabels );
1672+ }
1673+
16591674 case assign (Expr assignTo , Expr assignExpr ) : {
16601675 < edges , lstate > = addExpEdges (edges , lstate , assignExpr );
16611676 < edges , lstate > = addExpEdges (edges , lstate , assignTo );
0 commit comments