pike.git/
src/
pike_types.cmod
Branch:
Tag:
Non-build tags
All tags
No tags
2020-10-01
2020-10-01 11:19:08 by Henrik Grubbström (Grubba) <grubba@grubba.org>
50481487c7c944b3829c1fe144324ca25d7692ad (
17
lines) (+
12
/-
5
)
[
Show
|
Annotate
]
Branch:
master
Compiler
[Typechecker]
: Fixed multiple bugs in subtract_types().
4123:
*/ tmp = low_subtract_types(a, b->car, remap, aflags, bflags, remap_flags); if (!tmp) return NULL;
-
ret = low_
intersect
_types(tmp,
b->cdr
,
remap
, aflags, bflags,
remap_flags
);
+
/* NB: We need to remap b->cdr separately to avoid remapping
+
* markers in a and b->car twice.
+
*/
+
tmp2 = remap_markers(b->cdr, remap,
+
remap_flags ^ PT_FLAG_REMAP_SWAP_MARKERS);
+
ret = low_
subtract
_types(tmp,
tmp2
,
NULL
, aflags, bflags,
0
);
free_type(tmp);
-
+
free_type(tmp2);
return ret; case T_AND:
4133:
* a & ~(b1 & b2) <==> a & (~b1 | ~b2) <==> (a & ~b1) | (a & ~b2) */ tmp = low_subtract_types(a, b->car, remap, aflags, bflags, remap_flags);
-
tmp2 = low_
intersect
_types(a, b->cdr, remap, aflags, bflags, remap_flags);
+
tmp2 = low_
subtract
_types(a, b->cdr, remap, aflags, bflags, remap_flags);
if (!tmp2) return tmp; ret = or_pike_types(tmp, tmp2, 0); free_type(tmp);
4264:
if (tmp == ai) { got_full = 1; } else {
+
free_type(tmp);
break; } free_type(tmp);
4285:
if (tmp == aret) { got_full = 1; } else {
+
free_type(tmp);
break; } free_type(tmp);
4422:
} if (a->type == T_MIXED) { type_stack_mark();
-
push_type(T_MIXED);
+
push_remap_markers(b, remap, remap_flags ^ PT_FLAG_REMAP_SWAP_MARKERS); push_type(T_NOT);
-
push_reverse_type(T_AND);
+
return pop_unfinished_type(); }
4435:
if (a->type == T_NOT) { /* DeMorgan and(not(a), not(b)) <==> not(or(a, b)) */ type_stack_mark();
-
push_remap_markers(a, remap, remap_flags);
+
push_remap_markers(a
->car
, remap, remap_flags);
push_remap_markers(b, remap, remap_flags ^ PT_FLAG_REMAP_SWAP_MARKERS); push_type(T_OR); push_type(T_NOT);