compiler: move OR and AND preprocessor evaluation to texprvalue.evaluate

git-svn-id: trunk@25464 -
This commit is contained in:
paul 2013-09-12 06:59:12 +00:00
parent 7ecaaf0ef8
commit 6eba4226b6

View File

@ -1043,6 +1043,38 @@ type
result:=texprvalue.create_error;
end;
end;
_OP_OR:
begin
if is_boolean(def) then
if is_boolean(v.def) then
result:=texprvalue.create_bool(asBool or v.asBool)
else
begin
v.error('Boolean','OR');
result:=texprvalue.create_error;
end
else
begin
error('Boolean','OR');
result:=texprvalue.create_error;
end;
end;
_OP_AND:
begin
if is_boolean(def) then
if is_boolean(v.def) then
result:=texprvalue.create_bool(asBool and v.asBool)
else
begin
v.error('Boolean','AND');
result:=texprvalue.create_error;
end
else
begin
error('Boolean','AND');
result:=texprvalue.create_error;
end;
end;
_EQ,_NE,_LT,_GT,_GTE,_LTE,_PLUS,_MINUS,_STAR,_SLASH:
if check_compatbile then
begin
@ -1833,81 +1865,54 @@ type
function read_term(eval: Boolean):texprvalue;
var
hs1,hs2: texprvalue;
b: boolean;
begin
hs1:=read_factor(eval);
result:=read_factor(eval);
repeat
if (current_scanner.preproc_token<>_ID) then
break;
if current_scanner.preproc_pattern<>'AND' then
break;
if eval then
begin
{Check if first expr is boolean. Must be done here, after we know
it is an AND expression.}
if not is_boolean(hs1.def) then
hs1.error('Boolean', 'AND');
eval:=hs1.asBool; {Short circuit evaluation of AND}
end;
preproc_consume(_ID);
hs2:=read_factor(eval);
if eval then
begin
if not is_boolean(hs2.def) then
hs2.error('Boolean', 'AND');
b:=hs1.asBool and hs2.asBool;
hs1:=result;
result:=hs1.evaluate(hs2,_OP_AND);
hs1.free;
hs2.free;
hs1:=texprvalue.create_bool(b);
end
else
hs2.free;
until false;
result:=hs1;
end;
function read_simple_expr(eval: Boolean): texprvalue;
var
hs1,hs2: texprvalue;
b: boolean;
begin
hs1:=read_term(eval);
result:=read_term(eval);
repeat
if (current_scanner.preproc_token<>_ID) then
break;
if current_scanner.preproc_pattern<>'OR' then
break;
if eval then
begin
{Check if first expr is boolean. Must be done here, after we know
it is an OR expression.}
if not is_boolean(hs1.def) then
hs1.error('Boolean', 'OR');
eval:=not hs1.asBool; {Short circuit evaluation of OR}
end;
break;
preproc_consume(_ID);
hs2:=read_term(eval);
if eval then
begin
if not is_boolean(hs2.def) then
hs2.error('Boolean', 'OR');
b:=hs1.asBool or hs2.asBool;
hs1:=result;
result:=hs1.evaluate(hs2,_OP_OR);
hs1.free;
hs2.free;
hs1:=texprvalue.create_bool(b);
end
else
hs2.free;
until false;
result:=hs1;
end;
function read_expr(eval:Boolean): texprvalue;