pike.git/
src/
pike_types.cmod
Branch:
Tag:
Non-build tags
All tags
No tags
2020-10-03
2020-10-03 12:24:59 by Henrik Grubbström (Grubba) <grubba@grubba.org>
1af963b6fa6ec23d5d140b3df7440e76515e968b (
91
lines) (+
75
/-
16
)
[
Show
|
Annotate
]
Branch:
master
Compiler
[Typechecker]
: Attempt to reduce amount of type expansion.
4771:
/* Check consolidated types. */ switch(a->type) { case T_OR:
+
tmp = low_intersect_types(a->car, b, remap, aflags, bflags, remap_flags);
+
tmp2 = low_intersect_types(a->cdr, b, remap, aflags, bflags, remap_flags);
+
if (!tmp2) return tmp;
+
if (!tmp) return tmp2;
+
+
type_stack_mark();
+
push_finished_type(tmp);
+
push_finished_type(tmp2);
+
push_reverse_type(T_OR);
+
free_type(tmp);
+
free_type(tmp2);
+
return pop_unfinished_type();
+
case T_AND:
-
+
/* NB: Attempt to avoid keeping the result from inverted types,
+
* in order to reduce type expansion.
+
*/
+
if (a->car->type == T_NOT) {
+
tmp2 = low_intersect_types(a->cdr, b, remap, aflags, bflags, remap_flags);
+
if (!tmp2) return NULL;
tmp = low_intersect_types(a->car, b, remap, aflags, bflags, remap_flags);
-
if (!tmp
&&
(a->
type
=
=
T
_
AND
)) return NULL;
+
if (!tmp
)
{
+
free_type
(
tmp2);
+
return NULL;
+
}
+
free_type(tmp);
+
tmp = remap_markers(
a->
car,
remap, remap_flags);
+
} else {
+
tmp
=
low
_
intersect_types(a->car, b, remap, aflags, bflags, remap_flags
)
;
+
if (!tmp
) return NULL;
tmp2 = low_intersect_types(a->cdr, b, remap, aflags, bflags, remap_flags); if (!tmp2) {
-
if (a->type == T_OR) return tmp;
+
free_type(tmp); return NULL; }
-
if (
!tmp
) {
-
return
tmp2;
+
if (
a->cdr->type == T_NOT
) {
+
free_type(
tmp2
)
;
+
tmp2 = remap_markers(a->cdr, remap, remap_flags);
}
-
+
}
+
type_stack_mark(); push_finished_type(tmp); push_finished_type(tmp2);
-
push_reverse_type(
a->type
);
+
push_reverse_type(
T_AND
);
free_type(tmp); free_type(tmp2); return pop_unfinished_type(); } switch(b->type) { case T_OR:
-
+
tmp = low_intersect_types(a, b->car, remap, aflags, bflags, remap_flags);
+
tmp2 = low_intersect_types(a, b->cdr, remap, aflags, bflags, remap_flags);
+
if (!tmp2) return tmp;
+
if (!tmp) return tmp2;
+
+
type_stack_mark();
+
push_finished_type(tmp);
+
push_finished_type(tmp2);
+
push_reverse_type(T_OR);
+
free_type(tmp);
+
free_type(tmp2);
+
return pop_unfinished_type();
+
case T_AND:
-
+
/* NB: Attempt to avoid keeping the result from inverted types,
+
* in order to reduce type expansion.
+
*/
+
if (b->car->type == T_NOT) {
+
tmp = low_intersect_types(a, b->cdr, remap, aflags, bflags, remap_flags);
+
if (!tmp) return NULL;
+
tmp2 = low_intersect_types(a, b->car, remap, aflags, bflags, remap_flags);
+
if (tmp2) {
+
free_type(tmp2);
+
tmp2 = remap_markers(b->car, remap,
+
remap_flags ^ PT_FLAG_REMAP_SWAP_MARKERS);
+
}
+
} else {
tmp = low_intersect_types(a, b->car, remap, aflags, bflags, remap_flags);
-
if (!tmp
&& (b->type == T_AND
)
)
return NULL;
+
if (!tmp) return NULL;
tmp2 = low_intersect_types(a, b->cdr, remap, aflags, bflags, remap_flags);
-
+
if (tmp2 && (b->cdr->type == T_NOT)) {
+
free_type(tmp2);
+
tmp2 = remap_markers(b->cdr, remap,
+
remap_flags ^ PT_FLAG_REMAP_SWAP_MARKERS);
+
}
+
}
if (!tmp2) {
-
if (b->type == T_OR) return tmp;
+
free_type(tmp); return NULL; }
-
if (!tmp) {
-
return tmp2;
-
}
+
type_stack_mark(); push_finished_type(tmp); push_finished_type(tmp2);
-
push_reverse_type(
b->type
);
+
push_reverse_type(
T_AND
);
free_type(tmp); free_type(tmp2); return pop_unfinished_type();