From: <or...@us...> - 2011-04-02 17:21:00
|
Revision: 3 http://bsf4oorexx.svn.sourceforge.net/bsf4oorexx/?rev=3&view=rev Author: orexx Date: 2011-04-02 17:20:49 +0000 (Sat, 02 Apr 2011) Log Message: ----------- Added 'incubator' and 'sandbox' directories as in the 'ooRexx' project. Added Paths: ----------- incubator/ sandbox/ sandbox/rgf/ sandbox/rgf/extendJava/ sandbox/rgf/extendJava/ASMifierRUN.cmd sandbox/rgf/extendJava/TODO.txt sandbox/rgf/extendJava/addNL.rex sandbox/rgf/extendJava/besonderheiten.txt sandbox/rgf/extendJava/dev/ sandbox/rgf/extendJava/dev/RexxExtendClass.class sandbox/rgf/extendJava/dev/RexxExtendClass.java sandbox/rgf/extendJava/dev/RexxExtendingClassLoader.class sandbox/rgf/extendJava/dev/RexxExtendingClassLoader.java sandbox/rgf/extendJava/dev/RgfTestCreate.class sandbox/rgf/extendJava/dev/RgfTestCreate.java sandbox/rgf/extendJava/dev/Test.class sandbox/rgf/extendJava/dev/Test.java sandbox/rgf/extendJava/dev/TestAbstract.class sandbox/rgf/extendJava/dev/TestAbstract.java sandbox/rgf/extendJava/dev/TestAbstract_$RexxExtendClass$_10891203_proxied.class sandbox/rgf/extendJava/dev/TestAbstract_$RexxExtendClass$_19336051_proxied.class sandbox/rgf/extendJava/dev/TestAbstract_dynamicallyExtended_abc.class sandbox/rgf/extendJava/dev/TestSub.class sandbox/rgf/extendJava/dev/TestSub.java sandbox/rgf/extendJava/dev/TestType.class sandbox/rgf/extendJava/dev/TestType.java sandbox/rgf/extendJava/dev/TransformationData.class sandbox/rgf/extendJava/dev/WARNING-READ-ME.txt sandbox/rgf/extendJava/dev/bug.compute_frames/ sandbox/rgf/extendJava/dev/bug.compute_frames/RgfExtendClass.class sandbox/rgf/extendJava/dev/bug.compute_frames/RgfExtendClass.java sandbox/rgf/extendJava/dev/bug.compute_frames/RgfTestCreate.class sandbox/rgf/extendJava/dev/bug.compute_frames/RgfTestCreate.java sandbox/rgf/extendJava/dev/bug.compute_frames/TestAbstract.class sandbox/rgf/extendJava/dev/bug.compute_frames/TestAbstract.java sandbox/rgf/extendJava/dev/bug.compute_frames/TestType.class sandbox/rgf/extendJava/dev/bug.compute_frames/TestType.java sandbox/rgf/extendJava/dev/bug.compute_frames/TransformationData.class sandbox/rgf/extendJava/dev/bug.compute_frames/misc/ sandbox/rgf/extendJava/dev/bug.compute_frames/misc/TestAbstract.proxied sandbox/rgf/extendJava/dev/bug.compute_frames/readme.txt sandbox/rgf/extendJava/dev/test/ sandbox/rgf/extendJava/dev/test/TestAbstract_$RgfExtendClass$_19336051.jad.java sandbox/rgf/extendJava/dev/test/TestAbstract_$RgfExtendClass$_19336051.java sandbox/rgf/extendJava/experiments/ sandbox/rgf/extendJava/experiments/A-asm-14-nl.java sandbox/rgf/extendJava/experiments/A-asm-14.java sandbox/rgf/extendJava/experiments/A.class sandbox/rgf/extendJava/experiments/A.java sandbox/rgf/extendJava/experiments/B-asm-14-nl.java sandbox/rgf/extendJava/experiments/B-asm-14.java sandbox/rgf/extendJava/experiments/B.class sandbox/rgf/extendJava/experiments/B.java sandbox/rgf/extendJava/experiments/C-asm-14-nl.java sandbox/rgf/extendJava/experiments/C-asm-14.java sandbox/rgf/extendJava/experiments/C.class sandbox/rgf/extendJava/experiments/C.java sandbox/rgf/extendJava/experiments/j14/ sandbox/rgf/extendJava/experiments/j14/A-asm-14-nl.java sandbox/rgf/extendJava/experiments/j14/A-asm-14.java sandbox/rgf/extendJava/experiments/j14/A.class sandbox/rgf/extendJava/experiments/j14/A.java sandbox/rgf/extendJava/experiments/j14/B-asm-14-nl.java sandbox/rgf/extendJava/experiments/j14/B-asm-14.java sandbox/rgf/extendJava/experiments/j14/B.class sandbox/rgf/extendJava/experiments/j14/B.java sandbox/rgf/extendJava/experiments/j14/C-asm-14-nl.java sandbox/rgf/extendJava/experiments/j14/C-asm-14.java sandbox/rgf/extendJava/experiments/j14/C.class sandbox/rgf/extendJava/experiments/j14/C.java sandbox/rgf/extendJava/experiments/j16/ sandbox/rgf/extendJava/experiments/j16/A-asm-nl.java sandbox/rgf/extendJava/experiments/j16/A-asm.java sandbox/rgf/extendJava/experiments/j16/A.class sandbox/rgf/extendJava/experiments/j16/A.java sandbox/rgf/extendJava/experiments/j16/B-asm-nl.java sandbox/rgf/extendJava/experiments/j16/B-asm.java sandbox/rgf/extendJava/experiments/j16/B.class sandbox/rgf/extendJava/experiments/j16/B.java sandbox/rgf/extendJava/experiments/j16/C-asm-nl.java sandbox/rgf/extendJava/experiments/j16/C-asm.java sandbox/rgf/extendJava/experiments/j16/C.class sandbox/rgf/extendJava/experiments/j16/C.java sandbox/rgf/extendJava/forwardToSuper/ sandbox/rgf/extendJava/forwardToSuper/Test.class sandbox/rgf/extendJava/forwardToSuper/Test.java sandbox/rgf/extendJava/forwardToSuper/TestSub.class sandbox/rgf/extendJava/forwardToSuper/TestSub.java sandbox/rgf/extendJava/forwardToSuper/UseTest.class sandbox/rgf/extendJava/forwardToSuper/UseTest.java sandbox/rgf/extendJava/forwardToSuper/addNL.rex sandbox/rgf/extendJava/forwardToSuper/java_1_4/ sandbox/rgf/extendJava/forwardToSuper/java_1_4/T-4-asm-debug-nl.java sandbox/rgf/extendJava/forwardToSuper/java_1_4/T-4-asm-debug.java sandbox/rgf/extendJava/forwardToSuper/java_1_4/T-4-asm-nl.java sandbox/rgf/extendJava/forwardToSuper/java_1_4/T-4-asm.java sandbox/rgf/extendJava/forwardToSuper/java_1_4/TS-4-asm-debug-nl.java sandbox/rgf/extendJava/forwardToSuper/java_1_4/TS-4-asm-debug.java sandbox/rgf/extendJava/forwardToSuper/java_1_4/TS-4-asm-nl.java sandbox/rgf/extendJava/forwardToSuper/java_1_4/TS-4-asm.java sandbox/rgf/extendJava/forwardToSuper/java_1_4/UT-4-asm-debug-nl.java sandbox/rgf/extendJava/forwardToSuper/java_1_4/UT-4-asm-debug.java sandbox/rgf/extendJava/forwardToSuper/java_1_4/UT-4-asm-nl.java sandbox/rgf/extendJava/forwardToSuper/java_1_4/UT-4-asm.java sandbox/rgf/extendJava/forwardToSuper/java_1_5/ sandbox/rgf/extendJava/forwardToSuper/java_1_5/T-5-asm-debug-nl.java sandbox/rgf/extendJava/forwardToSuper/java_1_5/T-5-asm-debug.java sandbox/rgf/extendJava/forwardToSuper/java_1_5/T-5-asm-nl.java sandbox/rgf/extendJava/forwardToSuper/java_1_5/T-5-asm.java sandbox/rgf/extendJava/forwardToSuper/java_1_5/TS-5-asm-debug-nl.java sandbox/rgf/extendJava/forwardToSuper/java_1_5/TS-5-asm-debug.java sandbox/rgf/extendJava/forwardToSuper/java_1_5/TS-5-asm-nl.java sandbox/rgf/extendJava/forwardToSuper/java_1_5/TS-5-asm.java sandbox/rgf/extendJava/forwardToSuper/java_1_5/UT-5-asm-debug-nl.java sandbox/rgf/extendJava/forwardToSuper/java_1_5/UT-5-asm-debug.java sandbox/rgf/extendJava/forwardToSuper/java_1_5/UT-5-asm-nl.java sandbox/rgf/extendJava/forwardToSuper/java_1_5/UT-5-asm.java sandbox/rgf/extendJava/forwardToSuper/java_1_6/ sandbox/rgf/extendJava/forwardToSuper/java_1_6/T-6-asm-debug-nl.java sandbox/rgf/extendJava/forwardToSuper/java_1_6/T-6-asm-debug.java sandbox/rgf/extendJava/forwardToSuper/java_1_6/T-6-asm-nl.java sandbox/rgf/extendJava/forwardToSuper/java_1_6/T-6-asm.java sandbox/rgf/extendJava/forwardToSuper/java_1_6/TS-6-asm-debug-nl.java sandbox/rgf/extendJava/forwardToSuper/java_1_6/TS-6-asm-debug.java sandbox/rgf/extendJava/forwardToSuper/java_1_6/TS-6-asm-nl.java sandbox/rgf/extendJava/forwardToSuper/java_1_6/TS-6-asm.java sandbox/rgf/extendJava/forwardToSuper/java_1_6/UT-6-asm-debug-nl.java sandbox/rgf/extendJava/forwardToSuper/java_1_6/UT-6-asm-debug.java sandbox/rgf/extendJava/forwardToSuper/java_1_6/UT-6-asm-nl.java sandbox/rgf/extendJava/forwardToSuper/java_1_6/UT-6-asm.java sandbox/rgf/extendJava/forwardToSuper/runAsm.cmd sandbox/rgf/extendJava/forwardToSuper/set2asm320.cmd sandbox/rgf/extendJava/forwardToSuper/test.rex sandbox/rgf/extendJava/jadRun.cmd sandbox/rgf/extendJava/janino/ sandbox/rgf/extendJava/janino/Aloha.java sandbox/rgf/extendJava/janino/Aloha2.java sandbox/rgf/extendJava/janino/Berta.class sandbox/rgf/extendJava/janino/Berta.java sandbox/rgf/extendJava/janino/Berta2.class sandbox/rgf/extendJava/janino/Berta2.java sandbox/rgf/extendJava/janino/Caesar.java sandbox/rgf/extendJava/janino/Dora.java sandbox/rgf/extendJava/janino/Dora2CompilesOKwithSunJavac6.class sandbox/rgf/extendJava/janino/Dora2CompilesOKwithSunJavac6.java sandbox/rgf/extendJava/janino/ProxiedJavaClassTool$RunInfos.class sandbox/rgf/extendJava/janino/ProxiedJavaClassTool.class sandbox/rgf/extendJava/janino/ProxiedJavaClassTool.java sandbox/rgf/extendJava/janino/TestAbstract.class sandbox/rgf/extendJava/janino/TestAbstract.java sandbox/rgf/extendJava/janino/TestSimpleCompiler.class sandbox/rgf/extendJava/janino/TestSimpleCompiler.java sandbox/rgf/extendJava/janino/bug20100412/ sandbox/rgf/extendJava/janino/bug20100412/Aloha.class sandbox/rgf/extendJava/janino/bug20100412/Aloha.java sandbox/rgf/extendJava/janino/bug20100412/TestSimpleCompiler.class sandbox/rgf/extendJava/janino/bug20100412/TestSimpleCompiler.java sandbox/rgf/extendJava/janino/readme.txt sandbox/rgf/extendJava/janino/rexxtry_script.txt sandbox/rgf/extendJava/janino/test1/ sandbox/rgf/extendJava/janino/test1/Test.java sandbox/rgf/extendJava/janino/test1/Test2.java sandbox/rgf/extendJava/janino/test1/TestFile.java sandbox/rgf/extendJava/janino/testJanino.rex sandbox/rgf/extendJava/runJdec.cmd sandbox/rgf/extendJava/set2asm320.cmd sandbox/rgf/extendJava/set2janino.cmd sandbox/rgf/extendJava/templ_03/ sandbox/rgf/extendJava/templ_03/ABC_Interface.class sandbox/rgf/extendJava/templ_03/ABC_Interface.java sandbox/rgf/extendJava/templ_03/TTS_Interface.class sandbox/rgf/extendJava/templ_03/TTS_Interface.java sandbox/rgf/extendJava/templ_03/TestConstr.class sandbox/rgf/extendJava/templ_03/TestConstr.java sandbox/rgf/extendJava/templ_03/TestConstrFromSubclass.class sandbox/rgf/extendJava/templ_03/TestConstrFromSubclass.java sandbox/rgf/extendJava/templ_03/TestConstrFromSubclass2.class sandbox/rgf/extendJava/templ_03/TestConstrFromSubclass2.java sandbox/rgf/extendJava/templ_03/TestFromCFS.class sandbox/rgf/extendJava/templ_03/TestFromCFS.java sandbox/rgf/extendJava/templ_03/TestTemplate.class sandbox/rgf/extendJava/templ_03/TestTemplate.java sandbox/rgf/extendJava/templ_03/TestTemplateShort.class sandbox/rgf/extendJava/templ_03/TestTemplateShort.java sandbox/rgf/extendJava/templ_03/XYZ_Interface.class sandbox/rgf/extendJava/templ_03/XYZ_Interface.java sandbox/rgf/extendJava/templ_03/addNL.rex sandbox/rgf/extendJava/templ_03/java_1_4/ sandbox/rgf/extendJava/templ_03/java_1_4/ABC_I-4-asm-debug-nl.java sandbox/rgf/extendJava/templ_03/java_1_4/ABC_I-4-asm-debug.java sandbox/rgf/extendJava/templ_03/java_1_4/ABC_I-4-asm-nl.java sandbox/rgf/extendJava/templ_03/java_1_4/ABC_I-4-asm.java sandbox/rgf/extendJava/templ_03/java_1_4/TC-4-asm-debug.java sandbox/rgf/extendJava/templ_03/java_1_4/TC-4-asm.java sandbox/rgf/extendJava/templ_03/java_1_4/TCFS-4-asm-debug.java sandbox/rgf/extendJava/templ_03/java_1_4/TCFS-4-asm.java sandbox/rgf/extendJava/templ_03/java_1_4/TCFS2-4-asm-debug.java sandbox/rgf/extendJava/templ_03/java_1_4/TCFS2-4-asm.java sandbox/rgf/extendJava/templ_03/java_1_4/TFCFS-4-asm-debug.java sandbox/rgf/extendJava/templ_03/java_1_4/TFCFS-4-asm.java sandbox/rgf/extendJava/templ_03/java_1_4/TT-4-asm-debug-nl.java sandbox/rgf/extendJava/templ_03/java_1_4/TT-4-asm-debug.java sandbox/rgf/extendJava/templ_03/java_1_4/TT-4-asm-nl.java sandbox/rgf/extendJava/templ_03/java_1_4/TT-4-asm.java sandbox/rgf/extendJava/templ_03/java_1_4/TTS-4-asm-debug-nl.java sandbox/rgf/extendJava/templ_03/java_1_4/TTS-4-asm-debug.java sandbox/rgf/extendJava/templ_03/java_1_4/TTS-4-asm-nl.java sandbox/rgf/extendJava/templ_03/java_1_4/TTS-4-asm.java sandbox/rgf/extendJava/templ_03/java_1_4/TTS_I-4-asm-debug-nl.java sandbox/rgf/extendJava/templ_03/java_1_4/TTS_I-4-asm-debug.java sandbox/rgf/extendJava/templ_03/java_1_4/TTS_I-4-asm-nl.java sandbox/rgf/extendJava/templ_03/java_1_4/TTS_I-4-asm.java sandbox/rgf/extendJava/templ_03/java_1_4/XYZ_I-4-asm-debug-nl.java sandbox/rgf/extendJava/templ_03/java_1_4/XYZ_I-4-asm-debug.java sandbox/rgf/extendJava/templ_03/java_1_4/XYZ_I-4-asm-nl.java sandbox/rgf/extendJava/templ_03/java_1_4/XYZ_I-4-asm.java sandbox/rgf/extendJava/templ_03/java_1_5/ sandbox/rgf/extendJava/templ_03/java_1_5/ABC_I-5-asm-debug-nl.java sandbox/rgf/extendJava/templ_03/java_1_5/ABC_I-5-asm-debug.java sandbox/rgf/extendJava/templ_03/java_1_5/ABC_I-5-asm-nl.java sandbox/rgf/extendJava/templ_03/java_1_5/ABC_I-5-asm.java sandbox/rgf/extendJava/templ_03/java_1_5/TC-5-asm-debug.java sandbox/rgf/extendJava/templ_03/java_1_5/TC-5-asm.java sandbox/rgf/extendJava/templ_03/java_1_5/TCFS-5-asm-debug.java sandbox/rgf/extendJava/templ_03/java_1_5/TCFS-5-asm.java sandbox/rgf/extendJava/templ_03/java_1_5/TCFS2-5-asm-debug.java sandbox/rgf/extendJava/templ_03/java_1_5/TCFS2-5-asm.java sandbox/rgf/extendJava/templ_03/java_1_5/TFCFS-5-asm-debug.java sandbox/rgf/extendJava/templ_03/java_1_5/TFCFS-5-asm.java sandbox/rgf/extendJava/templ_03/java_1_5/TT-5-asm-debug-nl.java sandbox/rgf/extendJava/templ_03/java_1_5/TT-5-asm-debug.java sandbox/rgf/extendJava/templ_03/java_1_5/TT-5-asm-nl.java sandbox/rgf/extendJava/templ_03/java_1_5/TT-5-asm.java sandbox/rgf/extendJava/templ_03/java_1_5/TTS-5-asm-debug-nl.java sandbox/rgf/extendJava/templ_03/java_1_5/TTS-5-asm-debug.java sandbox/rgf/extendJava/templ_03/java_1_5/TTS-5-asm-nl.java sandbox/rgf/extendJava/templ_03/java_1_5/TTS-5-asm.java sandbox/rgf/extendJava/templ_03/java_1_5/TTS_I-5-asm-debug-nl.java sandbox/rgf/extendJava/templ_03/java_1_5/TTS_I-5-asm-debug.java sandbox/rgf/extendJava/templ_03/java_1_5/TTS_I-5-asm-nl.java sandbox/rgf/extendJava/templ_03/java_1_5/TTS_I-5-asm.java sandbox/rgf/extendJava/templ_03/java_1_5/XYZ_I-5-asm-debug-nl.java sandbox/rgf/extendJava/templ_03/java_1_5/XYZ_I-5-asm-debug.java sandbox/rgf/extendJava/templ_03/java_1_5/XYZ_I-5-asm-nl.java sandbox/rgf/extendJava/templ_03/java_1_5/XYZ_I-5-asm.java sandbox/rgf/extendJava/templ_03/java_1_6/ sandbox/rgf/extendJava/templ_03/java_1_6/ABC_I-6-asm-debug-nl.java sandbox/rgf/extendJava/templ_03/java_1_6/ABC_I-6-asm-debug.java sandbox/rgf/extendJava/templ_03/java_1_6/ABC_I-6-asm-nl.java sandbox/rgf/extendJava/templ_03/java_1_6/ABC_I-6-asm.java sandbox/rgf/extendJava/templ_03/java_1_6/TC-6-asm-debug.java sandbox/rgf/extendJava/templ_03/java_1_6/TC-6-asm.java sandbox/rgf/extendJava/templ_03/java_1_6/TCFS-6-asm-debug.java sandbox/rgf/extendJava/templ_03/java_1_6/TCFS-6-asm.java sandbox/rgf/extendJava/templ_03/java_1_6/TCFS2-6-asm-debug.java sandbox/rgf/extendJava/templ_03/java_1_6/TCFS2-6-asm.java sandbox/rgf/extendJava/templ_03/java_1_6/TFCFS-6-asm-debug.java sandbox/rgf/extendJava/templ_03/java_1_6/TFCFS-6-asm.java sandbox/rgf/extendJava/templ_03/java_1_6/TT-6-asm-debug-nl.java sandbox/rgf/extendJava/templ_03/java_1_6/TT-6-asm-debug.java sandbox/rgf/extendJava/templ_03/java_1_6/TT-6-asm-nl.java sandbox/rgf/extendJava/templ_03/java_1_6/TT-6-asm.java sandbox/rgf/extendJava/templ_03/java_1_6/TTS-6-asm-debug-nl.java sandbox/rgf/extendJava/templ_03/java_1_6/TTS-6-asm-debug.java sandbox/rgf/extendJava/templ_03/java_1_6/TTS-6-asm-nl.java sandbox/rgf/extendJava/templ_03/java_1_6/TTS-6-asm.java sandbox/rgf/extendJava/templ_03/java_1_6/TTS_I-6-asm-debug-nl.java sandbox/rgf/extendJava/templ_03/java_1_6/TTS_I-6-asm-debug.java sandbox/rgf/extendJava/templ_03/java_1_6/TTS_I-6-asm-nl.java sandbox/rgf/extendJava/templ_03/java_1_6/TTS_I-6-asm.java sandbox/rgf/extendJava/templ_03/java_1_6/XYZ_I-6-asm-debug-nl.java sandbox/rgf/extendJava/templ_03/java_1_6/XYZ_I-6-asm-debug.java sandbox/rgf/extendJava/templ_03/java_1_6/XYZ_I-6-asm-nl.java sandbox/rgf/extendJava/templ_03/java_1_6/XYZ_I-6-asm.java sandbox/rgf/extendJava/templ_03/runAsm.cmd sandbox/rgf/extendJava/tests/ sandbox/rgf/extendJava/tests/ABC_Interface.class sandbox/rgf/extendJava/tests/ClassCruncher.class sandbox/rgf/extendJava/tests/ClassCruncher.java sandbox/rgf/extendJava/tests/ClassTeller.class sandbox/rgf/extendJava/tests/ClassTeller.java sandbox/rgf/extendJava/tests/MethodCruncher.class sandbox/rgf/extendJava/tests/MethodCruncher.java sandbox/rgf/extendJava/tests/MethodTeller.class sandbox/rgf/extendJava/tests/MethodTeller.java sandbox/rgf/extendJava/tests/TTS_Interface.class sandbox/rgf/extendJava/tests/Test.class sandbox/rgf/extendJava/tests/Test.class.adapted sandbox/rgf/extendJava/tests/Test.java sandbox/rgf/extendJava/tests/Test2.class sandbox/rgf/extendJava/tests/Test2.java sandbox/rgf/extendJava/tests/TestAdapter_CheckTrace.class sandbox/rgf/extendJava/tests/TestAdapter_CheckTrace.java sandbox/rgf/extendJava/tests/TestConstr.class sandbox/rgf/extendJava/tests/TestConstrFromSubclass.class sandbox/rgf/extendJava/tests/TestFromCFS.class sandbox/rgf/extendJava/tests/TestTemplate.class sandbox/rgf/extendJava/tests/TestTemplate.jad sandbox/rgf/extendJava/tests/TestTemplateAdapted.class sandbox/rgf/extendJava/tests/TestTemplateShort.class sandbox/rgf/extendJava/tests/TestTemplate_jad_from_4.java sandbox/rgf/extendJava/tests/TestTemplate_jad_from_5.java sandbox/rgf/extendJava/tests/TestTemplate_jad_from_6.java sandbox/rgf/extendJava/tests/XYZ_Interface.class sandbox/rgf/extendJava/tests/testFinalMethods/ sandbox/rgf/extendJava/tests/testFinalMethods/Test.class sandbox/rgf/extendJava/tests/testFinalMethods/Test.java sandbox/rgf/extendJava/tests/testFinalMethods/TestSub.java sandbox/rgf/extendJava/work_done_in_201011/ sandbox/rgf/extendJava/work_done_in_201011/BSF.CLS sandbox/rgf/extendJava/work_done_in_201011/aha.cls sandbox/rgf/extendJava/work_done_in_201011/aha.rxj sandbox/rgf/extendJava/work_done_in_201011/readme.txt sandbox/rgf/extendJava/work_done_in_201011/test1.rxj sandbox/rgf/extendJava/work_done_in_201011/test2.rxj sandbox/rgf/extendJava/work_done_in_201011/test4errors/ sandbox/rgf/extendJava/work_done_in_201011/test4errors/BSF_TEMP.CLS sandbox/rgf/extendJava/work_done_in_201011/test4errors/Dimension_$RexxExtendClass$_22772102.java sandbox/rgf/extendJava/work_done_in_201011/test4errors/ok.txt sandbox/rgf/extendJava/work_done_in_201011/test4errors/test1.rxj sandbox/rgf/extendJava/work_done_in_201011/test4errors/test2-complicated.rxj sandbox/rgf/extendJava/work_done_in_201011/test4errors/test2.rxj sandbox/rgf/extendJava/work_done_in_201011/testNew/ sandbox/rgf/extendJava/work_done_in_201011/testNew/BSF.CLS sandbox/rgf/extendJava/work_done_in_201011/testNew/test1.rxj sandbox/rgf/extendJava/work_done_in_201011/testNew/test2-complicated.rxj sandbox/rgf/extendJava/work_done_in_201011/testNew/test2.rxj sandbox/rgf/ooo/ sandbox/rgf/ooo/ScriptProviderForooRexxManifest.mf-works-copied-from-3beta Added: sandbox/rgf/extendJava/ASMifierRUN.cmd =================================================================== --- sandbox/rgf/extendJava/ASMifierRUN.cmd (rev 0) +++ sandbox/rgf/extendJava/ASMifierRUN.cmd 2011-04-02 17:20:49 UTC (rev 3) @@ -0,0 +1,3 @@ +@echo off +@echo %0: processing class "%1", all args: "%*" +java org.objectweb.asm.util.ASMifierClassVisitor %* Property changes on: sandbox/rgf/extendJava/ASMifierRUN.cmd ___________________________________________________________________ Added: svn:executable + * Added: sandbox/rgf/extendJava/TODO.txt =================================================================== --- sandbox/rgf/extendJava/TODO.txt (rev 0) +++ sandbox/rgf/extendJava/TODO.txt 2011-04-02 17:20:49 UTC (rev 3) @@ -0,0 +1,82 @@ +2010-02-23, Creating dynamically subclasses, rgf + +Probleme + - "java.lang.reflect.InvocationTargetException" *sometimes*, if creating + dynamically a proxied subclasses, cf. + + testExt.rex + + in + + F:\test\bsf4oorexx\20100212_ScreenShot_CreateOnTheFlyClass4Subclassing + + +ToDo: + - if abstract class: make sure that all abstract methods of all superclasses + are handled as well + + - allow creating proxy-methods for any method in any superclass, if they + carry new signatures (plus adding a "_forwardToSuper" for them as well) + + - create test cases for no method, one method, two methods, three methods, + all methods, with and without constructors ("<init>") + + +-------------- + + +From: "03_rexx_testExtendNormalCallback.testGroup" + + + ::method "test_01_plain_sendMessage_no_args" + /* due to the naming in this testgroup, this method will be the first that gets + run; as previous tests may have changed the "bsfPrefixReturnValue", make sure + that it is set as BSF.CLS routines and methods depend on that */ + if bsf("bsfPrefixReturnValue")=0 then + call bsf "bsfPrefixReturnValue", 1 -- make sure that it is set + + + ro=.SomeRexxClass~new -- create an instance of an ooRexx class + -- rpo=BsfCreateRexxProxy(ro, ,"rgf.E_extendNormalClasses.NormalTest") -- create Java RexxProxy object, being used as an AbstractTest object + ----------------------------------------------------------------------------------------- + rp=BsfCreateRexxProxy(ro) -- create a RexxProxy (Java) object of it + + extendingClassLoader=.bsf~new("org.rexxla.bsf.engines.rexx.RexxExtendingClassLoader") + classVersion=0 -- use the compiled class' class version + argArr=bsf.createArrayOf("java.lang.String", "dummy_Method") + clz=extendingClassLoader~generateAndLoadExtendedClass("rgf.E_extendNormalClasses.NormalTest", newName, classVersion, argArr) + + -- create an instance of the extended class, supplying the RexxProxy object + -- get constructor + argArr=bsf.createArrayOf("java.lang.Class", bsf.loadClass("org.rexxla.bsf.engines.rexx.RexxProxy")) + constructor=clz~getDeclaredConstructor(argArr) + self~assertNotNull(constructor, "constructor<>.nil") + + -- create instance + argArr=bsf.createArrayOf("java.lang.Object", rp) + rpo=constructor~newInstance(argArr) -- create instance of extended Java class + ----------------------------------------------------------------------------------------- + + listOfEntries=.list~of("METHODNAME", "METHODDESCRIPTOR", "JAVAOBJECT") + + expected=.directory~new + expected~methodName="dummy_Method" + expected~argArrayItems=1+1 -- one for argument, one for slotArgument + expected~slotArgument=.true + + rp_arr=rpo~dummy_Method("oha1") -- sendMessage interface method, fetch result from Rexx object's unknown + + noArgs=bsf.createArrayOf("java.lang.Object") -- no arguments (= empty array of arguments) + -- get UNKNOWN's arguments + oneArg=bsf.createArrayOf("java.lang.String", 1) + rp_arg1=rp_arr~sendMessage("AT", oneArg) + + oneArg[1]=2 + rp_arg2=rp_arr~sendMessage("[]", oneArg) + items=rp_arg2~sendMessage("items", noArgs) + + oneArg[1]=3 + rp_arg3=rp_arr~sendMessage("AT", oneArg) + + self~assertTrue(checkReturnedValues(expected, rp_arg1, rp_arg2, items, rp_arg3, listOfEntries, noArgs, oneArg)) + Property changes on: sandbox/rgf/extendJava/TODO.txt ___________________________________________________________________ Added: svn:executable + * Added: sandbox/rgf/extendJava/addNL.rex =================================================================== --- sandbox/rgf/extendJava/addNL.rex (rev 0) +++ sandbox/rgf/extendJava/addNL.rex 2011-04-02 17:20:49 UTC (rev 3) @@ -0,0 +1,18 @@ +level=0 +indent=" " +parse arg inFile +do while chars(inFile)>0 + line=linein(inFile) + if line="}" then level=-1 + + if level>0, pos("mv.visitLabel(",line)=0 then + .output~say(indent~copies(level) || line) + else + .output~say(line) + + if line="}" then + .output~say + + if line="{" then level=+1 +end +call stream inFile, "C", "close" Property changes on: sandbox/rgf/extendJava/addNL.rex ___________________________________________________________________ Added: svn:executable + * Added: sandbox/rgf/extendJava/besonderheiten.txt =================================================================== --- sandbox/rgf/extendJava/besonderheiten.txt (rev 0) +++ sandbox/rgf/extendJava/besonderheiten.txt 2011-04-02 17:20:49 UTC (rev 3) @@ -0,0 +1,91 @@ + +Java 4: + + - keine Frame-Hints + + - Byte, Short, Integer, Long, Float, Double: haben (noch) keine valueOf(primitiveValue)-Methoden! + + - stattdessen new class(arg) notwendig ! + + - synthetic static fields for primitive datatype Classes + + - synthetic static "class$" method + + - "StringBuffer" for println() + + +Java 5: + + - keine Frame-Hints + + +Java 6: + + - Frame-Hints + +-------------------------------------- + + proxy.invoke(): + + (String methodName, Object []args) + (String methodName, Object []args), String methodSignature) + + methodInfo: + methodDescription: asm-desc + signature|signatureExpanded|method attributes methodName | class-or-interface attributes interface-or-class-Name + + +-------------------------------------- + + offen: - non-abstract methods, allow access to super's method: + "methodName"+"_in_$super" ? or generically: + + "forwardToSuper"(methName, Object[] args) ? + + - auch "forwardToSuperStatic" ?? + + - what about "final" for arguments, any consequences in bytecode ? + +-------------------------------------- + callback: + rexxProxy.invoke( + Object javaObject, + String methodName, + String methodDescription, + Object[] args) + throws BSFException + ) + +-------------------------------------- + +Transformation (make sure class-names are correctly used): + + general: - ignore Attributes, Annotations, InnerClasses, OuterClasses + - adjust owner-name in instructions e.g. for fields + - visitSource: + - source: "BSF4Rexx: extends class XYZ [implements I1[, I2]...] + - debug: null + - process public and synthetic members only + - new name: name+"$RgfExtend + - add all abstract methods + - rewrite public constructors to: + - accept RexxProxy as first argument + - invoke superclass' constructor + + < V1_5: - synthetic (static) methods copy over as is + - synthetic fields, copy over + - use "StringBuffer" for creating output string + +-------------------------------------- + +invocation: + + - clzName, no-methodsList: - public constructors, [abstract methods,] forwardToSuper + + - clzName, methodsList: - public constructors, abstract methods, forwardToSuper, methods of list + + + - allow to use it as third parameter, in BsfCreateRexxProxy(), 4th and more arguments are then + taken as arguments for creating an instance (if this throws an exception, so be it) + + Property changes on: sandbox/rgf/extendJava/besonderheiten.txt ___________________________________________________________________ Added: svn:executable + * Added: sandbox/rgf/extendJava/dev/RexxExtendClass.class =================================================================== (Binary files differ) Property changes on: sandbox/rgf/extendJava/dev/RexxExtendClass.class ___________________________________________________________________ Added: svn:executable + * Added: svn:mime-type + application/octet-stream Added: sandbox/rgf/extendJava/dev/RexxExtendClass.java =================================================================== --- sandbox/rgf/extendJava/dev/RexxExtendClass.java (rev 0) +++ sandbox/rgf/extendJava/dev/RexxExtendClass.java 2011-04-02 17:20:49 UTC (rev 3) @@ -0,0 +1,4116 @@ + +// package org.rexxla.bsf.engines.rexx; + +// 2009-07-26, ---rgf +// TODO: +// +// -> test with 1.4, 1.5, 1.6 +// +// -> bsf.createArrayOf +// -> BsfCreateRexxProxy(): +// - first argument MUST be interface (name or clz) or abstract (name or clz) +// - interface [, int2]... returns JavaProxy +// - abstract [, arg1]... extends abstract class, creates instance and uses it + +// DONE: ---rgf, 2009-07-26, 2009-07-30 +// - add forwarding to RexxProxy optionally in constructor (either if "<all>" or "<init>" +// is given; method <desc> will only show the original constructor's desc +// +// - determine a unique class name (such that creating multiple class instances of the +// same base class is rather safe +// +// - no constructor: it is conceivable that there are +// classes that have no public constructor; in order to deal with those, the +// methods "setTargetRexxProxy()" and "getTargetRexxProxy()" get created, which allow +// to set and query the RexxProxy such a Java object will use to forward the +// method invocations to +// +// - if not all denoted names could be found, then throw error: OK, implemented +// +// - indicate to proxy all methods: OK, implemented (just supply null or an empty list +// for the methods to proxy) +// +// - add "setTargetRexxProxy(RexxProxy)" and "getTargetRexxProxy()": OK, implemented +// +// -> allow creating and loading an extended class where denoted method names are implemented +// in Rexx: OK, implemented + + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; + +import org.objectweb.asm.AnnotationVisitor; +import org.objectweb.asm.Attribute; +import org.objectweb.asm.ClassAdapter; +import org.objectweb.asm.ClassVisitor; +import org.objectweb.asm.FieldVisitor; +import org.objectweb.asm.Label; +import org.objectweb.asm.MethodAdapter; +import org.objectweb.asm.MethodVisitor; +import org.objectweb.asm.Opcodes; +import org.objectweb.asm.Type; + +import org.rexxla.bsf.engines.rexx.RexxException; +import org.apache.bsf.BSFException; + + +/** Extends a supplied class and creates proxy methods (dispatching to RexxProxy objects), + * if the Java methods are defined as abstract or if a list of Java methods to proxy gets + * supplied in the constructor. + * + * @author Rony G. Flatscher + */ +public class RexxExtendClass extends ClassAdapter implements ClassVisitor, Opcodes +{ + + /** + * The {@link ClassVisitor} to which this adapter delegates calls. + */ + protected ClassVisitor cv; + + final static protected boolean bDebugClassVisitor=false; // true; + final static protected boolean bDebugMethodVisitor=false; // true; + + final static String thisPgmName="RexxExtendClass"; + + final static String rexxExceptionName="org/rexxla/bsf/engines/rexx/RexxException"; + final static String rexxProxyName ="org/rexxla/bsf/engines/rexx/RexxProxy"; + + // map primitive types to corresponding wrapper classes +// final static HashMap access2string= new HashMap(); + + // map primitive types to corresponding wrapper classes + final static HashMap type2wrapperClass= new HashMap(); + + // map primitive types to corresponding method description of static method valueOf + final static HashMap type2valueOfDesc= new HashMap(); + + // map primitive types to corresponding method description for the constructor ("<init>") + final static HashMap type2initDesc= new HashMap(); + + // map primitive types to corresponeding method and method desc which returns the primitive value + final static HashMap type2getPrimitiveValue= new HashMap(); + + // map primitive types to corresponding static synthetic wrapper class fields + final static HashMap type2syntheticWrapperFields= new HashMap(); + + // set of primitive types + final static HashSet primitiveTypes=new HashSet(); + + // array of ICONST_ opcodes used for denoting index positions in arrays + final static int []arr_ICONST={ICONST_0, ICONST_1, ICONST_2, ICONST_3, ICONST_4, ICONST_5}; + + static + { +/* + // define mapping between ACC and corresponding string + access2string.put(ACC_PUBLIC , "public"); + access2string.put(ACC_ABSTRACT , "abstract"); + access2string.put(ACC_ANNOTATION , "@ANNOTATION"); + access2string.put(ACC_BRIDGE , "@BRIDGE@"); + access2string.put(ACC_DEPRECATED , "deprecated"); + access2string.put(ACC_ENUM , "enum"); + access2string.put(ACC_FINAL , "final"); + access2string.put(ACC_INTERFACE , "interface"); + access2string.put(ACC_NATIVE , "native"); + access2string.put(ACC_PRIVATE , "private"); + access2string.put(ACC_PROTECTED , "protected"); + access2string.put(ACC_STATIC , "static"); + access2string.put(ACC_STRICT , "strict"); + access2string.put(ACC_SUPER , "@SUPER@"); + access2string.put(ACC_SYNCHRONIZED, "synchronized"); + access2string.put(ACC_SYNTHETIC , "synthetic"); + access2string.put(ACC_TRANSIENT , "transient"); + access2string.put(ACC_VARARGS , "varargs/..."); + access2string.put(ACC_VOLATILE , "volatile"); +*/ + + // define mapping between primitive types and corresponding wrapper class + type2wrapperClass.put(Type.BOOLEAN_TYPE, "java/lang/Boolean" ); + type2wrapperClass.put(Type.BYTE_TYPE , "java/lang/Byte" ); + type2wrapperClass.put(Type.CHAR_TYPE , "java/lang/Character"); + type2wrapperClass.put(Type.SHORT_TYPE , "java/lang/Short" ); + type2wrapperClass.put(Type.INT_TYPE , "java/lang/Integer" ); + type2wrapperClass.put(Type.LONG_TYPE , "java/lang/Long" ); + type2wrapperClass.put(Type.FLOAT_TYPE , "java/lang/Float" ); + type2wrapperClass.put(Type.DOUBLE_TYPE , "java/lang/Double" ); + + type2valueOfDesc.put(Type.BOOLEAN_TYPE, "(Z)Ljava/lang/Boolean;" ); + type2valueOfDesc.put(Type.BYTE_TYPE , "(B)Ljava/lang/Byte;" ); + type2valueOfDesc.put(Type.CHAR_TYPE , "(C)Ljava/lang/Character;"); + type2valueOfDesc.put(Type.SHORT_TYPE , "(S)Ljava/lang/Short;" ); + type2valueOfDesc.put(Type.INT_TYPE , "(I)Ljava/lang/Integer;" ); + type2valueOfDesc.put(Type.LONG_TYPE , "(J)Ljava/lang/Long;" ); + type2valueOfDesc.put(Type.FLOAT_TYPE , "(F)Ljava/lang/Float;" ); + type2valueOfDesc.put(Type.DOUBLE_TYPE , "(D)Ljava/lang/Double;" ); + + // define method desc for <init> of wrapper types + type2initDesc.put(Type.BOOLEAN_TYPE, "(Z)V"); + type2initDesc.put(Type.BYTE_TYPE , "(B)V"); + type2initDesc.put(Type.CHAR_TYPE , "(C)V"); + type2initDesc.put(Type.SHORT_TYPE , "(S)V"); + type2initDesc.put(Type.INT_TYPE , "(I)V"); + type2initDesc.put(Type.LONG_TYPE , "(J)V"); + type2initDesc.put(Type.FLOAT_TYPE , "(F)V"); + type2initDesc.put(Type.DOUBLE_TYPE , "(D)V"); + + // map to method name and method desc: methName: [0] methDesc: [1] + type2getPrimitiveValue.put(Type.BOOLEAN_TYPE, new String[] { "booleanValue" , "()Z"} ); + type2getPrimitiveValue.put(Type.BYTE_TYPE , new String[] { "byteValue" , "()B"} ); + type2getPrimitiveValue.put(Type.CHAR_TYPE , new String[] { "charValue" , "()C"} ); + type2getPrimitiveValue.put(Type.SHORT_TYPE , new String[] { "shortValue" , "()S"} ); + type2getPrimitiveValue.put(Type.INT_TYPE , new String[] { "intValue" , "()I"} ); + type2getPrimitiveValue.put(Type.LONG_TYPE , new String[] { "longValue" , "()J"} ); + type2getPrimitiveValue.put(Type.FLOAT_TYPE , new String[] { "floatValue" , "()F"} ); + type2getPrimitiveValue.put(Type.DOUBLE_TYPE , new String[] { "doubleValue" , "()D"} ); + + + // define primitive types + primitiveTypes.add(Type.BOOLEAN_TYPE); + primitiveTypes.add(Type.BYTE_TYPE ); + primitiveTypes.add(Type.CHAR_TYPE ); + primitiveTypes.add(Type.SHORT_TYPE ); + primitiveTypes.add(Type.INT_TYPE ); + primitiveTypes.add(Type.LONG_TYPE ); + primitiveTypes.add(Type.FLOAT_TYPE ); + primitiveTypes.add(Type.DOUBLE_TYPE ); + + // < V1_5: define mapping between primitive types and corresponding synthetic static wrapper class fields + type2syntheticWrapperFields.put(Type.BOOLEAN_TYPE, "class$java$lang$Boolean" ); + type2syntheticWrapperFields.put(Type.BYTE_TYPE , "class$java$lang$Byte" ); + type2syntheticWrapperFields.put(Type.CHAR_TYPE , "class$java$lang$Character"); + type2syntheticWrapperFields.put(Type.SHORT_TYPE , "class$java$lang$Short" ); + type2syntheticWrapperFields.put(Type.INT_TYPE , "class$java$lang$Integer" ); + type2syntheticWrapperFields.put(Type.LONG_TYPE , "class$java$lang$Long" ); + type2syntheticWrapperFields.put(Type.FLOAT_TYPE , "class$java$lang$Float" ); + type2syntheticWrapperFields.put(Type.DOUBLE_TYPE , "class$java$lang$Double" ); + } + + TransformationData tranData=null; + public TransformationData getTranData() + { + return tranData; + } + + + /** + * Constructs a new {@link ClassAdapter} object. This mode of operation will + * only implement abstract methods which will be executed by the RexxProxy. + * + * @param cv the class visitor to which this adapter must delegate calls. + */ + public RexxExtendClass(final ClassVisitor cv) + { + super(cv); + this.cv = cv; // save cv in instance field + tranData=new TransformationData(); + } + + + /** + * Constructs a new {@link ClassAdapter} object. This mode of operation will + * implement public abstract methods which will be executed by the RexxProxy. In addition + * it creates proxy methods for each Java method that carries a name as supplied + * in the <code>methodNamesToAdd</code> array. + * + * <p>This constructor will only create proxy methods for public abstract methods. + * + * @param cv the class visitor to which this adapter must delegate calls. + * @param newClassName determines new name of the class, if null, an attempt to create + * a unique name is undertaken + * @param newClassVersion if >0 overrides the source class' version + */ + public RexxExtendClass(final ClassVisitor cv, + final String newClassName, + final int newClassVersion + ) + { + this(cv); + tranData.newClassName=newClassName; // save new class name, if any + + if (newClassVersion>0) // save new class version, if any + { + tranData.newClassVersion=newClassVersion; + } + +if (bDebugClassVisitor) System.out.println("--> ---> RexxExtendClass(cv, newClassName="+pp(newClassName)+ + ", newClassVersion="+pp(""+newClassVersion)); + + } + + + + /** + * Constructs a new {@link ClassAdapter} object. This mode of operation will + * implement public abstract methods which will be executed by the RexxProxy. In addition + * it creates proxy methods for each Java method that carries a name as supplied + * in the <code>methodNamesToAdd</code> array. If the <code>methodNamesToAdd</code> array + * is <code>null</code> or empty, then all public methods will have a proxy method created for. + * + * @param cv the class visitor to which this adapter must delegate calls. + * @param newClassName determines new name of the class, if null, an attempt to create + * a unique name is undertaken + * @param newClassVersion if >0 overrides the source class' version + * @param methodNamesToAdd a String array containing (caseless) method names for + * which proxy methods should be created + */ + public RexxExtendClass(final ClassVisitor cv, + final String newClassName, + final int newClassVersion, + final String [] methodNamesToAdd + ) + { + this(cv, newClassName, newClassVersion); +if (bDebugClassVisitor) System.out.println("--> ---> RexxExtendClass(cv, newClassName="+pp(newClassName)+ + ", newClassVersion="+pp(""+newClassVersion)+ + ", methodNamesToAdd)..."); + + if (methodNamesToAdd==null || methodNamesToAdd.length==0) + { + tranData.bProcessAllMethods=true; // create proxies for all methods! + } + else // add methods to proxy to appropriate HashSet, turn into uppercase + { + for (int i=0; i<methodNamesToAdd.length; i++) + { +if (bDebugClassVisitor) System.out.println("--> ---> RexxExtendClass(cv, newClassName, ...): i="+i+" ["+methodNamesToAdd[i]+"]"); + tranData.simpleMethodNamesToAdd.add(methodNamesToAdd[i].toUpperCase()); + } + } + } + + + + + // ClassVisitor method + public void visit( + final int version, + final int access, + final String name, + final String signature, + final String superName, + final String[] interfaces) // throws Throwable + { + +if (bDebugClassVisitor) System.err.println("--> "+"visit(version="+version+", access="+access+ + ", name="+name+", signature="+signature+", superName="+superName+ + ", [] interfaces="+interfaces+")\n\tnewClassVersion="+tranData.newClassVersion); + + if ((access & ACC_INTERFACE)!=0) // an interface in hand + { + throw new RuntimeException(thisPgmName+": \""+name+"\" is an interface, need a class instead"); + } + + if ((access & ACC_FINAL) != 0) // a final class in hand + { + throw new RuntimeException(thisPgmName+": class \""+name+"\" is final and cannot be extended"); + } + + if ((access & ACC_PUBLIC) == 0) // not a public class throw-up + { + throw new RuntimeException(thisPgmName+": class \""+name+"\" is not public"); + } + + + // if only abstract methods to proxy, then make sure class is marked as abstract + if ( !tranData.bProcessAllMethods && + (tranData.simpleMethodNamesToAdd.size()==0) && + ((access & ACC_ABSTRACT)==0) + ) + { + throw new RuntimeException(thisPgmName+": \""+name+"\" is not an abstract class (supply an abstract class or use a different constructor)"); + } + + +/* + // not an abstract class, but no methods to proxy given! + if ( ((access & ACC_ABSTRACT)==0) && (tranData.simpleMethodNamesToAdd.size()==0) ) + { + throw new RuntimeException(thisPgmName+": No methods to proxy given for non-abstract class \""+name+"\""); + } +*/ + + tranData.srcClassVersion =version; // Java version: can be V1_2, V1_5, V1_6, V1_7 + if (version<V1_5) + { + tranData.workPrintLnTarget ="java/lang/StringBuffer"; // Java 1.4 + tranData.workPrintLnTargetDesc="Ljava/lang/StringBuffer;"; // Java 1.4 + + + // we may need the following fields (for forwardToSuper[Strict]) + tranData.syntheticStaticFieldsToAdd=new HashSet(); + tranData.syntheticStaticFieldsToAdd.add("class$java$lang$Boolean" ); + tranData.syntheticStaticFieldsToAdd.add("class$java$lang$Byte" ); + tranData.syntheticStaticFieldsToAdd.add("class$java$lang$Character"); + tranData.syntheticStaticFieldsToAdd.add("class$java$lang$Short" ); + tranData.syntheticStaticFieldsToAdd.add("class$java$lang$Integer" ); + tranData.syntheticStaticFieldsToAdd.add("class$java$lang$Long" ); + tranData.syntheticStaticFieldsToAdd.add("class$java$lang$Float" ); + tranData.syntheticStaticFieldsToAdd.add("class$java$lang$Double" ); + } + tranData.srcClassAccess =access; // save access bits + tranData.srcClassName =name; // internal name + tranData.srcClassSuperName=superName; // internal name + tranData.srcClassInterfaces=interfaces; + + // create a unique class name, leave it in the same package + if (tranData.newClassName==null) + { + String extension="_$"+thisPgmName+"$_"+(new Object()).hashCode(); + tranData.newClassName=name+extension; + // TODO: remove the following statement (just there for easying debugging) + // tranData.newClassName=name+"_dynamicallyExtended_abc"; + } + + // make sure, abstract flag gets removed, also flag class as synthetic + tranData.newClassAccess= (access & ~ACC_ABSTRACT) | ACC_SYNTHETIC; + +if (bDebugClassVisitor) System.err.println(" "+"===> creating newClassName=["+tranData.newClassName+"]..."); + + // set signature and interfaces to null +// TODO: test whether in V1_6 and above it is o.k. to not have the frame layout injected; +// otherwise change the version to V1_5 (or if enough time create correct frame codes) + +System.err.println("RexxExtendClass: version="+version+ + ", tranData.newClassAccess="+tranData.newClassAccess+ + ", tranData.newClassName ="+tranData.newClassName+ + ", name ="+name); + + cv.visit( ( tranData.newClassVersion>0 ? tranData.newClassVersion: version), + tranData.newClassAccess, tranData.newClassName, null, name, null + ); + } + + + // ClassVisitor method + public void visitSource(final String source, final String debug) { +if (bDebugClassVisitor) System.err.println("--> "+"visitSource(source="+source+", debug="+debug+")"); + // for debugging purposes + cv.visitSource(thisPgmName+": extended class \""+tranData.srcClassName + +"\" to create \""+tranData.newClassName+"\"", null); + } + + + + // ClassVisitor method + // do not visit! + public void visitOuterClass( + final String owner, + final String name, + final String desc) + { +if (bDebugClassVisitor) System.err.println("--> "+"visitOuterClass(owner="+owner+", name="+name+", desc="+desc+")"); + // cv.visitOuterClass(owner, name, desc); + return; + } + + // ClassVisitor method + // do not visit! + public AnnotationVisitor visitAnnotation( + final String desc, + final boolean visible) + { +if (bDebugClassVisitor) System.err.println("--> "+"visitAnnotation(desc="+desc+", visible="+visible+")"); + // return cv.visitAnnotation(desc, visible); + return null; + } + + // ClassVisitor method + // do not visit! + public void visitAttribute(final Attribute attr) { +if (bDebugClassVisitor) System.err.println("--> "+"visitAttribute(attr="+attr+")"); + // cv.visitAttribute(attr); + return; + } + + // ClassVisitor method + // do not visit! + public void visitInnerClass( + final String name, + final String outerName, + final String innerName, + final int access) + { +if (bDebugClassVisitor) System.err.println("--> "+"visitInnerClass(name="+name+", outerName="+outerName+ + ", innerName="+innerName+", access="+access+")"); + // cv.visitInnerClass(name, outerName, innerName, access); + return; + } + + // ClassVisitor method + // do not visit! + public FieldVisitor visitField( + final int access, + final String name, + final String desc, + final String signature, + final Object value) + { +if (bDebugClassVisitor) System.err.println("--> "+"visitField(access="+access+", name="+name+ + ", desc="+desc+", signature="+signature+", value="+value+")"); + + return null; // do not process this field + } + + + // ClassVisitor method + public MethodVisitor visitMethod( + final int access, + final String name, + final String desc, + final String signature, + final String[] exceptions) + { +if (bDebugClassVisitor) System.err.println("--> "+"visitMethod(access="+access+", name="+name+ + ", desc="+desc+", signature="+signature+", [] exceptions="+exceptions+")"); + +if (bDebugMethodVisitor) System.err.println("\t---> desc=["+getMethodAccessAsString(access)+"]"); + + if ((access & ACC_PUBLIC)==0) // don't process non-public methods + { + +if (bDebugMethodVisitor) System.err.println("\tNOT PROCESSING! (not public)"); + return null; + } + + // do not process final and/or synthetic methods + if ((access & (ACC_FINAL | ACC_SYNTHETIC)) != 0) + { +if (bDebugMethodVisitor) System.err.println("\tNOT PROCESSING! (final or synthetic)"); + return null; + } + + if (name.equals("<clinit>")) // do not copy class initializer/constructor, will be built at the end + { +if (bDebugMethodVisitor) System.err.println("\tNOT PROCESSING! (class initializer)"); + return null; + } + + // make sure ACC_SYNCHRONIZED and ACC_STRICT ("strictfp") get removed + tranData.newMethodAccess= (access & ~(ACC_SYNCHRONIZED|ACC_STRICT)); + + tranData.isMethodStatic =((access & ACC_STATIC)!=0); + tranData.isMethodConstructor=name.equals("<init>"); + tranData.bCallbackFromConstructor=false; // reset flag to initial state, i.e. do not forward to RexxProxy + + // not processing all methods and not a constructor and not an abstract method + if (!tranData.bProcessAllMethods && !tranData.isMethodConstructor && ((access & ACC_ABSTRACT)==0)) + { + // not in list of methods to proxy, hence do not process it + if (!tranData.simpleMethodNamesToAdd.contains(name.toUpperCase())) + { +if (bDebugMethodVisitor) System.err.println("\tNOT PROCESSING! (not in list)"); + return null; + } + + // in case a constructor method got listed explicitly make sure that forwarding to the RexxProxy takes place! 2009-07-30 + tranData.bCallbackFromConstructor=tranData.isMethodConstructor; + + + if (tranData.isMethodStatic) // masking a static method? + { + tranData.isForward2SuperStaticNeeded=true; // we need a way to forward to super's class/static method + } + else // masking an instance method? + { + tranData.isForward2SuperNeeded=true; // we need a way to forward to super's method + } + } + else // remove ACC_ABSTRACT flag + { + // make sure we set the forwardToSuperNeeded flag, if processing a concrete method + if (tranData.isMethodStatic) // masking a static method? + { + tranData.isForward2SuperStaticNeeded=tranData.isForward2SuperStaticNeeded || (((access & ACC_ABSTRACT)==0)); + } + else // masking an instance method? + { + tranData.isForward2SuperNeeded=tranData.isForward2SuperNeeded || (((access & ACC_ABSTRACT)==0)); + } + + tranData.newMethodAccess= (access & ~ACC_ABSTRACT); // make sure, abstract flag gets removed + + if (tranData.bProcessAllMethods) + { + // add this method to those that we intended to add (all public methods) + tranData.simpleMethodNamesToAdd.add(name.toUpperCase()); + } + } + + + if (exceptions!=null) // add RexxException to list of exceptions + { + boolean bFound=false; + for (int i=0; i<exceptions.length && bFound==false; i++) + { + bFound=bFound || exceptions[i].equals(rexxExceptionName); + } + + // determine number of elements + tranData.newMethodsExceptions=new String[exceptions.length+(bFound?0:1)]; + // make a copy of the exceptions array + System.arraycopy(exceptions, 0, + tranData.newMethodsExceptions, 0, + exceptions.length); + + if (!bFound) // new array got extended by one slot + { + tranData.newMethodsExceptions[exceptions.length]=rexxExceptionName; + } + } + else // create exception list with RexxException as its sole element + { + tranData.newMethodsExceptions=new String[]{rexxExceptionName}; + } + + // save values + tranData.srcMethodAccess=access; + tranData.srcMethodName=name; + tranData.srcMethodDesc= desc; + tranData.srcMethodSignature=signature; // >= V 1.5 signature, can be null + tranData.srcMethodsExceptions=exceptions; // exceptions method throws + + tranData.srcArgumentTypes =Type.getArgumentTypes(tranData.srcMethodDesc); + tranData.srcReturnType =Type.getReturnType(tranData.srcMethodDesc); + + + // inject RexxProxy object as first argument ? + tranData.newMethodDesc= (tranData.isMethodConstructor ? "(L"+rexxProxyName+";"+desc.substring(1) + : desc); + + tranData.workArgumentTypes=Type.getArgumentTypes(tranData.newMethodDesc); + + // create our proxy method +if (bDebugMethodVisitor) System.err.println("\t---> tranData.newMethodAccess=["+getMethodAccessAsString(tranData.newMethodAccess)+"]"); +if (bDebugMethodVisitor) System.err.println("\t---> name=["+name+"], newMethodDesc=["+tranData.newMethodDesc+"], signature=["+signature+"]"); + MethodVisitor mv=cv.visitMethod(tranData.newMethodAccess, + name, + tranData.newMethodDesc, + signature, + tranData.newMethodsExceptions); + if (mv==null) // a ClassVisitor may have consumed this + { + return null; + } + + // memorize processed method + tranData.simpleMethodNamesAdded.add(name.toUpperCase()); // memorize method + + // tranData.fullMethodNamesAdded.add(name+tranData.newMethodDesc); // memorize method with desc (= signature) + tranData.fullMethodNamesAdded.add(name+desc); // memorize method with desc (= signature) + + // create code + mv.visitCode(); + + if (tranData.isMethodConstructor) + { + workConstructor(mv); + tranData.hasConstructorDefined=true; // remember that a constructor got defined + } + else + { + // - create code to handle arguments, if any + // depends whether method is static or not (first=idx=0 var is "this") + // [if <V1_5, then possible need for synthetic static fields and method "class$" + + // - invoke method on RexxProxy + + + // - if void: + // - invoke RexxProxy, pop return value, return + + // - if return value: + // - invoke RexxProxy + // - if Object, return as is + // - if primitive value, convert and return it + // - else cast return value to return type and return it + + workProcessArgsAndInvoke(mv); + + } + + // end of this method's code + mv.visitMaxs(tranData.workMaxStackSize, tranData.workMaxLocalSize); + mv.visitEnd(); + + return null; + // if returning mv, other filters may add code (e.g. in <init>s) + // return mv; + } + + + // place to add missing members (fields, methods) + public void visitEnd() { +if (bDebugClassVisitor) System.err.println("--> "+"visitEnd()."); + + workAddFields(cv); // add field definitions + workAddMethods(cv); // add instance and static methods we need + workAddMethodsToSuper(cv); // add "forwardToSuper" methods + workAddClinitMethod(cv); // add class initializer code + + cv.visitEnd(); // class visitation ended. + + +/* + // check whether we have at least one constructor defined, in case we insist on an + // initializable extended class; however, it is conceivable that there are + // classes that have no public constructor; in order to deal with those, there + // are the methods "setTargetRexxProxy()" and "getTargetRexxProxy()", which allow + // to set and query the RexxProxy such a Java object will use to forward the + // method invocations + if (!tranData.hasConstructorDefined) + { + throw new RuntimeException(thisPgmName+": Could not find a public constructor in class \""+tranData.srcClassName+"\""); + } +*/ + + // check whether given list of method names to proxy was fulfilled, if not throw an appropriate exception + if (!tranData.bProcessAllMethods && !tranData.simpleMethodNamesAdded.containsAll(tranData.simpleMethodNamesToAdd)) + { + HashSet diff=new HashSet(); + diff.addAll(tranData.simpleMethodNamesToAdd); // add all method names + diff.removeAll(tranData.simpleMethodNamesAdded); // remove the added method names + + throw new RuntimeException(thisPgmName+": class \""+tranData.srcClassName+"\" misses the following method names (uppercased) from the supplied list: "+diff); + } + } + + +// ========================================================================================== + + /** Creates the bytecode for processing arguments. + */ + void workConstructor(MethodVisitor mv) + { +if (bDebugMethodVisitor) System.err.println("\t===> "+"workCreateConstructor(): name="+pp(tranData.srcMethodName)+", desc="+pp(tranData.newMethodDesc)); + + mv.visitVarInsn(ALOAD, 0); // load 'this' + + // load arguments, if any, skip first argument (injected RexxProxy) + int nextSlot=2; // position on third var slot (0=this, 1=RexxProxy) + for (int i=1; i<tranData.workArgumentTypes.length; i++) + { + Type t=tranData.workArgumentTypes[i]; // get argument type + mv.visitVarInsn(t.getOpcode(ILOAD), nextSlot); // get matching opcode... [truncated message content] |