OSDN Git Service

bug fixes superCall, merge X.UI.Gesture to X.UI.AbstructUINode.
[pettanr/clientJs.git] / 0.6.x / js / 01_core / 13_XClass.js
index dc1166b..072bc2c 100644 (file)
@@ -20,8 +20,6 @@ var
 \r
        X_Class_CLASS_LIST         = [],\r
        X_Class_DEF_LIST           = [],\r
-       X_Class_CALLING_SUPER      = [],\r
-       X_Class_CALL_SUPER_STACK   = [],\r
        X_Class_SUPER_CALLER       = [],\r
        X_Class_SUPER_STACKS       = [],\r
        X_Class_traits             = null,\r
@@ -133,35 +131,45 @@ X_Class_CommonMethods =
        'Super' : function( var_args ){\r
                var me     = this,\r
                        sClass = me,\r
-                       i      = X_Class_CALLING_SUPER.indexOf( me ),\r
-                       l, sList, def, sConst, ret;\r
+                       i      = X_Class_SUPER_CALLER.indexOf( me ),\r
+                       stack, t, def, ret;\r
        \r
                if( i === -1 ){\r
-                       X_Class_CALLING_SUPER[ l = X_Class_CALLING_SUPER.length ] = me;\r
-                       X_Class_CALL_SUPER_STACK[ l ] = sList = [];\r
-                       def = X_Class_getClassDef( me );\r
-                       if( !def.Constructor ) sClass = def.SuperClass;// 現在のクラスがコンストラクタを持たない場合 SuperConstructor を new で呼んでいるため再び呼ばないようにする\r
+                       X_Class_SUPER_CALLER[ i = X_Class_SUPER_CALLER.length ] = me;\r
+                       X_Class_SUPER_STACKS[ i ] = stack = 0;\r
                } else {\r
-                       sList = X_Class_CALL_SUPER_STACK[ i ];\r
+                       stack = X_Class_SUPER_STACKS[ i ];\r
                };\r
                \r
+               t = stack;\r
+               \r
+        while( t ){\r
+               sClass = X_Class_getClassDef( sClass ).SuperClass;\r
+            --t;\r
+        };\r
+               \r
                while( sClass ){\r
+                       ++t;\r
+                       sClass = X_Class_getClassDef( sClass ).SuperClass;\r
+                       if( !sClass ) break;\r
                        def    = X_Class_getClassDef( sClass );\r
-                       sClass = def.SuperClass;\r
-                       sConst = def.SuperConstructor;\r
-                       if( !sConst ) break;\r
-                       if( sList.indexOf( sConst ) === -1 ){\r
-                               sList[ sList.length ] = sConst;\r
-                               ret = sConst.apply( me, arguments );\r
-                               --sList.length;\r
-                               if( !sList.length ){\r
-                                       X_Class_CALLING_SUPER.splice( i, 1 );\r
-                                       X_Class_CALL_SUPER_STACK.splice( i, 1 );\r
-                               };\r
-                               return ret || me;\r
+                       \r
+                       if( def.Constructor ){\r
+                               X_Class_SUPER_STACKS[ i ] += t;\r
+                               ret = def.Constructor.apply( me, arguments );\r
+                               break;\r
                        };\r
                };\r
-               console.log( 'スーパークラスのコンストラクタが見つかりません' );\r
+               \r
+               if( X_Class_SUPER_STACKS[ i ] === stack ) console.log( 'スーパークラス、またはスーパークラスのコンストラクタは存在しません' );\r
+               \r
+               if( stack === 0 ){\r
+                       X_Class_SUPER_CALLER.splice( i, 1 );\r
+                       X_Class_SUPER_STACKS.splice( i, 1 );\r
+               } else {\r
+                       X_Class_SUPER_STACKS[ i ] = stack;\r
+               };\r
+               return ret || me;\r
        },\r
 \r
        /**\r
@@ -193,7 +201,7 @@ X_Class_CommonMethods =
                        i      = X_Class_SUPER_CALLER.indexOf( me ),\r
                        l, d, ret,\r
                        args   = arguments,\r
-                       name, p, sFunc, hit;\r
+                       name, p, sFunc;\r
 \r
                if( X_Type_isFunction( myFunc ) ){\r
                        for( p in proto ){\r
@@ -208,67 +216,61 @@ X_Class_CommonMethods =
                };\r
                        \r
                if( i === -1 ){\r
-                       X_Class_SUPER_CALLER[ l = X_Class_SUPER_CALLER.length ] = me;\r
-                       X_Class_SUPER_STACKS[ l ] = d = {};\r
+                       X_Class_SUPER_CALLER[ i = X_Class_SUPER_CALLER.length ] = me;\r
+                       X_Class_SUPER_STACKS[ i ] = stack = 0;\r
                } else {\r
-                       d = X_Class_SUPER_STACKS[ i ];\r
-               };\r
-               \r
-               if( stack = d[ name ] ){\r
-                       myFunc = stack[ stack.length - 1 ];\r
-               } else {\r
-                       stack = d[ name ] = [];\r
+                       stack = X_Class_SUPER_STACKS[ i ];\r
                };\r
 \r
-               /*\r
+               t = stack;\r
+\r
         while( t ){\r
                sClass = X_Class_getClassDef( sClass ).SuperClass;\r
             --t;\r
         };\r
-        mysFunc = sClass.prototype[ name ]; */\r
-\r
-\r
-               // TODO \r
-               while( sClass ){\r
-                       sFunc = sClass.prototype[ name ];\r
-                       \r
-                       if( !hit && sFunc === myFunc ){\r
-                               hit = true; // 現在の関数にヒット, さらにスーパークラスを辿って同名のプロパティの関数が現れたらそれが目指すもの\r
-                       } else\r
-                       if( hit && sFunc !== myFunc /* X_Object_own( name, sClass.prototype ) */ ){\r
-                               // this の関数と異なり、値が設定されていたら、今は手を抜いて undef か?見ている、正しくは hasOwnProperty\r
-                               if( X_Type_isFunction( sFunc ) ){\r
-                                       stack[ stack.length ] = sFunc;\r
-                                       switch( args.length ){\r
-                                               case 0 :\r
-                                                       ret = sFunc.call( me );\r
-                                                       break;\r
-                                               case 1 :\r
-                                                       ret = sFunc.call( me, args[ 0 ] );\r
-                                                       break;\r
-                                               case 2 :\r
-                                                       ret = sFunc.call( me, args[ 0 ], args[ 1 ] );\r
-                                                       break;\r
-                                               case 3 :\r
-                                                       ret = sFunc.call( me, args[ 0 ], args[ 1 ], args[ 2 ] );\r
-                                                       break;\r
-                                               default :\r
-                                                       args = X_Array_copy( args );\r
-                                                       args.shift();\r
-                                                       ret = sFunc.apply( me, args );\r
-                                                       break;                                                  \r
+        \r
+        if( sClass ){\r
+               myFunc = sClass.prototype[ name ];\r
+\r
+                       while( sClass ){\r
+                               ++t;\r
+                               sClass = X_Class_getClassDef( sClass ).SuperClass;      \r
+                               sFunc  = sClass.prototype[ name ];\r
+                               \r
+                               if( sFunc !== myFunc /* X_Object_own( name, sClass.prototype ) */ ){\r
+                                       // this の関数と異なり、値が設定されていたら、今は手を抜いて undef か?見ている、正しくは hasOwnProperty\r
+                                       if( X_Type_isFunction( sFunc ) ){\r
+                                               X_Class_SUPER_STACKS[ i ] += t;\r
+                                               switch( args.length ){\r
+                                                       case 0 :\r
+                                                               ret = sFunc.call( me );\r
+                                                               break;\r
+                                                       case 1 :\r
+                                                               ret = sFunc.call( me, args[ 0 ] );\r
+                                                               break;\r
+                                                       case 2 :\r
+                                                               ret = sFunc.call( me, args[ 0 ], args[ 1 ] );\r
+                                                               break;\r
+                                                       case 3 :\r
+                                                               ret = sFunc.call( me, args[ 0 ], args[ 1 ], args[ 2 ] );\r
+                                                               break;\r
+                                                       default :\r
+                                                               args = X_Array_copy( args );\r
+                                                               args.shift();\r
+                                                               ret = sFunc.apply( me, args );\r
+                                                               break;                                                  \r
+                                               };\r
                                        };\r
-                                       --stack.length;\r
+                                       break;\r
                                };\r
-                               break;\r
                        };\r
-                       sClass = X_Class_getClassDef( sClass ).SuperClass;              \r
                };\r
-               \r
-               if( !stack.length ) delete d[ name ];\r
-               if( X_Object_isEmpty( d ) ){\r
-                       X_Class_SUPER_CALLER.splice( l, 1 );\r
-                       X_Class_SUPER_STACKS.splice( l, 1 );\r
+\r
+               if( stack === 0 ){\r
+                       X_Class_SUPER_CALLER.splice( i, 1 );\r
+                       X_Class_SUPER_STACKS.splice( i, 1 );\r
+               } else {\r
+                       X_Class_SUPER_STACKS[ i ] = stack;\r
                };\r
                return ret;\r
        },\r
@@ -610,8 +612,8 @@ function X_Class_inherits( /* displayName, classSetting, props */ ){
        def    = X_Class_getClassDef( klass );\r
        // 継承用プロパティを控える\r
        def.SuperClass       = Super;\r
-       def.SuperProto       = Super.prototype;\r
-       def.SuperConstructor = superDef.Constructor || superDef.SuperConstructor;\r
+       //def.SuperProto       = Super.prototype;\r
+       //def.SuperConstructor = superDef.Constructor || superDef.SuperConstructor;\r
        \r
        return klass;\r
 };\r
@@ -645,8 +647,7 @@ function X_Class_actualConstructor( f, args ){
 \r
        obj = def.Constructor ?\r
                        def.Constructor.apply( instance, args ) :\r
-               def.SuperConstructor &&\r
-                       def.SuperConstructor.apply( instance, args );\r
+                       instance[ 'Super' ].apply( instance, args );\r
 \r
        if( obj !== instance && ( X_Type_isObject( obj ) || X_Type_isFunction( obj ) ) ){ // Class\r
                instance[ 'kill' ]();\r