Browse Source

Correct type checking during casting related to Object.

Jack Conradson 9 years ago
parent
commit
36f7632232

+ 71 - 0
modules/lang-painless/src/main/java/org/elasticsearch/painless/AnalyzerCaster.java

@@ -40,6 +40,10 @@ public final class AnalyzerCaster {
                     case DEF:
                     case DEF:
                         return new Cast(actual, Definition.DEF_TYPE, explicit, false, false, true, false);
                         return new Cast(actual, Definition.DEF_TYPE, explicit, false, false, true, false);
                     case OBJECT:
                     case OBJECT:
+                        if (Definition.OBJECT_TYPE.equals(expected) && internal)
+                            return new Cast(actual, actual, explicit, false, false, false, true);
+
+                        break;
                     case BOOL_OBJ:
                     case BOOL_OBJ:
                         if (internal)
                         if (internal)
                             return new Cast(actual, actual, explicit, false, false, false, true);
                             return new Cast(actual, actual, explicit, false, false, false, true);
@@ -62,6 +66,10 @@ public final class AnalyzerCaster {
                     case DEF:
                     case DEF:
                         return new Cast(actual, Definition.DEF_TYPE, explicit, false, false, true, false);
                         return new Cast(actual, Definition.DEF_TYPE, explicit, false, false, true, false);
                     case OBJECT:
                     case OBJECT:
+                        if (Definition.OBJECT_TYPE.equals(expected) && internal)
+                            return new Cast(actual, actual, explicit, false, false, false, true);
+
+                        break;
                     case NUMBER:
                     case NUMBER:
                     case BYTE_OBJ:
                     case BYTE_OBJ:
                         if (internal)
                         if (internal)
@@ -117,6 +125,10 @@ public final class AnalyzerCaster {
                     case DEF:
                     case DEF:
                         return new Cast(actual, Definition.DEF_TYPE, explicit, false, false, true, false);
                         return new Cast(actual, Definition.DEF_TYPE, explicit, false, false, true, false);
                     case OBJECT:
                     case OBJECT:
+                        if (Definition.OBJECT_TYPE.equals(expected) && internal)
+                            return new Cast(actual, actual, explicit, false, false, false, true);
+
+                        break;
                     case NUMBER:
                     case NUMBER:
                     case SHORT_OBJ:
                     case SHORT_OBJ:
                         if (internal)
                         if (internal)
@@ -172,6 +184,10 @@ public final class AnalyzerCaster {
                     case DEF:
                     case DEF:
                         return new Cast(actual, Definition.DEF_TYPE, explicit, false, false, true, false);
                         return new Cast(actual, Definition.DEF_TYPE, explicit, false, false, true, false);
                     case OBJECT:
                     case OBJECT:
+                        if (Definition.OBJECT_TYPE.equals(expected) && internal)
+                            return new Cast(actual, actual, explicit, false, false, false, true);
+
+                        break;
                     case NUMBER:
                     case NUMBER:
                     case CHAR_OBJ:
                     case CHAR_OBJ:
                         if (internal)
                         if (internal)
@@ -229,6 +245,10 @@ public final class AnalyzerCaster {
                     case DEF:
                     case DEF:
                         return new Cast(actual, Definition.DEF_TYPE, explicit, false, false, true, false);
                         return new Cast(actual, Definition.DEF_TYPE, explicit, false, false, true, false);
                     case OBJECT:
                     case OBJECT:
+                        if (Definition.OBJECT_TYPE.equals(expected) && internal)
+                            return new Cast(actual, actual, explicit, false, false, false, true);
+
+                        break;
                     case NUMBER:
                     case NUMBER:
                     case INT_OBJ:
                     case INT_OBJ:
                         if (internal)
                         if (internal)
@@ -284,6 +304,10 @@ public final class AnalyzerCaster {
                     case DEF:
                     case DEF:
                         return new Cast(actual, Definition.DEF_TYPE, explicit, false, false, true, false);
                         return new Cast(actual, Definition.DEF_TYPE, explicit, false, false, true, false);
                     case OBJECT:
                     case OBJECT:
+                        if (Definition.OBJECT_TYPE.equals(expected) && internal)
+                            return new Cast(actual, actual, explicit, false, false, false, true);
+
+                        break;
                     case NUMBER:
                     case NUMBER:
                     case LONG_OBJ:
                     case LONG_OBJ:
                         if (internal)
                         if (internal)
@@ -339,6 +363,10 @@ public final class AnalyzerCaster {
                     case DEF:
                     case DEF:
                         return new Cast(actual, Definition.DEF_TYPE, explicit, false, false, true, false);
                         return new Cast(actual, Definition.DEF_TYPE, explicit, false, false, true, false);
                     case OBJECT:
                     case OBJECT:
+                        if (Definition.OBJECT_TYPE.equals(expected) && internal)
+                            return new Cast(actual, actual, explicit, false, false, false, true);
+
+                        break;
                     case NUMBER:
                     case NUMBER:
                     case FLOAT_OBJ:
                     case FLOAT_OBJ:
                         if (internal)
                         if (internal)
@@ -392,6 +420,10 @@ public final class AnalyzerCaster {
                     case DEF:
                     case DEF:
                         return new Cast(actual, Definition.DEF_TYPE, explicit, false, false, true, false);
                         return new Cast(actual, Definition.DEF_TYPE, explicit, false, false, true, false);
                     case OBJECT:
                     case OBJECT:
+                        if (Definition.OBJECT_TYPE.equals(expected) && internal)
+                            return new Cast(actual, actual, explicit, false, false, false, true);
+
+                        break;
                     case NUMBER:
                     case NUMBER:
                     case DOUBLE_OBJ:
                     case DOUBLE_OBJ:
                         if (internal)
                         if (internal)
@@ -432,6 +464,45 @@ public final class AnalyzerCaster {
 
 
                 break;
                 break;
             case OBJECT:
             case OBJECT:
+                if (Definition.OBJECT_TYPE.equals(actual))
+                    switch (expected.sort) {
+                        case BYTE:
+                            if (internal && explicit)
+                                return new Cast(actual, Definition.BYTE_OBJ_TYPE, true, false, true, false, false);
+
+                            break;
+                        case SHORT:
+                            if (internal && explicit)
+                                return new Cast(actual, Definition.SHORT_OBJ_TYPE, true, false, true, false, false);
+
+                            break;
+                        case CHAR:
+                            if (internal && explicit)
+                                return new Cast(actual, Definition.CHAR_OBJ_TYPE, true, false, true, false, false);
+
+                            break;
+                        case INT:
+                            if (internal && explicit)
+                                return new Cast(actual, Definition.INT_OBJ_TYPE, true, false, true, false, false);
+
+                            break;
+                        case LONG:
+                            if (internal && explicit)
+                                return new Cast(actual, Definition.LONG_OBJ_TYPE, true, false, true, false, false);
+
+                            break;
+                        case FLOAT:
+                            if (internal && explicit)
+                                return new Cast(actual, Definition.FLOAT_OBJ_TYPE, true, false, true, false, false);
+
+                            break;
+                        case DOUBLE:
+                            if (internal && explicit)
+                                return new Cast(actual, Definition.DOUBLE_OBJ_TYPE, true, false, true, false, false);
+
+                            break;
+                    }
+                break;
             case NUMBER:
             case NUMBER:
                 switch (expected.sort) {
                 switch (expected.sort) {
                     case BYTE:
                     case BYTE: