소스 검색

compiler: return short evaluation of preprocessor expressions with AND or OR. This fixes univint package compilation.

git-svn-id: trunk@25466 -
paul 12 년 전
부모
커밋
06e7808f64
1개의 변경된 파일32개의 추가작업 그리고 12개의 파일을 삭제
  1. 32 12
      compiler/scanner.pas

+ 32 - 12
compiler/scanner.pas

@@ -1870,11 +1870,10 @@ type
           hs1,hs2: texprvalue;
           hs1,hs2: texprvalue;
           op: ttoken;
           op: ttoken;
         begin
         begin
-          if pred_level=highest_precedence then
-            result:=preproc_factor(eval)
-          else
-            result:=preproc_sub_expr(succ(pred_level),eval);
-
+           if pred_level=highest_precedence then
+             result:=preproc_factor(eval)
+           else
+             result:=preproc_sub_expr(succ(pred_level),eval);
           repeat
           repeat
             op:=current_scanner.preproc_token;
             op:=current_scanner.preproc_token;
             if (op in preproc_operators) and
             if (op in preproc_operators) and
@@ -1882,14 +1881,35 @@ type
              begin
              begin
                hs1:=result;
                hs1:=result;
                preproc_consume(op);
                preproc_consume(op);
-               if pred_level=highest_precedence then
-                 hs2:=preproc_factor(eval)
-               else
-                 hs2:=preproc_sub_expr(succ(pred_level),eval);
-               if eval then
-                 result:=hs1.evaluate(hs2,op)
+               if (op=_OP_OR)and is_boolean(hs1.def) and hs1.asBool then
+                 begin
+                   { stop evaluation the rest of expression }
+                   result:=texprvalue.create_bool(true);
+                   if pred_level=highest_precedence then
+                     hs2:=preproc_factor(false)
+                   else
+                     hs2:=preproc_sub_expr(succ(pred_level),false);
+                 end
+               else if (op=_OP_AND)and is_boolean(hs1.def) and not hs1.asBool then
+                 begin
+                   { stop evaluation the rest of expression }
+                   result:=texprvalue.create_bool(false);
+                   if pred_level=highest_precedence then
+                     hs2:=preproc_factor(false)
+                   else
+                     hs2:=preproc_sub_expr(succ(pred_level),false);
+                 end
                else
                else
-                 result:=texprvalue.create_bool(false); {Just to have something}
+                 begin
+                   if pred_level=highest_precedence then
+                     hs2:=preproc_factor(eval)
+                   else
+                     hs2:=preproc_sub_expr(succ(pred_level),eval);
+                   if eval then
+                     result:=hs1.evaluate(hs2,op)
+                   else
+                     result:=texprvalue.create_bool(false); {Just to have something}
+                 end;
                hs1.free;
                hs1.free;
                hs2.free;
                hs2.free;
              end
              end