jitcraft/Types.cpp
changeset 63 dd57743d220e
parent 59 b7d61ddb3c8d
child 67 b765a6383849
     1.1 --- a/jitcraft/Types.cpp	Sun Jul 08 15:23:48 2012 -0700
     1.2 +++ b/jitcraft/Types.cpp	Sun Jul 08 16:49:17 2012 -0700
     1.3 @@ -109,3 +109,44 @@
     1.4      type->parameters_ = parameters;
     1.5      return type;
     1.6  }
     1.7 +
     1.8 +bool
     1.9 +Type::Compare(Type *left, Type *right)
    1.10 +{
    1.11 +    if (left->kind() != right->kind())
    1.12 +        return false;
    1.13 +
    1.14 +    switch (left->kind()) {
    1.15 +      case Type::PRIMITIVE:
    1.16 +        return (left->primitive() == right->primitive() &&
    1.17 +                left->tag() == right->tag());
    1.18 +
    1.19 +      case Type::ARRAY:
    1.20 +      {
    1.21 +        if (left->levels() != right->levels())
    1.22 +          return false;
    1.23 +        if (left->elements() != right->elements())
    1.24 +          return false;
    1.25 +        return Compare(left->contained(), right->contained());
    1.26 +      }
    1.27 +
    1.28 +      case Type::FUNCTION:
    1.29 +      {
    1.30 +        if (!Compare(left->returnType(), right->returnType()))
    1.31 +            return false;
    1.32 +        if (left->parameters()->length() != right->parameters()->length())
    1.33 +            return false;
    1.34 +        for (unsigned i = 0; i < left->parameters()->length(); i++) {
    1.35 +            Type *leftparam = left->parameterAt(i);
    1.36 +            Type *rightparam = right->parameterAt(i);
    1.37 +            if (!Compare(leftparam, rightparam))
    1.38 +                return false;
    1.39 +        }
    1.40 +        return true;
    1.41 +      }
    1.42 +
    1.43 +      default:
    1.44 +        assert(left->kind() == Type::REFERENCE);
    1.45 +        return Compare(left->contained(), right->contained());
    1.46 +    }
    1.47 +}