|
|
@@ -1633,6 +1633,7 @@ PROCEDURE LowerBuiltinExpr (n: AST.Node; nm: SymTab.Name;
|
|
|
VAR et, et2, dt, vt: SymTab.TypeIndex; qa, qt, q2, qd, qr: QbeGen.QVal;
|
|
|
k, lo, hi, c1, c2, ucp: INTEGER; qn, vn: SymTab.Name; sfx: BOOLEAN;
|
|
|
isMax, isU, uok: BOOLEAN;
|
|
|
+ lit: ARRAY [0 .. 255] OF CHAR;
|
|
|
BEGIN
|
|
|
IF SymTab.Equal(nm, "ODD") THEN
|
|
|
LowerExpr(AST.Child(n, 1), et, q);
|
|
|
@@ -1706,9 +1707,9 @@ PROCEDURE LowerBuiltinExpr (n: AST.Node; nm: SymTab.Name;
|
|
|
IF AST.Kind(AST.Child(n, 1)) = AST.NkStrLit THEN
|
|
|
(* LEN("literal"): the content length of the literal; a real
|
|
|
string literal is still declared, as the grammar does *)
|
|
|
- Name(AST.Child(n, 1), qn);
|
|
|
- IF (qn[0] = "U") OR (qn[0] = "u") THEN
|
|
|
- QbeGen.DeclUStr(qn, qd, isU, ucp, uok);
|
|
|
+ Name(AST.Child(n, 1), lit);
|
|
|
+ IF (lit[0] = "U") OR (lit[0] = "u") THEN
|
|
|
+ QbeGen.DeclUStr(lit, qd, isU, ucp, uok);
|
|
|
IF NOT uok THEN t := SymTab.InvalidType; QbeGen.CopyOp("0", q)
|
|
|
ELSIF isU THEN
|
|
|
IF SymTab.Equal(nm, "HIGH") THEN QbeGen.CopyOp("0", q)
|
|
|
@@ -1721,8 +1722,8 @@ PROCEDURE LowerBuiltinExpr (n: AST.Node; nm: SymTab.Name;
|
|
|
QbeGen.CopyOp(qr, q); t := SymTab.IntType()
|
|
|
END
|
|
|
ELSE
|
|
|
- IF SymTab.StrLen(qn) = 3 THEN c1 := 1
|
|
|
- ELSE QbeGen.DeclStr(qn, qd); c1 := SymTab.StrLen(qn) - 2
|
|
|
+ IF SymTab.StrLen(lit) = 3 THEN c1 := 1
|
|
|
+ ELSE QbeGen.DeclStr(lit, qd); c1 := SymTab.StrLen(lit) - 2
|
|
|
END;
|
|
|
IF SymTab.Equal(nm, "HIGH") THEN DEC(c1) END;
|
|
|
QbeGen.IntStr(c1, q); t := SymTab.IntType()
|
|
|
@@ -2195,6 +2196,7 @@ PROCEDURE LowerExprFull (n: AST.Node; VAR t: SymTab.TypeIndex;
|
|
|
i: CARDINAL; el, seq, next: AST.Node;
|
|
|
lw, rw, mw: CARDINAL; idx: INTEGER; fok, isL: BOOLEAN;
|
|
|
lt, rt: SymTab.TypeIndex; qw: QbeGen.QVal;
|
|
|
+ lit: ARRAY [0 .. 255] OF CHAR;
|
|
|
BEGIN
|
|
|
IF AST.Kind(n) = AST.NkDesignator THEN
|
|
|
LowerDesign(n, t, k, q, qn, sfx);
|
|
|
@@ -2227,10 +2229,10 @@ PROCEDURE LowerExprFull (n: AST.Node; VAR t: SymTab.TypeIndex;
|
|
|
ELSIF AST.Kind(n) = AST.NkRealLit THEN
|
|
|
Name(n, qn); QbeGen.NormReal(qn, q); t := SymTab.RealType()
|
|
|
ELSIF AST.Kind(n) = AST.NkStrLit THEN
|
|
|
- Name(n, qn);
|
|
|
- IF (qn[0] = "U") OR (qn[0] = "u") THEN
|
|
|
+ Name(n, lit);
|
|
|
+ IF (lit[0] = "U") OR (lit[0] = "u") THEN
|
|
|
(* U"..." / U'...': one codepoint -> UCHAR, else a ustring *)
|
|
|
- QbeGen.DeclUStr(qn, q, isU, ucp, uok);
|
|
|
+ QbeGen.DeclUStr(lit, q, isU, ucp, uok);
|
|
|
IF NOT uok THEN
|
|
|
t := SymTab.InvalidType; QbeGen.CopyOp("0", q)
|
|
|
ELSIF isU THEN
|
|
|
@@ -2238,10 +2240,11 @@ PROCEDURE LowerExprFull (n: AST.Node; VAR t: SymTab.TypeIndex;
|
|
|
ELSE
|
|
|
t := AST.Ty(n); IF t = -1 THEN t := SymTab.NewUStr() END; QbeGen.NoteAddr(q, q)
|
|
|
END
|
|
|
- ELSIF SymTab.StrLen(qn) = 3 THEN
|
|
|
- t := SymTab.CharType(); QbeGen.IntStr(QbeGen.CharVal(qn), q)
|
|
|
+ ELSIF SymTab.StrLen(lit) = 3 THEN
|
|
|
+ t := SymTab.CharType(); QbeGen.IntStr(QbeGen.CharVal(lit), q)
|
|
|
ELSE
|
|
|
- t := AST.Ty(n); IF t = -1 THEN t := SymTab.NewStr() END; QbeGen.DeclStr(qn, q); QbeGen.NoteAddr(q, q)
|
|
|
+ t := AST.Ty(n); IF t = -1 THEN t := SymTab.NewStr() END;
|
|
|
+ QbeGen.DeclStr(lit, q); QbeGen.NoteAddr(q, q)
|
|
|
END
|
|
|
ELSIF AST.Kind(n) = AST.NkSetLit THEN
|
|
|
t := AST.Ty(n); IF t = -1 THEN t := SymTab.NewSet(SymTab.NewSubR(0, 255)) END;
|