| summaryrefslogtreecommitdiff | 
diff options
Diffstat (limited to 'src')
12 files changed, 200 insertions, 48 deletions
| 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);     } | 


