def check_unary_arith(in_type, op):#{{{ in_impli_cls = casts.findImplicitCastTypes(in_type.__class__) out_impli_cls = in_impli_cls out_impli_cls = [ocls for ocls in out_impli_cls \ if issubclass(ocls,rtypes.TypeNumber)] if(not out_impli_cls): return False out_impli_cls = rtypes.mostSpecializedTypesCls(out_impli_cls) assert len(out_impli_cls) == 1, "Multiple output types for " + \ "arithmetic operation found: " + str(out_impli_cls) out_cls = out_impli_cls[0] return out_cls(in_type.has_missing)#}}}
def castImplicitCommonTypeDual(type1, type2): if(type1 == type2): return type1 in1_impli_cls = findImplicitCastTypes(type1.__class__) in2_impli_cls = findImplicitCastTypes(type2.__class__) out_impli_cls = in1_impli_cls & in2_impli_cls while out_impli_cls: out_cls = rtypes.mostSpecializedTypesCls(out_impli_cls) assert len(out_cls) == 1, \ "Multiple implicit common types found" out_cls = out_cls[0] res = out_cls.commonType(type1, type2) if(not res is False): break out_impli_cls.discard(out_cls) return res