Beispiel #1
0
        public override BasicValue Merge(BasicValue value1, BasicValue value2)
        {
            if (!value1.Equals(value2))
            {
                var type1 = value1.GetType();
                var type2 = value2.GetType();
                if (type1 != null && (type1.GetSort() == Type.Object || type1.GetSort() == Type.Array
                                      ) && type2 != null && (type2.GetSort() == Type.Object || type2.GetSort() == Type
                                                             .Array))
                {
                    if (type1.Equals(Null_Type))
                    {
                        return(value2);
                    }
                    if (type2.Equals(Null_Type))
                    {
                        return(value1);
                    }
                    if (IsAssignableFrom(type1, type2))
                    {
                        return(value1);
                    }
                    if (IsAssignableFrom(type2, type1))
                    {
                        return(value2);
                    }
                    var numDimensions = 0;
                    if (type1.GetSort() == Type.Array && type2.GetSort() == Type.Array && type1.GetDimensions
                            () == type2.GetDimensions() && type1.GetElementType().GetSort() == Type.Object &&
                        type2.GetElementType().GetSort() == Type.Object)
                    {
                        numDimensions = type1.GetDimensions();
                        type1         = type1.GetElementType();
                        type2         = type2.GetElementType();
                    }

                    while (true)
                    {
                        if (type1 == null || IsInterface(type1))
                        {
                            return(NewArrayValue(Type.GetObjectType("java/lang/Object"), numDimensions));
                        }
                        type1 = GetSuperClass(type1);
                        if (IsAssignableFrom(type1, type2))
                        {
                            return(NewArrayValue(type1, numDimensions));
                        }
                    }
                }

                return(BasicValue.Uninitialized_Value);
            }

            return(value1);
        }
Beispiel #2
0
 /// <summary>
 ///     Returns whether the type corresponding to the first argument is a subtype of the type
 ///     corresponding to the second argument.
 /// </summary>
 /// <param name="value">a value.</param>
 /// <param name="expected">another value.</param>
 /// <returns>
 ///     whether the type corresponding to 'value' is a subtype of the type corresponding to
 ///     'expected'.
 /// </returns>
 protected internal virtual bool IsSubTypeOf(BasicValue value, BasicValue expected
                                             )
 {
     return(value.Equals(expected));
 }