Example #1
0
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;
}
Example #2
0
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;
}