You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@royale.apache.org by gr...@apache.org on 2021/10/24 22:30:39 UTC

[royale-asjs] branch develop updated: Updates for consistency between Flash and JS targets for Reflection. Improvements to Method closure support and fidelity of getQualifiedClassName and getQualifiedSuperclassName results. Additional tests added.

This is an automated email from the ASF dual-hosted git repository.

gregdove pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/royale-asjs.git


The following commit(s) were added to refs/heads/develop by this push:
     new fa557a6  Updates for consistency between Flash and JS targets for Reflection. Improvements to Method closure support and fidelity of getQualifiedClassName and getQualifiedSuperclassName results. Additional tests added.
fa557a6 is described below

commit fa557a6464b2b25597cbace8b0cc6bbd14247bf4
Author: greg-dove <gr...@gmail.com>
AuthorDate: Mon Oct 25 11:30:24 2021 +1300

    Updates for consistency between Flash and JS targets for Reflection.
    Improvements to Method closure support and fidelity of getQualifiedClassName and getQualifiedSuperclassName results.
    Additional tests added.
---
 .../src/main/royale/ReflectionClasses.as           |   1 +
 .../org/apache/royale/reflection/ExtraData.as      |  22 +++-
 .../org/apache/royale/reflection/TypeDefinition.as |  66 +++++++++-
 ...uperclassName.as => getClosureQualifiedName.as} |  25 +---
 .../royale/reflection/getDefinitionByName.as       |   1 +
 .../royale/reflection/getQualifiedClassName.as     |  13 +-
 .../reflection/getQualifiedSuperclassName.as       |  29 ++++-
 .../apache/royale/reflection/nativejs/AS3Array.as  |   1 +
 .../royale/reflection/nativejs/AS3Boolean.as       |   1 +
 .../royale/reflection/nativejs/AS3Function.as      |  82 ++++++++++++
 .../apache/royale/reflection/nativejs/AS3Number.as |   1 +
 .../apache/royale/reflection/nativejs/AS3String.as |   1 +
 .../apache/royale/reflection/nativejs/AS3Vector.as |   9 +-
 .../apache/royale/reflection/nativejs/AS3int.as    |   1 +
 .../apache/royale/reflection/nativejs/AS3uint.as   |   1 +
 .../reflection/ReflectionTesterNativeTypes.as      | 140 ++++++++++++++++++---
 16 files changed, 341 insertions(+), 53 deletions(-)

diff --git a/frameworks/projects/Reflection/src/main/royale/ReflectionClasses.as b/frameworks/projects/Reflection/src/main/royale/ReflectionClasses.as
index 24a9f62..4fa0697 100644
--- a/frameworks/projects/Reflection/src/main/royale/ReflectionClasses.as
+++ b/frameworks/projects/Reflection/src/main/royale/ReflectionClasses.as
@@ -45,6 +45,7 @@ internal class ReflectionClasses
 	import org.apache.royale.reflection.getQualifiedClassName; getQualifiedClassName;
 	import org.apache.royale.reflection.getQualifiedSuperclassName; getQualifiedSuperclassName;
 	import org.apache.royale.reflection.registerClassAlias; registerClassAlias;
+	import org.apache.royale.reflection.getClosureQualifiedName; getClosureQualifiedName;
 	//utils
 	import org.apache.royale.reflection.utils.getMembersWithMetadata; getMembersWithMetadata;
 	import org.apache.royale.reflection.utils.getMembers; getMembers;
diff --git a/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/ExtraData.as b/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/ExtraData.as
index 5d399b8..c9843b9 100644
--- a/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/ExtraData.as
+++ b/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/ExtraData.as
@@ -34,6 +34,8 @@ package org.apache.royale.reflection {
 	 */
 	COMPILE::SWF
 	public class ExtraData {
+
+		internal static var CLOSURE_QNAME:String = "builtin.as$0.MethodClosure";
 		
 		public static function get isRelevant():Boolean{
 			return false;
@@ -76,6 +78,8 @@ package org.apache.royale.reflection {
      */
 	COMPILE::JS
 	public class ExtraData {
+
+		internal static var CLOSURE_QNAME:String = "builtin.as$0.MethodClosure";
 		
 		private static var reflectionData:Map;
 		
@@ -121,11 +125,22 @@ package org.apache.royale.reflection {
 		 * import org.apache.royale.reflection.nativejs.AS3Array
 		 * ExtraData.addExternalDefinition(AS3Array())
 		 *
+		 * @royaleignorecoercion Array
 		 */
 		public static function addExternDefintion(item:Object):void{
 			if (!reflectionData) reflectionData = new Map();
-			reflectionData.set(item['name'], item);
-			reflectionData.set(item['classRef'], item);
+			var items:Array;
+			if (!Array.isArray(item)) {
+				items = [item]
+			} else {
+				items = item as Array;
+			}
+			for each(item in items) {
+				reflectionData.set(item['name'], item);
+				if (item['classRef'] && !reflectionData.has(item['classRef'])){
+					reflectionData.set(item['classRef'], item);
+				}
+			}
 		}
 		
 		/**
@@ -148,7 +163,8 @@ package org.apache.royale.reflection {
 				AS3int(),
 				AS3uint(),
 				AS3Vector(),
-				AS3Object()
+				AS3Object(),
+				AS3Function()
 			];
 			while(items.length) addExternDefintion(items.pop());
 			
diff --git a/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/TypeDefinition.as b/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/TypeDefinition.as
index 086508d..70bfb02 100755
--- a/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/TypeDefinition.as
+++ b/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/TypeDefinition.as
@@ -393,8 +393,60 @@ COMPILE::SWF {
                 var superClass:Object = def.superClass_;
                 if (!superClass) {
                     //todo: support for when superClass is not a royale 'class'
-                } else while (superClass)
-                {
+                    if (ExtraData.hasData(qname)) {
+                        superClass = ExtraData.getData(qname)['NATIVE_BASE'];
+                    }
+
+                }
+                while (superClass) {
+                    var superData:Object;
+                    var js_native:Boolean = false;
+                    if (superClass.ROYALE_CLASS_INFO !== undefined) {
+                        superData = superClass.ROYALE_CLASS_INFO;
+                    } else {
+                        if (ExtraData.hasData(superClass)) {
+                            superData = ExtraData.getData(getQualifiedClassName(superClass))['ROYALE_CLASS_INFO'];
+                            if (superData) {
+                                js_native = true;
+                            } else {
+                                //exit
+                                superClass = null;
+                            }
+
+
+                        } else {
+                            //exit
+                            superClass = null;
+                            superData = null;
+                        }
+                    }
+                    if (superData) {
+                        qname = superData.names[0].qName;
+                        results.push(TypeDefinition.internalGetDefinition(qname));
+                        if (!js_native) {
+                            def = getDefinitionByName(qname);
+                            superClass = def.superClass_;
+                        } else {
+                            if (ExtraData.hasData(qname)) {
+                                superClass = ExtraData.getData(qname)['NATIVE_BASE']
+                            } else {
+                                superClass = null;
+                            }
+                        }
+                    }
+                }
+
+                    /*= superClass.ROYALE_CLASS_INFO !== undefined ? superClass.ROYALE_CLASS_INFO : null;
+                    if (!superData) {
+                        if (ExtraData.hasData(superClass)) {
+
+                        } else {
+                            superClass = null;
+                        }
+
+                    } else {
+                        superClass = def.superClass_;
+                    }
                     if (superClass.ROYALE_CLASS_INFO !== undefined) {
                         qname = superClass.ROYALE_CLASS_INFO.names[0].qName;
                         results.push(TypeDefinition.internalGetDefinition(qname));
@@ -404,9 +456,17 @@ COMPILE::SWF {
 
                     } else {
                         //todo: support for when superClass is not a royale 'class'
+                        if (ExtraData.hasData(superClass)) {
+                            results.push(TypeDefinition.internalGetDefinition(ExtraData.getData(superClass)[]));
+                            var baseName:String = ExtraData.getData(qname)['NATIVE_BASE'];
+                            if (baseName) {
+                                superClass = getDefinitionByName(baseName);
+                            }
+                        }
                         superClass = null;
+
                     }
-                }
+                }*/
             }
             
             if (_cache) {
diff --git a/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/getQualifiedSuperclassName.as b/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/getClosureQualifiedName.as
old mode 100755
new mode 100644
similarity index 63%
copy from frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/getQualifiedSuperclassName.as
copy to frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/getClosureQualifiedName.as
index 447674c..933db46
--- a/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/getQualifiedSuperclassName.as
+++ b/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/getClosureQualifiedName.as
@@ -18,32 +18,19 @@
 ////////////////////////////////////////////////////////////////////////////////
 package org.apache.royale.reflection
 {
-COMPILE::SWF
-{
-    import flash.utils.getQualifiedSuperclassName;
-}
+
     
     /**
-     *  The equivalent of flash.utils.getQualifiedSuperclassName.
+     *  Returns the qualified name of a closure instance. Using this to compare against is recommended when checking
+     *  for closures. It could insulate against future changes or future variation between targets
      * 
      *  @langversion 3.0
      *  @playerversion Flash 10.2
      *  @playerversion AIR 2.6
      *  @productversion Royale 0.0
      */
-    public function getQualifiedSuperclassName(value:*):String
+    public function getClosureQualifiedName():String
 	{
-        COMPILE::SWF
-        {
-            return flash.utils.getQualifiedSuperclassName(value).replace('::','.');
-        }
-        COMPILE::JS
-        {
-            var constructorAsObject:Object = (value is Class) ? value : value["constructor"];
-            value = constructorAsObject.superClass_;
-            if (value == null || value.ROYALE_CLASS_INFO == null)
-                return null;
-            return value.ROYALE_CLASS_INFO.names[0].qName;
-        }
+        return ExtraData.CLOSURE_QNAME;
     }
-}
+}
\ No newline at end of file
diff --git a/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/getDefinitionByName.as b/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/getDefinitionByName.as
index fa82e86..17e6aed 100755
--- a/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/getDefinitionByName.as
+++ b/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/getDefinitionByName.as
@@ -59,6 +59,7 @@ COMPILE::JS
                 //use goog.global instead of window to support node too
                 o = goog.global;
                 for (var i:int = 0; i < n; i++) {
+                    if (!o) break;
                     o = o[parts[i]];
                 }
             } else {
diff --git a/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/getQualifiedClassName.as b/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/getQualifiedClassName.as
index 2e534bf..f3167cc 100755
--- a/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/getQualifiedClassName.as
+++ b/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/getQualifiedClassName.as
@@ -39,8 +39,8 @@ COMPILE::JS{
         COMPILE::SWF
         {
             var s:String = flash.utils.getQualifiedClassName(value);
-            if (s === "builtin.as$0::MethodClosure")
-                return s;  // don't replace ::
+            /*if (s === ExtraData.CLOSURE_QNAME)
+                return s;  // don't replace ::*/
             //normalize for Vector:
             return s.replace('__AS3__.vec::','').replace('::','.');
         }
@@ -53,8 +53,8 @@ COMPILE::JS{
                 return "Number";
             }
             if (defName === "boolean") return "Boolean";
-            if (defName === "undefined") return null;
-            if (value === null) return null;
+            if (defName === "undefined") return 'void';
+            if (value === null) return "null";
             if (Array.isArray(value)) {
                 //exclude Vector emulation:
                 if (Language.SYNTH_TAG_FIELD in value) return value[Language.SYNTH_TAG_FIELD]['type'];
@@ -67,6 +67,7 @@ COMPILE::JS{
                 if (!value.prototype) {
                     //instance
                     if (ExtraData.hasData(value.constructor)) {
+                        if (value.constructor === Function) return ExtraData.CLOSURE_QNAME;
                         //value is instance of a 'native class'
                         classInfo =  ExtraData.getData(value.constructor)['ROYALE_CLASS_INFO'];
                     } else {
@@ -90,7 +91,7 @@ COMPILE::JS{
                     }
                 }
                 if (!classInfo) {
-                    if (defName === "function") return "builtin.as$0::MethodClosure";
+                    if (defName === "function") return value === Function || value.hasOwnProperty('prototype') ? "Function" : ExtraData.CLOSURE_QNAME;
 
                     //fallback
                     return "Object";
@@ -99,4 +100,4 @@ COMPILE::JS{
             return classInfo.names[0].qName;
         }
     }
-}
+}
\ No newline at end of file
diff --git a/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/getQualifiedSuperclassName.as b/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/getQualifiedSuperclassName.as
index 447674c..7f62529 100755
--- a/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/getQualifiedSuperclassName.as
+++ b/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/getQualifiedSuperclassName.as
@@ -35,15 +35,34 @@ COMPILE::SWF
 	{
         COMPILE::SWF
         {
-            return flash.utils.getQualifiedSuperclassName(value).replace('::','.');
+            const val:String = flash.utils.getQualifiedSuperclassName(value);
+            return val && val.replace('::','.');
         }
         COMPILE::JS
         {
+            if (value === null || typeof value === 'undefined') return null;
             var constructorAsObject:Object = (value is Class) ? value : value["constructor"];
-            value = constructorAsObject.superClass_;
-            if (value == null || value.ROYALE_CLASS_INFO == null)
-                return null;
-            return value.ROYALE_CLASS_INFO.names[0].qName;
+            var superRef:Object = constructorAsObject.superClass_;
+            if (!superRef && ExtraData.hasData(constructorAsObject)) {
+                if (constructorAsObject == Function && value.prototype == undefined) {
+                    //special case - a Closure has Function as its Superclass.
+                    superRef = ExtraData.getData(Function)
+                } else {
+                    superRef = ExtraData.getData(constructorAsObject)['NATIVE_BASE'];
+                    if (superRef) {
+                        //we only have a reference to the native base-class constructor itself, we now need to get the extra data for it:
+                        superRef = ExtraData.getData(superRef)
+                    }
+                }
+                if (superRef) {
+                    superRef = superRef['ROYALE_CLASS_INFO'];
+                }
+            } else {
+                if (superRef == null) return null;
+                superRef = superRef.ROYALE_CLASS_INFO;
+            }
+
+            return superRef ? superRef.names[0].qName : null;
         }
     }
 }
diff --git a/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/nativejs/AS3Array.as b/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/nativejs/AS3Array.as
index f3caad5..4f93c25 100644
--- a/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/nativejs/AS3Array.as
+++ b/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/nativejs/AS3Array.as
@@ -28,6 +28,7 @@ package org.apache.royale.reflection.nativejs {
         ret['classRef'] = Array;
         ret['name'] = 'Array';
         ret['NATIVE_TYPE'] = true;
+        ret['NATIVE_BASE'] = Object;
     
         ret['ROYALE_CLASS_INFO'] = { names: [{ name: 'Array', qName: 'Array', kind: 'class', isDynamic: true }] };
     
diff --git a/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/nativejs/AS3Boolean.as b/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/nativejs/AS3Boolean.as
index 16bb546..a3b8c76 100644
--- a/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/nativejs/AS3Boolean.as
+++ b/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/nativejs/AS3Boolean.as
@@ -29,6 +29,7 @@ package org.apache.royale.reflection.nativejs {
         ret['classRef'] = Boolean;
         ret['name'] = 'Boolean';
         ret['NATIVE_TYPE'] = true;
+        ret['NATIVE_BASE'] = Object;
         
         ret['ROYALE_CLASS_INFO'] = { names: [{ name: 'Boolean', qName: 'Boolean', kind: 'class' }] };
     
diff --git a/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/nativejs/AS3Function.as b/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/nativejs/AS3Function.as
new file mode 100644
index 0000000..81388ea
--- /dev/null
+++ b/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/nativejs/AS3Function.as
@@ -0,0 +1,82 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package org.apache.royale.reflection.nativejs {
+import org.apache.royale.reflection.getClosureQualifiedName;
+
+    /**
+     * Provides data for a stand-in TypeDefinition of the native as3 type for javascript
+     */
+    COMPILE::JS
+    public function AS3Function():Object{
+        if (singleton) return singleton;
+        var contents:Array
+        var funcDef:Object= {};
+        funcDef['classRef'] = Function;
+        funcDef['name'] = 'Function';
+        funcDef['NATIVE_TYPE'] = true;
+        funcDef['NATIVE_BASE'] = Object;
+
+        funcDef['ROYALE_CLASS_INFO'] = { names: [{ name: 'Function', qName: 'Function', kind: 'class', isDynamic: true }] };
+
+        funcDef['ROYALE_REFLECTION_INFO'] = function():Object {
+            return {
+                'accessors':function():Object {
+                    return {
+                        'length':{'access':'readonly','type':'int','declaredBy':'Function'}
+                    };
+                },
+                'methods':function():Object {
+                    return {
+                        'Function':{'declaredBy':'Function','type':''}
+                    };
+                }
+            };
+        };
+        contents = [funcDef];
+        const methodClosureQName:String = getClosureQualifiedName();
+        const methodClosureName:String = methodClosureQName.substr(methodClosureQName.lastIndexOf('.') + 1);
+        //now for "Closure"
+        funcDef = {};
+        funcDef['classRef'] = Function; //this is not correct, but there is no reference to 'Closure' as a subclass of 'Function'
+        funcDef['name'] = methodClosureQName;
+        funcDef['NATIVE_TYPE'] = true;
+        funcDef['NATIVE_BASE'] = Function;
+
+        funcDef['ROYALE_CLASS_INFO'] = { names: [{ name: methodClosureName, qName: methodClosureQName, kind: 'class', isDynamic: true }] };
+
+        funcDef['ROYALE_REFLECTION_INFO'] = function():Object {
+            return {
+                'accessors':function():Object {
+                    return {
+                        'prototype':{'access':'readwrite','type':'int','declaredBy':methodClosureQName}
+                    };
+                },
+                'methods':function():Object {
+                    var obj:Object = {};
+                    obj[methodClosureName] = {'declaredBy':methodClosureQName,'type':''};
+                    return obj;
+                }
+            };
+        };
+        contents[1] = funcDef;
+        singleton = contents;
+        return contents;
+    }
+}
+var singleton:* = null; //the explicit assignment with null is necessary here
\ No newline at end of file
diff --git a/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/nativejs/AS3Number.as b/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/nativejs/AS3Number.as
index 43a67b3..77dd449 100644
--- a/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/nativejs/AS3Number.as
+++ b/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/nativejs/AS3Number.as
@@ -28,6 +28,7 @@ package org.apache.royale.reflection.nativejs {
         ret['classRef'] = Number;
         ret['name'] = 'Number';
         ret['NATIVE_TYPE'] = true;
+        ret['NATIVE_BASE'] = Object;
         
         ret['ROYALE_CLASS_INFO'] = { names: [{ name: 'Number', qName: 'Number', kind: 'class' }] };
     
diff --git a/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/nativejs/AS3String.as b/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/nativejs/AS3String.as
index f45d474..58ac1bc 100644
--- a/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/nativejs/AS3String.as
+++ b/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/nativejs/AS3String.as
@@ -28,6 +28,7 @@ package org.apache.royale.reflection.nativejs {
         ret['classRef'] = String;
         ret['name'] = 'String';
         ret['NATIVE_TYPE'] = true;
+        ret['NATIVE_BASE'] = Object;
         
         ret['ROYALE_CLASS_INFO'] = { names: [{ name: 'String', qName: 'String', kind: 'class' }] };
     
diff --git a/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/nativejs/AS3Vector.as b/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/nativejs/AS3Vector.as
index 3193139..86930b8 100644
--- a/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/nativejs/AS3Vector.as
+++ b/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/nativejs/AS3Vector.as
@@ -24,9 +24,10 @@ package org.apache.royale.reflection.nativejs {
     
     /**
      * Provides data for a stand-in TypeDefinition of the native as3 type for javascript
+     * @royaleignorecoercion Class
      */
     COMPILE::JS
-    public function AS3Vector(typeName:String='Vector.<*>'):Object{
+    public function AS3Vector(typeName:String='Vector.<*>', nativeBase:Class=null):Object{
         if (singletons) {
             if (singletons[typeName]) return singletons[typeName];
         } else {
@@ -36,6 +37,7 @@ package org.apache.royale.reflection.nativejs {
         ret['classRef'] = Language.synthVector(typeName.substring(8, typeName.length - 1));
         ret['name'] = typeName;
         ret['SYNTHETIC_TYPE'] = true;
+        ret['NATIVE_BASE'] = nativeBase || Object;
         
         ret['ROYALE_CLASS_INFO'] = { names: [{ name: typeName, qName: typeName, kind: 'class' }] };
     
@@ -57,8 +59,11 @@ package org.apache.royale.reflection.nativejs {
         };
         if (typeName == 'Vector.<*>') {
             //support for Vector variant subtypes
+            var wildCardBase:Class = ret['classRef'] as Class;
             ret['variant'] = function(subType:String):Object {
-                return AS3Vector(subType);
+                var ofType:String = subType.substring(7, subType.length )
+                var baseClassRef:Class = '<int><uint><Number>'.indexOf(ofType) == -1 ? wildCardBase : Object;
+                return AS3Vector(subType, baseClassRef);
             };
         }
         singletons[typeName] = ret;
diff --git a/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/nativejs/AS3int.as b/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/nativejs/AS3int.as
index 0f6e6b3..f2b5af2 100644
--- a/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/nativejs/AS3int.as
+++ b/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/nativejs/AS3int.as
@@ -32,6 +32,7 @@ package org.apache.royale.reflection.nativejs {
         ret['classRef'] = int;
         ret['name'] = 'int';
         ret['SYNTHETIC_TYPE'] = true;
+        ret['NATIVE_BASE'] = Object;
         
         ret['ROYALE_CLASS_INFO'] = { names: [{ name: 'int', qName: 'int', kind: 'class' }] };
     
diff --git a/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/nativejs/AS3uint.as b/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/nativejs/AS3uint.as
index 869cec8..698c61c 100644
--- a/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/nativejs/AS3uint.as
+++ b/frameworks/projects/Reflection/src/main/royale/org/apache/royale/reflection/nativejs/AS3uint.as
@@ -32,6 +32,7 @@ package org.apache.royale.reflection.nativejs {
         ret['classRef'] = uint;
         ret['name'] = 'uint';
         ret['SYNTHETIC_TYPE'] = true;
+        ret['NATIVE_BASE'] = Object;
         
         ret['ROYALE_CLASS_INFO'] = { names: [{ name: 'uint', qName: 'uint', kind: 'class' }] };
     
diff --git a/frameworks/projects/Reflection/src/test/royale/flexUnitTests/reflection/ReflectionTesterNativeTypes.as b/frameworks/projects/Reflection/src/test/royale/flexUnitTests/reflection/ReflectionTesterNativeTypes.as
index e852684..941e9a7 100644
--- a/frameworks/projects/Reflection/src/test/royale/flexUnitTests/reflection/ReflectionTesterNativeTypes.as
+++ b/frameworks/projects/Reflection/src/test/royale/flexUnitTests/reflection/ReflectionTesterNativeTypes.as
@@ -249,25 +249,135 @@ package flexUnitTests.reflection
         [Test]
         public function testFunctionClass():void
         {
-//            assertEquals( getQualifiedClassName(Function), "Function", "Unexpected type name");
-//            assertEquals( getDefinitionByName("Function"), Function, "Unexpected type");
-            
-//            var def:TypeDefinition = describeType(Function);
-//            assertEquals( def.name, "Function", "Unexpected type name");
-        
+            assertEquals( getQualifiedClassName(Function), "Function", "Unexpected type name");
+            assertEquals( getDefinitionByName("Function"), Function, "Unexpected type");
+
+            var def:TypeDefinition = describeType(Function);
+            assertEquals( def.name, "Function", "Unexpected type name");
+
         }
-    
-    
+
+
         [Test]
         public function testFunctionInstance():void
         {
             var inst:Function = testFunctionClass;
-            assertEquals( getQualifiedClassName(inst), "builtin.as$0::MethodClosure", "Unexpected type name");
-    
-//            var def:TypeDefinition = describeType(inst);
-//            assertEquals( def.name, "builtin.as$0::MethodClosure", "Unexpected type name");
-        
+            assertEquals( getQualifiedClassName(inst), "builtin.as$0.MethodClosure", "Unexpected type name");
+
+            var def:TypeDefinition = describeType(inst);
+            assertEquals( def.name, "MethodClosure", "Unexpected type name");
+
+            inst = testFunctionInstance;
+            assertEquals( getQualifiedClassName(inst), "builtin.as$0.MethodClosure", "Unexpected type name");
+
+            assertEquals( getQualifiedSuperclassName(inst), "Function", "Unexpected type name");
+
+            inst = function():void{};
+            assertEquals( getQualifiedClassName(inst), "Function", "Unexpected type name");
+
+            def = describeType(inst);
+            assertEquals( def.name, "Function", "Unexpected type name");
+
+            var me:Object = this;
+            inst = function():Object{return me};
+            assertEquals( getQualifiedClassName(inst), "Function", "Unexpected type name");
+
+            def = describeType(inst);
+            assertEquals( def.name, "Function", "Unexpected type name");
+        }
+
+
+        [Test]
+        public function testAncestry():void
+        {
+            var test:Object = Boolean;
+            var def:TypeDefinition = describeType(test);
+
+            assertTrue(containsDefinitions(def.baseClasses, ["Object"], true));
+            test = String;
+            def = describeType(test);
+            assertTrue(containsDefinitions(def.baseClasses, ["Object"], true));
+
+            test = Number;
+            def = describeType(test);
+            assertTrue(containsDefinitions(def.baseClasses, ["Object"], true));
+
+            test = uint;
+            def = describeType(test);
+            assertTrue(containsDefinitions(def.baseClasses, ["Object"], true));
+
+            test = int;
+            def = describeType(test);
+            assertTrue(containsDefinitions(def.baseClasses, ["Object"], true));
+
+            test = Array;
+            def = describeType(test);
+            assertTrue(containsDefinitions(def.baseClasses, ["Object"], true));
+
+            test = Vector.<*>;
+            def = describeType(test);
+            assertTrue(containsDefinitions(def.baseClasses, ["Object"], true));
+
+            test = Vector.<Number>;
+            def = describeType(test);
+            assertTrue(containsDefinitions(def.baseClasses, ["Object"], true));
+
+            test = Vector.<int>;
+            def = describeType(test);
+            assertTrue(containsDefinitions(def.baseClasses, ["Object"], true));
+
+            test = Vector.<uint>;
+            def = describeType(test);
+            assertTrue(containsDefinitions(def.baseClasses, ["Object"], true));
+
+            test = Vector.<String>;
+            def = describeType(test);
+            assertTrue(containsDefinitions(def.baseClasses, ["Vector.<*>","Object"], true));
+
+
+            assertEquals(getQualifiedSuperclassName(Number), 'Object', 'Unexpected Superclass name');
+            assertEquals(getQualifiedSuperclassName(String), 'Object', 'Unexpected Superclass name');
+            assertEquals(getQualifiedSuperclassName(uint), 'Object', 'Unexpected Superclass name');
+            assertEquals(getQualifiedSuperclassName(int), 'Object', 'Unexpected Superclass name');
+            assertEquals(getQualifiedSuperclassName(Function), 'Object', 'Unexpected Superclass name');
+            assertEquals(getQualifiedSuperclassName(Array), 'Object', 'Unexpected Superclass name');
+            assertStrictlyEquals(getQualifiedSuperclassName(Object), null, 'Unexpected Superclass name');
+
+            var inst:Function =testFunctionInstance;
+            //closure:
+            assertEquals(getQualifiedSuperclassName(inst), "Function", 'Unexpected Superclass name');
+            //non-closure function ref
+            inst = function():void{};
+            assertEquals(getQualifiedSuperclassName(inst), "Object", 'Unexpected Superclass name');
+        }
+
+        [Test]
+        public function testNull():void
+        {
+            assertStrictlyEquals(getQualifiedClassName(null), "null", 'Unexpected class name');
+            assertStrictlyEquals(getQualifiedSuperclassName(null), null, 'Unexpected Superclass name');
+        }
+
+        [Test]
+        public function testUndefined():void
+        {
+            var val:* = undefined;
+            assertStrictlyEquals(getQualifiedClassName(val), "void", 'Unexpected class name');
+            assertStrictlyEquals(getQualifiedSuperclassName(val), null, 'Unexpected Superclass name');
+        }
+
+
+
+
+        private function containsDefinitions(collection:Array, requiredInOrder:Array, mustBeEqualLength:Boolean):Boolean {
+            if (mustBeEqualLength && collection.length != requiredInOrder.length) return false;
+
+            for (var i:uint = 0; i< collection.length; i++) {
+                var typeDef:TypeDefinition = collection[i];
+                if (typeDef.qualifiedName != requiredInOrder[i]) return false;
+            }
+
+            return true;
         }
-        
     }
-}
+}
\ No newline at end of file