\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
'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
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
};\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
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
\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