Skip to content

Commit 4762a63

Browse files
committed
Fix issues with inconsistent name handling
1 parent cb03223 commit 4762a63

File tree

7 files changed

+37
-18
lines changed

7 files changed

+37
-18
lines changed

src/main/rascal/lang/php/analysis/cfg/BuildCFG.rsc

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
1313
@contributor{Mark Hills - [email protected] (CWI)}
1414
module lang::php::analysis::cfg::BuildCFG
1515

16+
// TODO: In \catch nodes the name can now be an expr, properly extract labels and edges
17+
1618
import lang::php::ast::AbstractSyntax;
1719
import lang::php::analysis::NamePaths;
1820
import 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);

src/main/rascal/lang/php/analysis/evaluators/DefinedConstants.rsc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ public Script evalConsts(loc scriptLoc, Script scr, ConstInfo cinfo, set[Include
7676
7777
// Replace constants and class constants with their defining values where possible
7878
scr = visit(scr) {
79-
case c:fetchClassConst(name(name(cln)), str cn) : {
79+
case c:fetchClassConst(name(name(cln)), name(name(cn))) : {
8080
if (cln in cinfo.classConstMap && cn in cinfo.classConstMap[cln]) {
8181
insert(cinfo.classConstMap[cln][cn][at=c.at]);
8282
} else if (cln in classConstsInScript && cn in classConstsInScript[cln]) {
@@ -100,7 +100,7 @@ public set[ConstItem] getScriptConstUses(Script scr) {
100100
visit(scr) {
101101
case fetchConst(name(s)) :
102102
res += normalConst(s);
103-
case fetchClassConst(name(name(cln)), cn) :
103+
case fetchClassConst(name(name(cln)), name(name(cn))) :
104104
res += classConst(cln, cn);
105105
}
106106
return res;

src/main/rascal/lang/php/analysis/includes/QuickResolve.rsc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public Expr replaceConstants(Expr e, IncludesInfo iinfo) {
2929
case fc:fetchConst(name(cn)) => (iinfo.constMap[cn])[at=fc.at]
3030
when cn in iinfo.constMap
3131

32-
case fcc:fetchClassConst(name(name(cln)),str cn) => (iinfo.classConstMap[cln][cn])[at=fcc.at]
32+
case fcc:fetchClassConst(name(name(cln)),name(name(cn))) => (iinfo.classConstMap[cln][cn])[at=fcc.at]
3333
when cln in iinfo.classConstMap && cn in iinfo.classConstMap[cln]
3434
}
3535
}

src/main/rascal/lang/php/analysis/includes/ScriptResolve.rsc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ public tuple[rel[loc,loc] resolved, lrel[str,datetime] timings] scriptResolve(Sy
166166
Expr resolveConstExpr(Expr resolveExpr, loc constLoc) {
167167
// Get the constants used inside resolveExpr
168168
usedConstants = { normalConst(cn) | /fetchConst(name(cn)) := resolveExpr } +
169-
{ classConst(cln,cn) | /fetchClassConst(name(name(cln)),str cn) := resolveExpr };
169+
{ classConst(cln,cn) | /fetchClassConst(name(name(cln)),name(name(cn))) := resolveExpr };
170170
171171
// Find any of these that are uniquely defined (e.g., defined once or always defined as the
172172
// same literal expression)

src/main/rascal/lang/php/ast/AbstractSyntax.rsc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ public data PHPType
8484
public data Expr(loc at=|unknown:///|, loc decl=|unknown:///|, str id="", loc scope=|unknown:///|, str phpdoc="")
8585
= array(list[ArrayElement] items, bool usesBracketNotation)
8686
| fetchArrayDim(Expr var, OptionExpr dim)
87-
| fetchClassConst(NameOrExpr className, str constantName)
87+
| fetchClassConst(NameOrExpr className, NameOrExpr classConstantName)
8888
| assign(Expr assignTo, Expr assignExpr)
8989
| assignWOp(Expr assignTo, Expr assignExpr, Op operation)
9090
| listAssign(list[OptionExpr] assignsTo, Expr assignExpr) // NOTE: deprecated, no longer appears in ASTs
@@ -223,7 +223,7 @@ public data Declaration(loc at=|unknown:///|, loc decl=|unknown:///|, str id="",
223223
= declaration(str key, Expr val);
224224

225225
public data Catch(loc at=|unknown:///|, loc decl=|unknown:///|, str id="", loc scope=|unknown:///|, str phpdoc="")
226-
= \catch(list[Name] xtypes, str varName, list[Stmt] body);
226+
= \catch(list[Name] xtypes, OptionExpr varName, list[Stmt] body);
227227

228228
public data Case(loc at=|unknown:///|, loc decl=|unknown:///|, str id="", loc scope=|unknown:///|, str phpdoc="")
229229
= \case(OptionExpr cond, list[Stmt] body);

src/main/rascal/lang/php/pp/PrettyPrinter.rsc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ public str pp(fetchArrayDim(Expr var, someExpr(Expr dim))) = "<pp(var)>[<pp(dim)
9292
public str pp(fetchArrayDim(Expr var, noExpr())) = "<pp(var)>[]";
9393
9494
// | fetchClassConst(NameOrExpr className, str constName)
95-
public str pp(fetchClassConst(NameOrExpr className, str constName)) = "<pp(className)>::<pp(constName)>";
95+
public str pp(fetchClassConst(NameOrExpr className, NameOrExpr constName)) = "<pp(className)>::<pp(constName)>";
9696
9797
// | assign(Expr assignTo, Expr assignExpr)
9898
public str pp(assign(Expr assignTo, Expr assignExpr)) = "<pp(assignTo)> = <pp(assignExpr)>";
@@ -521,8 +521,8 @@ public str pp(block(list[Stmt] body)) =
521521
public str pp(declaration(str key, Expr val)) = "<key>=<pp(val)>";
522522
523523
//public data Catch = \catch(list[Name] xtypes, str varName, list[Stmt] body);
524-
public str pp(\catch(list[Name] xtypes, str varName, list[Stmt] body)) =
525-
"catch (<intercalate(" | ", [ pp(xti) | xti <- xtypes ])> <varName>) {
524+
public str pp(\catch(list[Name] xtypes, OptionExpr varName, list[Stmt] body)) =
525+
"catch (<intercalate(" | ", [ pp(xti) | xti <- xtypes ])> <pp(varName)>) {
526526
' <for (b <- body) {><pp(b)><}> }";
527527
528528
//public data Case = \case(OptionExpr cond, list[Stmt] body);

src/main/rascal/lang/php/util/Utils.rsc

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,14 @@ import lang::php::pp::PrettyPrinter;
4040

4141
public str executePHP(list[str] opts, loc cwd) {
4242
str phpBinLoc = usePhpParserJar ? "php" : phpLoc.path;
43-
43+
// logMessage(phpBinLoc,2);
44+
// logMessage("<opts>", 2);
45+
// logMessage("<cwd>", 2);
4446
PID pid = createProcess(phpBinLoc, args=opts, workingDir=cwd);
4547
str phcOutput = readEntireStream(pid);
4648
str phcErr = readEntireErrStream(pid);
49+
// logMessage(phcOutput,2);
50+
// logMessage(phcErr,2);
4751
killProcess(pid);
4852

4953
if (trim(phcErr) == "" || /Fatal error/ !:= phcErr) {
@@ -62,7 +66,7 @@ private Script parsePHPfile(loc f, list[str] opts, Script error) {
6266
if (f.authority != "") {
6367
filePath = f.authority + "/" + filePath;
6468
}
65-
phpOut = executePHP(["-d memory_limit=<parserMemLimit>", "-d short_open_tag=On", (parserLoc + astToRascal).path, "-f<filePath>"] + opts, parserWorkingDir);
69+
phpOut = executePHP(["-d memory_limit=<parserMemLimit>", "-d short_open_tag=On", "-d error_reporting=\"E_ALL & ~E_DEPRECATED & ~E_STRICT\"", (parserLoc + astToRascal).path, "-f<filePath>"] + opts, parserWorkingDir);
6670
} catch _: {
6771
return error;
6872
}

0 commit comments

Comments
 (0)