static trace_t trace_type_union(ast_t* type) { trace_t trace = TRACE_NONE; for(ast_t* child = ast_child(type); child != NULL; child = ast_sibling(child)) { trace_t t = trace_type(child); switch(trace) { case TRACE_NONE: trace = t; break; case TRACE_MAYBE: // Can't be in a union. pony_assert(0); return TRACE_NONE; case TRACE_MACHINE_WORD: trace = trace_union_machine_word(t); break; case TRACE_PRIMITIVE: trace = trace_union_primitive(t); break; case TRACE_MUT_KNOWN: case TRACE_MUT_UNKNOWN: trace = trace_union_mut(t); break; case TRACE_VAL_KNOWN: case TRACE_VAL_UNKNOWN: trace = trace_union_val(t); break; case TRACE_TAG_KNOWN: case TRACE_TAG_UNKNOWN: trace = trace_union_tag(t); break; case TRACE_DYNAMIC: case TRACE_TUPLE: return TRACE_DYNAMIC; case TRACE_STATIC: // Can't happen here. pony_assert(0); return TRACE_DYNAMIC; } } return trace; }
static trace_t trace_type_combine(trace_t a, trace_t b) { if(a > b) { trace_t tmp = a; a = b; b = tmp; } assert(a <= b); switch(a) { case TRACE_NONE: return b; case TRACE_PRIMITIVE: return trace_union_primitive(b); case TRACE_ACTOR: return trace_union_actor(b); case TRACE_KNOWN: case TRACE_UNKNOWN: return trace_union_known_or_unknown(b); case TRACE_KNOWN_VAL: case TRACE_UNKNOWN_VAL: return trace_union_known_or_unknown_val(b); case TRACE_TAG: case TRACE_TAG_OR_ACTOR: return trace_union_tag_or_actor(b); case TRACE_DYNAMIC: case TRACE_TUPLE: return TRACE_DYNAMIC; default: {} } assert(0); return TRACE_NONE; }