From a4d2fbe13e231bffc4b7cbd53349816c66c47610 Mon Sep 17 00:00:00 2001 From: Thomas Walker Lynch Date: Thu, 19 Dec 2024 11:33:42 +0000 Subject: [PATCH] debug of Mosaic_Dispatch --- .idea/runConfigurations/Dispatch_0.xml | 17 ++ .idea/runConfigurations/debug_0.xml | 18 ++ .../Mosaic_Dispatcher.java" | 203 +++++++----------- release/Mosaic.jar | Bin 960692 -> 961697 bytes .../javac\360\237\226\211/Dispatch_0.java" | 9 +- .../javac\360\237\226\211/TestClasses_0.java" | 2 - 6 files changed, 114 insertions(+), 135 deletions(-) create mode 100644 .idea/runConfigurations/Dispatch_0.xml create mode 100644 .idea/runConfigurations/debug_0.xml diff --git a/.idea/runConfigurations/Dispatch_0.xml b/.idea/runConfigurations/Dispatch_0.xml new file mode 100644 index 0000000..0f3fa0d --- /dev/null +++ b/.idea/runConfigurations/Dispatch_0.xml @@ -0,0 +1,17 @@ + + + + \ No newline at end of file diff --git a/.idea/runConfigurations/debug_0.xml b/.idea/runConfigurations/debug_0.xml new file mode 100644 index 0000000..b60e910 --- /dev/null +++ b/.idea/runConfigurations/debug_0.xml @@ -0,0 +1,18 @@ + + + + + + + \ No newline at end of file diff --git "a/developer/javac\360\237\226\211/Mosaic_Dispatcher.java" "b/developer/javac\360\237\226\211/Mosaic_Dispatcher.java" index e47c0c9..c3822b4 100644 --- "a/developer/javac\360\237\226\211/Mosaic_Dispatcher.java" +++ "b/developer/javac\360\237\226\211/Mosaic_Dispatcher.java" @@ -211,143 +211,90 @@ class MethodSignature_To_Handle_Map{ map.put(key ,value); } - public void add_class(Class class_metadata){ + public void add_methods(Class class_metadata){ try{ - test_print("adding public methods"); - add_methods_public(class_metadata); + MethodHandles.Lookup lookup = MethodHandles.lookup(); + MethodHandles.Lookup private_lookup = MethodHandles.privateLookupIn(class_metadata,lookup); - test_print("adding private methods"); - add_methods_private(class_metadata); - - test_print("adding constructors"); - add_constructors(class_metadata); - - /* - test_print("adding static methods"); - add_methods_static(class_metadata); - */ - - }catch(Throwable t){ - System.out.println("MethodSignature_To_Handle_Map::add_class exception: "); - t.printStackTrace(); - } - } + for(Method method:class_metadata.getDeclaredMethods()){ + try{ + Class[] parameter_type_list=method.getParameterTypes(); + MethodSignature signature=new MethodSignature( + method.getReturnType(), + class_metadata.getName(), + method.getName(), + parameter_type_list + ); - public void add_methods_public(Class class_metadata){ - MethodHandles.Lookup lookup = MethodHandles.lookup(); + MethodType method_type=MethodType.methodType(method.getReturnType(),parameter_type_list); + MethodHandle method_handle; + + if((method.getModifiers() & Modifier.STATIC) != 0){ + if((method.getModifiers() & Modifier.PRIVATE) != 0){ + // Private static method + method_handle = private_lookup.findStatic(class_metadata, method.getName(), method_type); + }else{ + // Public or protected static method + method_handle = lookup.findStatic(class_metadata, method.getName(), method_type); + } + }else if((method.getModifiers() & Modifier.PRIVATE) != 0){ + // Private instance method + method_handle = private_lookup.findSpecial(class_metadata, method.getName(), method_type, class_metadata); + }else{ + // Public or protected instance method + method_handle = lookup.findVirtual(class_metadata, method.getName(), method_type); + } - for( Method method : class_metadata.getDeclaredMethods() ){ - try{ - if((method.getModifiers() & Modifier.PRIVATE) == 0){ // Skip private methods - Class[] parameter_type_list = method.getParameterTypes(); - MethodType method_type = MethodType.methodType(method.getReturnType() ,parameter_type_list); - MethodHandle method_handle = lookup.findVirtual(class_metadata ,method.getName() ,method_type); + add_entry(signature,method_handle); - MethodSignature signature = new MethodSignature - ( - method.getReturnType() - ,class_metadata.getName() - ,method.getName() - ,parameter_type_list - ); - add_entry(signature ,method_handle); + }catch(IllegalAccessException|NoSuchMethodException e){ + System.err.println("Mosaic_Dispatcher::add_methods unexpectedly failed to register method: "+method.getName()); + e.printStackTrace(); } - }catch(NoSuchMethodException e){ - System.err.println("Skipping public/protected method: " + method); - e.printStackTrace(); - }catch(Throwable t){ - t.printStackTrace(); } + + }catch(IllegalAccessException e){ + System.err.println("Mosaic_Dispatcher::add_methods unexpectedly failed to initialize lookup for class: "+class_metadata.getName()); + e.printStackTrace(); } } - public void add_methods_private(Class class_metadata) throws IllegalAccessException{ - MethodHandles.Lookup lookup = MethodHandles.lookup(); - MethodHandles.Lookup private_lookup = MethodHandles.privateLookupIn(class_metadata ,lookup); - for(Method method : class_metadata.getDeclaredMethods()){ - try{ - if((method.getModifiers() & Modifier.PRIVATE) != 0){ // Only private methods - Class[] parameter_type_list = method.getParameterTypes(); - MethodType method_type = MethodType.methodType(method.getReturnType() ,parameter_type_list); - MethodHandle method_handle = private_lookup.findSpecial( - class_metadata ,method.getName() ,method_type ,class_metadata - ); + public void add_constructors(Class class_metadata){ + try{ - MethodSignature signature = new MethodSignature - ( - method.getReturnType() - ,class_metadata.getName() - ,method.getName() - ,parameter_type_list - ); - add_entry(signature ,method_handle); - } - }catch(NoSuchMethodException e){ - System.err.println("Skipping private method: " + method); - }catch(Throwable t){ - t.printStackTrace(); - } - } - } - - public void add_constructors(Class class_metadata) throws IllegalAccessException{ - MethodHandles.Lookup lookup = MethodHandles.lookup(); - MethodHandles.Lookup private_lookup = MethodHandles.privateLookupIn(class_metadata ,lookup); - - for( Constructor constructor : class_metadata.getDeclaredConstructors() ){ - try{ - Class[] parameter_type_list = constructor.getParameterTypes(); - MethodType method_type = MethodType.methodType(void.class, parameter_type_list); - MethodHandle constructor_handle = private_lookup.findConstructor(class_metadata ,method_type); - - // Signature for constructors: with parameter types - MethodSignature signature = new MethodSignature - ( - void.class - ,class_metadata.getName() - ,"" - ,parameter_type_list - ); - add_entry(signature ,constructor_handle); - - }catch(NoSuchMethodException e){ - System.err.println("Skipping constructor: " + constructor); - }catch(Throwable t){ - t.printStackTrace(); - } - } - } + MethodHandles.Lookup lookup = MethodHandles.lookup(); + MethodHandles.Lookup private_lookup = MethodHandles.privateLookupIn(class_metadata ,lookup); - public void add_methods_static(Class class_metadata) { - MethodHandles.Lookup lookup = MethodHandles.lookup(); + for( Constructor constructor : class_metadata.getDeclaredConstructors() ){ + try{ - for (Method method : class_metadata.getDeclaredMethods()) { - try { - if (Modifier.isStatic(method.getModifiers())) { // Only static methods - Class[] parameter_type_list = method.getParameterTypes(); - MethodType method_type = MethodType.methodType(method.getReturnType(), parameter_type_list); - MethodHandle method_handle = lookup.findStatic(class_metadata, method.getName(), method_type); + Class[] parameter_type_list = constructor.getParameterTypes(); + MethodType method_type = MethodType.methodType(void.class, parameter_type_list); + MethodHandle constructor_handle = private_lookup.findConstructor(class_metadata ,method_type); - MethodSignature signature = new MethodSignature( - method.getReturnType(), - class_metadata.getName(), - method.getName(), - parameter_type_list - ); + // Signature for constructors: with parameter types + MethodSignature signature = new MethodSignature + ( + void.class + ,class_metadata.getName() + ,"" + ,parameter_type_list + ); + add_entry(signature ,constructor_handle); - add_entry(signature, method_handle); + }catch(IllegalAccessException|NoSuchMethodException e){ + System.err.println("Mosaic_Dispatcher::add_methods unexpectedly failed to register constructor: " + class_metadata.getName()); + e.printStackTrace(); } - } catch (NoSuchMethodException e) { - System.err.println("Skipping static method: " + method); - e.printStackTrace(); - } catch (Throwable t) { - t.printStackTrace(); } + + }catch(IllegalAccessException e){ + System.err.println("Mosaic_Dispatcher::add_methods unexpectedly failed to initialize lookup for class: " + class_metadata.getName()); + e.printStackTrace(); } } - // methods for looking up handles // public MethodHandle lookup(MethodSignature s){ @@ -361,7 +308,7 @@ class MethodSignature_To_Handle_Map{ StringBuilder sb = new StringBuilder(); sb.append("MethodSignature_To_Handle_Map:{").append(System.lineSeparator()); - for (Map.Entry entry : map.entrySet()){ + for(Map.Entry entry : map.entrySet()){ sb.append(" ") .append(entry.getKey().toString()) // MethodSignature's toString .append(" -> ") @@ -385,17 +332,17 @@ public class Mosaic_Dispatcher{ // private static boolean test = false; public static void test_switch(boolean test){ - if (Mosaic_Dispatcher.test && !test){ + if(Mosaic_Dispatcher.test && !test){ test_print("Mosaic_Dispatcher:: test messages off"); } - if (!Mosaic_Dispatcher.test && test){ + if(!Mosaic_Dispatcher.test && test){ test_print("Mosaic_Dispatcher:: test messages on"); MethodSignature_To_Handle_Map.test_switch(true); } Mosaic_Dispatcher.test = test; } - private static void test_print(String message){ - if (test){ + public static void test_print(String message){ + if(test){ System.out.println(message); } } @@ -428,19 +375,17 @@ public class Mosaic_Dispatcher{ this.map = new MethodSignature_To_Handle_Map(); this.target = target; test_print("Mosaic_Dispatcher:: mapping methods given class_metadata object: " + to_string_target()); - this.map.add_class(target); + this.map.add_methods(target); + this.map.add_constructors(target); } // Constructor accepting a fully qualified class name of the target class public Mosaic_Dispatcher(String fully_qualified_class_name) throws ClassNotFoundException{ this.map = new MethodSignature_To_Handle_Map(); - try{ - this.target = Class.forName(fully_qualified_class_name); - test_print("Mosaic_Dispatcher:: mapping methods from class specified by string:" + to_string_target()); - this.map.add_class(target); - }catch(ClassNotFoundException e){ - throw new ClassNotFoundException("Class not found: " + fully_qualified_class_name ,e); - } + this.target = Class.forName(fully_qualified_class_name); + test_print("Mosaic_Dispatcher:: mapping methods from class specified by string:" + to_string_target()); + this.map.add_methods(target); + this.map.add_constructors(target); } // methods unique to the class diff --git a/release/Mosaic.jar b/release/Mosaic.jar index 4acbf18f9065234356c55191c7d3910884404ba1..a7c41b79d5f311f05ea4894982a1b40dd3892cee 100644 GIT binary patch delta 12512 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 delta 11566 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