| summaryrefslogtreecommitdiff |
diff options
13 files changed, 202 insertions, 50 deletions
diff --git a/data/unit-testing/Makefile b/data/unit-testing/Makefile index 652dc05..df3e75a 100644 --- a/data/unit-testing/Makefile +++ b/data/unit-testing/Makefile @@ -17,7 +17,7 @@ clean: rm -f $(JSON_FILES) $(RESULT_FILES) $(RESULT_FILES): %.txt: %.fate.json - $(TONKADUR_INTERPRETER) $< > $@ + -$(TONKADUR_INTERPRETER) $< > $@ $(JSON_FILES): %.fate.json: %.fate - $(TONKADUR_COMPILER) $< + -$(TONKADUR_COMPILER) $< diff --git a/src/core/src/tonkadur/Main.java b/src/core/src/tonkadur/Main.java index a17cd41..ab086c1 100644 --- a/src/core/src/tonkadur/Main.java +++ b/src/core/src/tonkadur/Main.java @@ -24,15 +24,18 @@ public class Main tonkadur.fate.v1.Base.initialize(); tonkadur.wyrd.v1.Base.initialize(); - plugins = TonkadurPlugin.get_plugins(); if (!RuntimeParameters.parse_options(args)) { + plugins = TonkadurPlugin.get_plugins(); + RuntimeParameters.print_usage(plugins); return; } + plugins = TonkadurPlugin.get_plugins(); + for (final TonkadurPlugin tp: plugins) { tp.initialize(args); diff --git a/src/core/src/tonkadur/RuntimeParameters.java b/src/core/src/tonkadur/RuntimeParameters.java index b6a8f5c..3816bc7 100644 --- a/src/core/src/tonkadur/RuntimeParameters.java +++ b/src/core/src/tonkadur/RuntimeParameters.java @@ -13,6 +13,7 @@ public class RuntimeParameters { protected static final String version; protected static final List<String> include_directories; + protected static final List<String> jar_files; protected static final Collection<ErrorCategory> disabled_errors; protected static final Collection<ErrorCategory> tolerated_errors; protected static boolean consider_warnings_as_errors; @@ -20,8 +21,9 @@ public class RuntimeParameters static { - version = "0.9.0"; + version = "0.9.2"; include_directories = new ArrayList<String>(); + jar_files = new ArrayList<String>(); disabled_errors = new HashSet<ErrorCategory>(); tolerated_errors = new HashSet<ErrorCategory>(); consider_warnings_as_errors = false; @@ -47,6 +49,11 @@ public class RuntimeParameters return include_directories; } + public static List<String> get_jar_plugins () + { + return jar_files; + } + public static String get_input_file () { return target_file; @@ -75,7 +82,7 @@ public class RuntimeParameters ); System.out.println ( - " -te|--tolerate-error <name>\tRelates <name> to a simple warning." + " -te|--tolerate-error <name>\tRelegates <name> to a simple warning." ); System.out.println ( @@ -83,6 +90,10 @@ public class RuntimeParameters ); System.out.println ( + " -p|--plugin <jar>\tLoads 'tonkadur.plugin.*' classes from file." + ); + System.out.println + ( " --legal \t\t\tPrints the relevant licenses." ); @@ -125,6 +136,15 @@ public class RuntimeParameters { consider_warnings_as_errors = true; } + else if (option.equals("-p") || option.equals("--plugin")) + { + if (!options_it.hasNext()) + { + return false; + } + + jar_files.add(options_it.next()); + } else if (option.equals("-te") || option.equals("--tolerate-error")) { final ErrorCategory er; diff --git a/src/core/src/tonkadur/TonkadurPlugin.java b/src/core/src/tonkadur/TonkadurPlugin.java index c86b293..d7151aa 100644 --- a/src/core/src/tonkadur/TonkadurPlugin.java +++ b/src/core/src/tonkadur/TonkadurPlugin.java @@ -1,8 +1,15 @@ package tonkadur; +import java.net.URLClassLoader; +import java.net.URL; +import java.net.URI; + import java.util.ArrayList; import java.util.Enumeration; import java.util.List; + +import java.io.File; + import java.util.jar.JarEntry; import java.util.jar.JarFile; @@ -10,35 +17,17 @@ import tonkadur.parser.Context; public abstract class TonkadurPlugin { - public static List<TonkadurPlugin> get_plugins () + public static List<Class> get_classes_in + ( + final JarFile current_jar, + final String folder_path + ) { - final List<TonkadurPlugin> plugins; + final List<Class> result; final Enumeration<JarEntry> entries; - JarFile current_jar; - - plugins = new ArrayList<TonkadurPlugin>(); - current_jar = null; - - try - { - current_jar = - new JarFile - ( - TonkadurPlugin.class.getProtectionDomain - ( - ).getCodeSource().getLocation().getFile() - ); - } - catch (final Exception e) - { - e.printStackTrace(); - } + result = new ArrayList<Class>(); - if (current_jar == null) - { - return null; - } entries = current_jar.entries(); while (entries.hasMoreElements()) @@ -52,7 +41,7 @@ public abstract class TonkadurPlugin if ( !candidate_name.endsWith(".class") - || !candidate_name.startsWith("tonkadur/plugin/") + || !candidate_name.startsWith(folder_path) ) { continue; @@ -65,11 +54,66 @@ public abstract class TonkadurPlugin '.' ).substring(0, (candidate_name.length() - 6)); + System.out.println("[D] Loading class " + candidate + "..."); + + try + { + result.add + ( + Class.forName + ( + candidate_name, + true, + new URLClassLoader + ( + new URL[]{new File(current_jar.getName()).toURI().toURL()}, + TonkadurPlugin.class.getClassLoader() + ) + ) + ); + } + catch (final Throwable e) + { + System.err.println + ( + "Could not load class " + + candidate_name + + ": " + ); + e.printStackTrace(); + } + } + + return result; + } + + public static void initialize_classes_in + ( + final JarFile current_jar, + final String folder_path + ) + throws Throwable + { + // This already initializes the classes. + get_classes_in(current_jar, folder_path); + } + + public static List<TonkadurPlugin> extract_plugins_from + ( + final JarFile current_jar + ) + { + final List<TonkadurPlugin> plugins; + + plugins = new ArrayList<TonkadurPlugin>(); + + for (final Class c: get_classes_in(current_jar, "tonkadur/plugin")) + { try { plugins.add ( - (TonkadurPlugin) Class.forName(candidate_name).newInstance() + (TonkadurPlugin) c.newInstance() ); } catch (final Throwable e) @@ -77,7 +121,7 @@ public abstract class TonkadurPlugin System.err.println ( "Could not load plugin " - + candidate_name + + c.getName() + ": " ); e.printStackTrace(); @@ -87,6 +131,50 @@ public abstract class TonkadurPlugin return plugins; } + public static List<TonkadurPlugin> get_plugins () + { + final List<TonkadurPlugin> plugins; + + plugins = new ArrayList<TonkadurPlugin>(); + + try + { + plugins.addAll + ( + extract_plugins_from + ( + new JarFile + ( + TonkadurPlugin.class.getProtectionDomain + ( + ).getCodeSource().getLocation().getFile() + ) + ) + ); + } + catch (final Exception e) + { + e.printStackTrace(); + } + + for (final String jar_name: RuntimeParameters.get_jar_plugins()) + { + try + { + plugins.addAll + ( + extract_plugins_from(new JarFile(jar_name)) + ); + } + catch (final Exception e) + { + e.printStackTrace(); + } + } + + return plugins; + } + public void initialize (final String[] args) throws Throwable { diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/AddressOperator.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/AddressOperator.java index 5f51f1d..36b1e7f 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/AddressOperator.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/AddressOperator.java @@ -64,10 +64,6 @@ public class AddressOperator extends GenericComputation } } - public static void initialize_class () - { - } - /***************************************************************************/ /**** MEMBERS **************************************************************/ /***************************************************************************/ diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/AtReference.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/AtReference.java index 158cde6..fd7b617 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/AtReference.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/AtReference.java @@ -64,10 +64,6 @@ public class AtReference extends GenericComputation } } - public static void initialize_class () - { - } - /***************************************************************************/ /**** MEMBERS **************************************************************/ /***************************************************************************/ diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/LambdaEvaluation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/LambdaEvaluation.java index 0431e11..ce1157c 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/LambdaEvaluation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/LambdaEvaluation.java @@ -1,4 +1,4 @@ -package tonkadur.fate.v1.lang.computation; +package tonkadur.fate.v1.lang.computation.generic; import java.util.List; import java.util.ArrayList; @@ -15,6 +15,8 @@ import tonkadur.fate.v1.lang.meta.ComputationVisitor; import tonkadur.fate.v1.lang.meta.Computation; import tonkadur.fate.v1.lang.meta.RecurrentChecks; +import tonkadur.fate.v1.lang.computation.GenericComputation; + public class LambdaEvaluation extends GenericComputation { protected static final LambdaEvaluation ARCHETYPE; diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/Operation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/Operation.java index e443959..1183c8c 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/Operation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/Operation.java @@ -438,10 +438,6 @@ public class Operation extends GenericComputation } } - public static void initialize_class () - { - } - /***************************************************************************/ /**** MEMBERS **************************************************************/ /***************************************************************************/ diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Clear.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Clear.java index 124f3f8..2c42c91 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Clear.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Clear.java @@ -1,4 +1,4 @@ -package tonkadur.fate.v1.lang.instruction; +package tonkadur.fate.v1.lang.instruction.generic; import java.util.List; import java.util.ArrayList; @@ -9,6 +9,8 @@ import tonkadur.parser.ParsingError; import tonkadur.fate.v1.lang.meta.Computation; import tonkadur.fate.v1.lang.meta.RecurrentChecks; +import tonkadur.fate.v1.lang.instruction.GenericInstruction; + public class Clear extends GenericInstruction { protected static final Clear ARCHETYPE; diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Free.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Free.java index 64e02cf..cc1eb50 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Free.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Free.java @@ -1,4 +1,4 @@ -package tonkadur.fate.v1.lang.instruction; +package tonkadur.fate.v1.lang.instruction.generic; import java.util.List; import java.util.ArrayList; @@ -49,6 +49,7 @@ public class Free extends GenericInstruction System.exit(-1); } } + /***************************************************************************/ /**** MEMBERS **************************************************************/ /***************************************************************************/ diff --git a/src/core/src/tonkadur/fate/v1/lang/type/Type.java b/src/core/src/tonkadur/fate/v1/lang/type/Type.java index be9901b..c1e074b 100644 --- a/src/core/src/tonkadur/fate/v1/lang/type/Type.java +++ b/src/core/src/tonkadur/fate/v1/lang/type/Type.java @@ -40,7 +40,7 @@ public class Type extends DeclaredEntity /* * Use of a space necessary to avoid conflicting with a user created type. */ - ANY = new Type(base, null, "undetermined type"); + ANY = new Type(base, null, "(undetermined type)"); BOOL = new Type(base, null, "bool"); FLOAT = new Type(base, null, "float"); diff --git a/src/core/src/tonkadur/plugin/base/BaseLanguage.java b/src/core/src/tonkadur/plugin/base/BaseLanguage.java new file mode 100644 index 0000000..9ef4278 --- /dev/null +++ b/src/core/src/tonkadur/plugin/base/BaseLanguage.java @@ -0,0 +1,47 @@ +package tonkadur.plugin.base; + +import java.util.jar.JarFile; + +import tonkadur.TonkadurPlugin; + +public class BaseLanguage extends TonkadurPlugin +{ + @Override + public void initialize (final String[] args) + throws Throwable + { + final JarFile base_jar; + + base_jar = + new JarFile + ( + BaseLanguage.class.getProtectionDomain + ( + ).getCodeSource().getLocation().getFile() + ); + + TonkadurPlugin.initialize_classes_in + ( + base_jar, + "tonkadur/fate/v1/lang/computation/generic" + ); + + TonkadurPlugin.initialize_classes_in + ( + base_jar, + "tonkadur/fate/v1/lang/instruction/generic" + ); + + TonkadurPlugin.initialize_classes_in + ( + base_jar, + "tonkadur/wyrd/v1/compiler/fate/v1/computation/generic" + ); + + TonkadurPlugin.initialize_classes_in + ( + base_jar, + "tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic" + ); + } +} diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java index 1880fbe..97b212a 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java @@ -2300,6 +2300,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor body = new ArrayList<Instruction>(); + compiler.registers().push_hierarchical_instruction_level(); ic = new InstructionCompiler(compiler); n.get_pre().get_visited_by(ic); @@ -2358,7 +2359,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor ) ); } - + compiler.registers().pop_hierarchical_instruction_level(result); compiler.assembler().pop_context_label("breakable"); cc.release_registers(result); } |


