summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--data/unit-testing/Makefile4
-rw-r--r--src/core/src/tonkadur/Main.java5
-rw-r--r--src/core/src/tonkadur/RuntimeParameters.java24
-rw-r--r--src/core/src/tonkadur/TonkadurPlugin.java144
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/AddressOperator.java4
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/AtReference.java4
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/LambdaEvaluation.java4
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/Operation.java4
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/generic/Clear.java4
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/generic/Free.java3
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/type/Type.java2
-rw-r--r--src/core/src/tonkadur/plugin/base/BaseLanguage.java47
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java3
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);
}