private void generateResumeGenerator ( ClassFileWriter cfw ) { boolean hasGenerators = false ; for ( int i = 0 ; i < scriptOrFnNodes . length ; i ++ ) { if ( isGenerator ( scriptOrFnNodes [ i ] ) ) hasGenerators = true ; } // if there are no generators defined, we don't implement a // resumeGenerator(). The base class provides a default implementation. if ( ! hasGenerators ) return ; cfw . startMethod ( "resumeGenerator" , "(Lorg/mozilla/javascript/Context;" + "Lorg/mozilla/javascript/Scriptable;" + "ILjava/lang/Object;" + "Ljava/lang/Object;)Ljava/lang/Object;" , ( short ) ( ACC_PUBLIC | ACC_FINAL ) ) ; // load arguments for dispatch to the corresponding *_gen method cfw . addALoad ( 0 ) ; cfw . addALoad ( 1 ) ; cfw . addALoad ( 2 ) ; cfw . addALoad ( 4 ) ; cfw . addALoad ( 5 ) ; cfw . addILoad ( 3 ) ; cfw . addLoadThis ( ) ; cfw . add ( ByteCode . GETFIELD , cfw . getClassName ( ) , ID_FIELD_NAME , "I" ) ; int startSwitch = cfw . addTableSwitch ( 0 , scriptOrFnNodes . length - 1 ) ; cfw . markTableSwitchDefault ( startSwitch ) ; int endlabel = cfw . acquireLabel ( ) ; for ( int i = 0 ; i < scriptOrFnNodes . length ; i ++ ) { ScriptNode n = scriptOrFnNodes [ i ] ; cfw . markTableSwitchCase ( startSwitch , i , ( short ) 6 ) ; if ( isGenerator ( n ) ) { String type = "(" + mainClassSignature + "Lorg/mozilla/javascript/Context;" + "Lorg/mozilla/javascript/Scriptable;" + "Ljava/lang/Object;" + "Ljava/lang/Object;I)Ljava/lang/Object;" ; cfw . addInvoke ( ByteCode . INVOKESTATIC , mainClassName , getBodyMethodName ( n ) + "_gen" , type ) ; cfw . add ( ByteCode . ARETURN ) ; } else { cfw . add ( ByteCode . GOTO , endlabel ) ; } } cfw . markLabel ( endlabel ) ; pushUndefined ( cfw ) ; cfw . add ( ByteCode . ARETURN ) ; // this method uses as many locals as there are arguments (hence 6) cfw . stopMethod ( ( short ) 6 ) ; }
appended by _gen .