| summaryrefslogtreecommitdiff |
diff options
63 files changed, 2876 insertions, 2019 deletions
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/AmbiguousWord.java b/src/core/src/tonkadur/fate/v1/lang/computation/AmbiguousWord.java index b29e997..d78dcc9 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/AmbiguousWord.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/AmbiguousWord.java @@ -1,6 +1,7 @@ package tonkadur.fate.v1.lang.computation; import tonkadur.parser.Origin; +import tonkadur.parser.ParsingError; import tonkadur.fate.v1.parser.ParserData; diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/FieldAccess.java b/src/core/src/tonkadur/fate/v1/lang/computation/FieldAccess.java index 0b89688..d48c997 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/FieldAccess.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/FieldAccess.java @@ -4,6 +4,7 @@ import java.util.Collections; import java.util.List; import tonkadur.parser.Origin; +import tonkadur.parser.ParsingError; import tonkadur.error.ErrorManager; diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/Let.java b/src/core/src/tonkadur/fate/v1/lang/computation/Let.java index d093b80..baba303 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/Let.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/Let.java @@ -75,6 +75,13 @@ public class Let extends Computation return assignments; } + @Override + public void use_as_reference () + throws ParsingError + { + computation.use_as_reference(); + } + /**** Misc. ****************************************************************/ @Override public String toString () diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/VariableReference.java b/src/core/src/tonkadur/fate/v1/lang/computation/VariableReference.java index 98f6116..6b7f2ac 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/VariableReference.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/VariableReference.java @@ -1,6 +1,7 @@ package tonkadur.fate.v1.lang.computation; import tonkadur.parser.Origin; +import tonkadur.parser.ParsingError; import tonkadur.fate.v1.lang.Variable; diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/Access.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/Access.java index d1527aa..67335f3 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/Access.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/Access.java @@ -6,6 +6,7 @@ import java.util.Collections; import java.util.List; import tonkadur.parser.Origin; +import tonkadur.parser.ParsingError; import tonkadur.error.ErrorManager; 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 19e5c0b..b28abbc 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 @@ -6,6 +6,7 @@ import java.util.Collections; import java.util.List; import tonkadur.parser.Origin; +import tonkadur.parser.ParsingError; import tonkadur.error.ErrorManager; diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/CarCdr.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/CarCdr.java index 1400847..48f50e2 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/CarCdr.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/CarCdr.java @@ -6,6 +6,7 @@ import java.util.Collections; import java.util.List; import tonkadur.parser.Origin; +import tonkadur.parser.ParsingError; import tonkadur.error.ErrorManager; diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedMergeComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedMergeComputation.java index aba8e45..c90540d 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedMergeComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedMergeComputation.java @@ -35,6 +35,24 @@ public class IndexedMergeComputation extends GenericComputation aliases.add("set:indexedMerge"); aliases.add("set:imerge"); + aliases.add("list:indexed_safe_merge"); + aliases.add("list:indexedsafemerge"); + aliases.add("list:indexedSafeMerge"); + aliases.add("list:isafemerge"); + aliases.add("list:safe_indexed_merge"); + aliases.add("list:safeindexedmerge"); + aliases.add("list:safeIndexedMerge"); + aliases.add("list:safeimerge"); + + aliases.add("set:indexed_safe_merge"); + aliases.add("set:indexedsafemerge"); + aliases.add("set:indexedSafeMerge"); + aliases.add("set:isafemerge"); + aliases.add("set:safe_indexed_merge"); + aliases.add("set:safeindexedmerge"); + aliases.add("set:safeIndexedMerge"); + aliases.add("set:safeimerge"); + return aliases; } diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/MergeComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/MergeComputation.java index 171d448..3ebe675 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/MergeComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/MergeComputation.java @@ -27,7 +27,13 @@ public class MergeComputation extends GenericComputation aliases = new ArrayList<String>(); aliases.add("list:merge"); + aliases.add("list:safe_merge"); + aliases.add("list:safemerge"); + aliases.add("list:safeMerge"); aliases.add("set:merge"); + aliases.add("set:safe_merge"); + aliases.add("set:safemerge"); + aliases.add("set:safeMerge"); return aliases; } diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/AddElement.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/AddElement.java index 51296f4..53240cb 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/AddElement.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/AddElement.java @@ -12,6 +12,8 @@ import tonkadur.fate.v1.lang.meta.Instruction; import tonkadur.fate.v1.lang.meta.Computation; import tonkadur.fate.v1.lang.meta.RecurrentChecks; +import tonkadur.fate.v1.lang.instruction.GenericInstruction; + public class AddElement extends GenericInstruction { public static Collection<String> get_aliases () diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/AddElementAt.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/AddElementAt.java index 4436bea..4b784f1 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/AddElementAt.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/AddElementAt.java @@ -14,6 +14,8 @@ import tonkadur.fate.v1.lang.meta.Instruction; import tonkadur.fate.v1.lang.meta.Computation; import tonkadur.fate.v1.lang.meta.RecurrentChecks; +import tonkadur.fate.v1.lang.instruction.GenericInstruction; + public class AddElementAt extends GenericInstruction { public static Collection<String> get_aliases () diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/AddElementsOf.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/AddElementsOf.java index 689ae35..f0b9f8c 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/AddElementsOf.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/AddElementsOf.java @@ -14,6 +14,8 @@ import tonkadur.fate.v1.lang.meta.Instruction; import tonkadur.fate.v1.lang.meta.Computation; import tonkadur.fate.v1.lang.meta.RecurrentChecks; +import tonkadur.fate.v1.lang.instruction.GenericInstruction; + public class AddElementsOf extends GenericInstruction { public static Collection<String> get_aliases () diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Allocate.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Allocate.java index 6d42e94..9043194 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Allocate.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Allocate.java @@ -16,6 +16,7 @@ import tonkadur.fate.v1.lang.type.Type; import tonkadur.fate.v1.lang.type.PointerType; import tonkadur.fate.v1.lang.meta.Computation; +import tonkadur.fate.v1.lang.meta.Instruction; import tonkadur.fate.v1.lang.instruction.GenericInstruction; diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Break.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Break.java index dd26d0e..b8305bd 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Break.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Break.java @@ -8,6 +8,9 @@ import tonkadur.parser.Origin; import tonkadur.fate.v1.lang.meta.InstructionVisitor; import tonkadur.fate.v1.lang.meta.Instruction; +import tonkadur.fate.v1.lang.meta.Computation; + +import tonkadur.fate.v1.lang.instruction.GenericInstruction; public class Break extends GenericInstruction { @@ -17,12 +20,7 @@ public class Break extends GenericInstruction aliases = new ArrayList<String>(); - aliases.add("list:add_element_at"); - aliases.add("list:addelementat"); - aliases.add("list:addElementAt"); - aliases.add("list:add_at"); - aliases.add("list:addat"); - aliases.add("list:addAt"); + aliases.add("break"); return aliases; } @@ -35,6 +33,17 @@ public class Break extends GenericInstruction ) throws Throwable { + if (call_parameters.size() != 0) + { + // TODO: Error. + System.err.println("Wrong number of params at " + origin.toString()); + + return null; + } + + return new Break(origin); + } + /***************************************************************************/ /**** MEMBERS **************************************************************/ /***************************************************************************/ @@ -48,14 +57,6 @@ public class Break extends GenericInstruction super(origin); } - /**** Accessors ************************************************************/ - @Override - public void get_visited_by (final InstructionVisitor iv) - throws Throwable - { - iv.visit_break(this); - } - /**** Misc. ****************************************************************/ @Override public String toString () 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 f228174..ce59cdf 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 @@ -8,6 +8,7 @@ import tonkadur.parser.Origin; import tonkadur.parser.ParsingError; import tonkadur.fate.v1.lang.meta.Computation; +import tonkadur.fate.v1.lang.meta.Instruction; import tonkadur.fate.v1.lang.meta.RecurrentChecks; import tonkadur.fate.v1.lang.instruction.GenericInstruction; diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Done.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Done.java index ec21eec..844c583 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Done.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Done.java @@ -8,6 +8,9 @@ import tonkadur.parser.Origin; import tonkadur.fate.v1.lang.meta.InstructionVisitor; import tonkadur.fate.v1.lang.meta.Instruction; +import tonkadur.fate.v1.lang.meta.Computation; + +import tonkadur.fate.v1.lang.instruction.GenericInstruction; public class Done extends GenericInstruction { @@ -17,12 +20,7 @@ public class Done extends GenericInstruction aliases = new ArrayList<String>(); - aliases.add("list:add_element_at"); - aliases.add("list:addelementat"); - aliases.add("list:addElementAt"); - aliases.add("list:add_at"); - aliases.add("list:addat"); - aliases.add("list:addAt"); + aliases.add("done"); return aliases; } @@ -35,6 +33,17 @@ public class Done extends GenericInstruction ) throws Throwable { + if (call_parameters.size() != 0) + { + // TODO: Error. + System.err.println("Wrong number of params at " + origin.toString()); + + return null; + } + + return new Done(origin); + } + /***************************************************************************/ /**** MEMBERS **************************************************************/ /***************************************************************************/ @@ -48,14 +57,6 @@ public class Done extends GenericInstruction super(origin); } - /**** Accessors ************************************************************/ - @Override - public void get_visited_by (final InstructionVisitor iv) - throws Throwable - { - iv.visit_done(this); - } - /**** Misc. ****************************************************************/ @Override public String toString () diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/End.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/End.java index 762f0ba..b504486 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/End.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/End.java @@ -8,6 +8,9 @@ import tonkadur.parser.Origin; import tonkadur.fate.v1.lang.meta.InstructionVisitor; import tonkadur.fate.v1.lang.meta.Instruction; +import tonkadur.fate.v1.lang.meta.Computation; + +import tonkadur.fate.v1.lang.instruction.GenericInstruction; public class End extends GenericInstruction { @@ -17,12 +20,7 @@ public class End extends GenericInstruction aliases = new ArrayList<String>(); - aliases.add("list:add_element_at"); - aliases.add("list:addelementat"); - aliases.add("list:addElementAt"); - aliases.add("list:add_at"); - aliases.add("list:addat"); - aliases.add("list:addAt"); + aliases.add("end"); return aliases; } @@ -35,6 +33,16 @@ public class End extends GenericInstruction ) throws Throwable { + if (call_parameters.size() != 0) + { + // TODO: Error. + System.err.println("Wrong number of params at " + origin.toString()); + + return null; + } + + return new End(origin); + } /***************************************************************************/ /**** MEMBERS **************************************************************/ /***************************************************************************/ @@ -48,14 +56,6 @@ public class End extends GenericInstruction super(origin); } - /**** Accessors ************************************************************/ - @Override - public void get_visited_by (final InstructionVisitor iv) - throws Throwable - { - iv.visit_end(this); - } - /**** Misc. ****************************************************************/ @Override public String toString () diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Filter.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Filter.java index a86be76..1ad42f4 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Filter.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Filter.java @@ -20,6 +20,8 @@ import tonkadur.fate.v1.lang.meta.Instruction; import tonkadur.fate.v1.lang.meta.InstructionVisitor; import tonkadur.fate.v1.lang.meta.RecurrentChecks; +import tonkadur.fate.v1.lang.instruction.GenericInstruction; + public class Filter extends GenericInstruction { public static Collection<String> get_aliases () 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 799c47d..26e7175 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 @@ -15,6 +15,7 @@ import tonkadur.fate.v1.lang.type.Type; import tonkadur.fate.v1.lang.type.PointerType; import tonkadur.fate.v1.lang.meta.Computation; +import tonkadur.fate.v1.lang.meta.Instruction; import tonkadur.fate.v1.lang.instruction.GenericInstruction; @@ -25,6 +26,7 @@ public class Free extends GenericInstruction final List<String> aliases; aliases = new ArrayList<String>(); + aliases.add("free"); aliases.add("delete"); aliases.add("destroy"); diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/IndexedFilter.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/IndexedFilter.java index 7477df1..94ad938 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/IndexedFilter.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/IndexedFilter.java @@ -21,6 +21,8 @@ import tonkadur.fate.v1.lang.meta.InstructionVisitor; import tonkadur.fate.v1.lang.meta.Computation; import tonkadur.fate.v1.lang.meta.RecurrentChecks; +import tonkadur.fate.v1.lang.instruction.GenericInstruction; + public class IndexedFilter extends GenericInstruction { public static Collection<String> get_aliases () @@ -29,12 +31,14 @@ public class IndexedFilter extends GenericInstruction aliases = new ArrayList<String>(); - aliases.add("list:add_element_at"); - aliases.add("list:addelementat"); - aliases.add("list:addElementAt"); - aliases.add("list:add_at"); - aliases.add("list:addat"); - aliases.add("list:addAt"); + aliases.add("list:indexed_filter"); + aliases.add("list:indexedfilter"); + aliases.add("list:indexedFilter"); + aliases.add("list:ifilter"); + aliases.add("set:indexed_filter"); + aliases.add("set:indexedfilter"); + aliases.add("set:indexedFilter"); + aliases.add("set:ifilter"); return aliases; } @@ -47,6 +51,43 @@ public class IndexedFilter extends GenericInstruction ) throws Throwable { + final Computation lambda_function = null; + final Computation collection = null; + final List<Computation> extra_params = null; + final List<Type> target_signature; + + target_signature = new ArrayList<Type>(); + + RecurrentChecks.assert_is_a_collection(collection); + + target_signature.add(Type.INT); + target_signature.add + ( + ((CollectionType) collection.get_type()).get_content_type() + ); + + for (final Computation c: extra_params) + { + target_signature.add(c.get_type()); + } + + RecurrentChecks.assert_lambda_matches_types + ( + lambda_function, + Type.BOOL, + target_signature + ); + + return + new IndexedFilter + ( + origin, + lambda_function, + collection, + extra_params + ); + } + /***************************************************************************/ /**** MEMBERS **************************************************************/ /***************************************************************************/ @@ -76,51 +117,7 @@ public class IndexedFilter extends GenericInstruction /***************************************************************************/ /**** PUBLIC ***************************************************************/ /***************************************************************************/ - /**** Constructors *********************************************************/ - public static IndexedFilter build - ( - final Origin origin, - final Computation lambda_function, - final Computation collection, - final List<Computation> extra_params - ) - throws ParsingError - { - final List<Type> target_signature; - - target_signature = new ArrayList<Type>(); - - RecurrentChecks.assert_is_a_collection(collection); - - target_signature.add(Type.INT); - target_signature.add - ( - ((CollectionType) collection.get_type()).get_content_type() - ); - - for (final Computation c: extra_params) - { - target_signature.add(c.get_type()); - } - - RecurrentChecks.assert_lambda_matches_types - ( - lambda_function, - Type.BOOL, - target_signature - ); - - return new IndexedFilter(origin, lambda_function, collection, extra_params); - } - /**** Accessors ************************************************************/ - @Override - public void get_visited_by (final InstructionVisitor iv) - throws Throwable - { - iv.visit_indexed_filter(this); - } - public Computation get_lambda_function () { return lambda_function; diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/IndexedMap.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/IndexedMap.java index bbb0188..acb2d98 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/IndexedMap.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/IndexedMap.java @@ -19,6 +19,8 @@ import tonkadur.fate.v1.lang.meta.InstructionVisitor; import tonkadur.fate.v1.lang.meta.Computation; import tonkadur.fate.v1.lang.meta.RecurrentChecks; +import tonkadur.fate.v1.lang.instruction.GenericInstruction; + public class IndexedMap extends GenericInstruction { public static Collection<String> get_aliases () @@ -27,12 +29,15 @@ public class IndexedMap extends GenericInstruction aliases = new ArrayList<String>(); - aliases.add("list:add_element_at"); - aliases.add("list:addelementat"); - aliases.add("list:addElementAt"); - aliases.add("list:add_at"); - aliases.add("list:addat"); - aliases.add("list:addAt"); + aliases.add("list:indexed_map"); + aliases.add("list:indexedmap"); + aliases.add("list:indexedMap"); + aliases.add("list:imap"); + aliases.add("set:indexed_map"); + aliases.add("set:indexedmap"); + aliases.add("set:indexedMap"); + aliases.add("set:imap"); + return aliases; } @@ -45,45 +50,10 @@ public class IndexedMap extends GenericInstruction ) throws Throwable { - /***************************************************************************/ - /**** MEMBERS **************************************************************/ - /***************************************************************************/ - protected final List<Computation> extra_params; - protected final Computation lambda_function; - protected final Computation collection; + final Computation lambda_function = null; + final Computation collection = null; + final List<Computation> extra_params = null; - /***************************************************************************/ - /**** PROTECTED ************************************************************/ - /***************************************************************************/ - /**** Constructors *********************************************************/ - protected IndexedMap - ( - final Origin origin, - final Computation lambda_function, - final Computation collection, - final List<Computation> extra_params - ) - { - super(origin); - - this.lambda_function = lambda_function; - this.collection = collection; - this.extra_params = extra_params; - } - - /***************************************************************************/ - /**** PUBLIC ***************************************************************/ - /***************************************************************************/ - /**** Constructors *********************************************************/ - public static IndexedMap build - ( - final Origin origin, - final Computation lambda_function, - final Computation collection, - final List<Computation> extra_params - ) - throws Throwable - { final List<Type> in_types; in_types = new ArrayList<Type>(); @@ -111,14 +81,36 @@ public class IndexedMap extends GenericInstruction return new IndexedMap(origin, lambda_function, collection, extra_params); } - /**** Accessors ************************************************************/ - @Override - public void get_visited_by (final InstructionVisitor iv) - throws Throwable + /***************************************************************************/ + /**** MEMBERS **************************************************************/ + /***************************************************************************/ + protected final List<Computation> extra_params; + protected final Computation lambda_function; + protected final Computation collection; + + /***************************************************************************/ + /**** PROTECTED ************************************************************/ + /***************************************************************************/ + /**** Constructors *********************************************************/ + protected IndexedMap + ( + final Origin origin, + final Computation lambda_function, + final Computation collection, + final List<Computation> extra_params + ) { - iv.visit_indexed_map(this); + super(origin); + + this.lambda_function = lambda_function; + this.collection = collection; + this.extra_params = extra_params; } + /***************************************************************************/ + /**** PUBLIC ***************************************************************/ + /***************************************************************************/ + /**** Accessors ************************************************************/ public Computation get_lambda_function () { return lambda_function; diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/IndexedMerge.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/IndexedMerge.java index f2bab19..d2616c6 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/IndexedMerge.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/IndexedMerge.java @@ -19,6 +19,8 @@ import tonkadur.fate.v1.lang.meta.InstructionVisitor; import tonkadur.fate.v1.lang.meta.Computation; import tonkadur.fate.v1.lang.meta.RecurrentChecks; +import tonkadur.fate.v1.lang.instruction.GenericInstruction; + public class IndexedMerge extends GenericInstruction { public static Collection<String> get_aliases () @@ -27,12 +29,14 @@ public class IndexedMerge extends GenericInstruction aliases = new ArrayList<String>(); - aliases.add("list:add_element_at"); - aliases.add("list:addelementat"); - aliases.add("list:addElementAt"); - aliases.add("list:add_at"); - aliases.add("list:addat"); - aliases.add("list:addAt"); + aliases.add("list:indexed_merge"); + aliases.add("list:indexedmerge"); + aliases.add("list:indexedMerge"); + aliases.add("list:imerge"); + aliases.add("set:indexed_merge"); + aliases.add("set:indexedmerge"); + aliases.add("set:indexedMerge"); + aliases.add("set:imerge"); return aliases; } @@ -45,57 +49,14 @@ public class IndexedMerge extends GenericInstruction ) throws Throwable { - /***************************************************************************/ - /**** MEMBERS **************************************************************/ - /***************************************************************************/ - protected final List<Computation> extra_params; - protected final Computation lambda_function; - protected final Computation collection; - protected final Computation default_a; - protected final Computation collection_in_b; - protected final Computation default_b; + // TODO: implement + final Computation lambda_function = null; + final Computation collection_in_b = null; + final Computation default_b = null; + final Computation collection = null; + final Computation default_a = null; + final List<Computation> extra_params = null; - /***************************************************************************/ - /**** PROTECTED ************************************************************/ - /***************************************************************************/ - /**** Constructors *********************************************************/ - protected IndexedMerge - ( - final Origin origin, - final Computation lambda_function, - final Computation collection_in_b, - final Computation default_b, - final Computation collection, - final Computation default_a, - final List<Computation> extra_params - ) - { - super(origin); - - this.lambda_function = lambda_function; - this.collection = collection; - this.default_a = default_a; - this.collection_in_b = collection_in_b; - this.default_b = default_b; - this.extra_params = extra_params; - } - - /***************************************************************************/ - /**** PUBLIC ***************************************************************/ - /***************************************************************************/ - /**** Constructors *********************************************************/ - public static IndexedMerge build - ( - final Origin origin, - final Computation lambda_function, - final Computation collection_in_b, - final Computation default_b, - final Computation collection, - final Computation default_a, - final List<Computation> extra_params - ) - throws Throwable - { final List<Type> types_in; types_in = new ArrayList<Type>(); @@ -106,7 +67,7 @@ public class IndexedMerge extends GenericInstruction } else { - RecurrentChecks.assert_is_a_collection_of(collection, default_a); + //RecurrentChecks.assert_is_a_collection_of(collection, default_a); } if (default_b == null) @@ -115,7 +76,7 @@ public class IndexedMerge extends GenericInstruction } else { - RecurrentChecks.assert_is_a_collection_of(collection_in_b, default_b); + //RecurrentChecks.assert_is_a_collection_of(collection_in_b, default_b); } types_in.add(Type.INT); @@ -159,14 +120,45 @@ public class IndexedMerge extends GenericInstruction ); } - /**** Accessors ************************************************************/ - @Override - public void get_visited_by (final InstructionVisitor iv) - throws Throwable + /***************************************************************************/ + /**** MEMBERS **************************************************************/ + /***************************************************************************/ + protected final List<Computation> extra_params; + protected final Computation lambda_function; + protected final Computation collection; + protected final Computation default_a; + protected final Computation collection_in_b; + protected final Computation default_b; + + /***************************************************************************/ + /**** PROTECTED ************************************************************/ + /***************************************************************************/ + /**** Constructors *********************************************************/ + protected IndexedMerge + ( + final Origin origin, + final Computation lambda_function, + final Computation collection_in_b, + final Computation default_b, + final Computation collection, + final Computation default_a, + final List<Computation> extra_params + ) { - iv.visit_indexed_merge(this); + super(origin); + + this.lambda_function = lambda_function; + this.collection = collection; + this.default_a = default_a; + this.collection_in_b = collection_in_b; + this.default_b = default_b; + this.extra_params = extra_params; } + /***************************************************************************/ + /**** PUBLIC ***************************************************************/ + /***************************************************************************/ + /**** Accessors ************************************************************/ public Computation get_lambda_function () { return lambda_function; diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/IndexedPartition.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/IndexedPartition.java index aa049ca..4efc697 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/IndexedPartition.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/IndexedPartition.java @@ -20,6 +20,8 @@ import tonkadur.fate.v1.lang.meta.InstructionVisitor; import tonkadur.fate.v1.lang.meta.Computation; import tonkadur.fate.v1.lang.meta.RecurrentChecks; +import tonkadur.fate.v1.lang.instruction.GenericInstruction; + public class IndexedPartition extends GenericInstruction { public static Collection<String> get_aliases () @@ -28,12 +30,14 @@ public class IndexedPartition extends GenericInstruction aliases = new ArrayList<String>(); - aliases.add("list:add_element_at"); - aliases.add("list:addelementat"); - aliases.add("list:addElementAt"); - aliases.add("list:add_at"); - aliases.add("list:addat"); - aliases.add("list:addAt"); + aliases.add("list:indexed_partition"); + aliases.add("list:indexedpartition"); + aliases.add("list:indexedPartition"); + aliases.add("list:ipartition"); + aliases.add("set:indexed_partition"); + aliases.add("set:indexedpartition"); + aliases.add("set:indexedPartition"); + aliases.add("set:ipartition"); return aliases; } @@ -46,49 +50,12 @@ public class IndexedPartition extends GenericInstruction ) throws Throwable { - /***************************************************************************/ - /**** MEMBERS **************************************************************/ - /***************************************************************************/ - protected final List<Computation> extra_params; - protected final Computation lambda_function; - protected final Computation collection_in; - protected final Computation collection_out; + // TODO: implement + final Computation lambda_function = null; + final Computation collection_in = null; + final Computation collection_out = null; + final List<Computation> extra_params = null; - /***************************************************************************/ - /**** PROTECTED ************************************************************/ - /***************************************************************************/ - /**** Constructors *********************************************************/ - protected IndexedPartition - ( - final Origin origin, - final Computation lambda_function, - final Computation collection_in, - final Computation collection_out, - final List<Computation> extra_params - ) - { - super(origin); - - this.lambda_function = lambda_function; - this.collection_in = collection_in; - this.collection_out = collection_out; - this.extra_params = extra_params; - } - - /***************************************************************************/ - /**** PUBLIC ***************************************************************/ - /***************************************************************************/ - /**** Constructors *********************************************************/ - public static IndexedPartition build - ( - final Origin origin, - final Computation lambda_function, - final Computation collection_in, - final Computation collection_out, - final List<Computation> extra_params - ) - throws ParsingError - { final List<Type> target_signature; target_signature = new ArrayList<Type>(); @@ -130,14 +97,39 @@ public class IndexedPartition extends GenericInstruction ); } - /**** Accessors ************************************************************/ - @Override - public void get_visited_by (final InstructionVisitor iv) - throws Throwable + /***************************************************************************/ + /**** MEMBERS **************************************************************/ + /***************************************************************************/ + protected final List<Computation> extra_params; + protected final Computation lambda_function; + protected final Computation collection_in; + protected final Computation collection_out; + + /***************************************************************************/ + /**** PROTECTED ************************************************************/ + /***************************************************************************/ + /**** Constructors *********************************************************/ + protected IndexedPartition + ( + final Origin origin, + final Computation lambda_function, + final Computation collection_in, + final Computation collection_out, + final List<Computation> extra_params + ) { - iv.visit_indexed_partition(this); + super(origin); + + this.lambda_function = lambda_function; + this.collection_in = collection_in; + this.collection_out = collection_out; + this.extra_params = extra_params; } + /***************************************************************************/ + /**** PUBLIC ***************************************************************/ + /***************************************************************************/ + /**** Accessors ************************************************************/ public Computation get_lambda_function () { return lambda_function; diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Map.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Map.java index 067b161..8fcfade 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Map.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Map.java @@ -20,6 +20,8 @@ import tonkadur.fate.v1.lang.meta.InstructionVisitor; import tonkadur.fate.v1.lang.meta.Computation; import tonkadur.fate.v1.lang.meta.RecurrentChecks; +import tonkadur.fate.v1.lang.instruction.GenericInstruction; + public class Map extends GenericInstruction { public static Collection<String> get_aliases () @@ -28,12 +30,8 @@ public class Map extends GenericInstruction aliases = new ArrayList<String>(); - aliases.add("list:add_element_at"); - aliases.add("list:addelementat"); - aliases.add("list:addElementAt"); - aliases.add("list:add_at"); - aliases.add("list:addat"); - aliases.add("list:addAt"); + aliases.add("list:map"); + aliases.add("set:map"); return aliases; } @@ -46,6 +44,35 @@ public class Map extends GenericInstruction ) throws Throwable { + final Computation lambda_function = null; + final Computation collection = null; + final List<Computation> extra_params = null; + final List<Type> target_signature; + + target_signature = new ArrayList<Type>(); + + RecurrentChecks.assert_is_a_collection(collection); + + target_signature.add + ( + ((CollectionType) collection.get_type()).get_content_type() + ); + + for (final Computation c: extra_params) + { + target_signature.add(c.get_type()); + } + + RecurrentChecks.assert_lambda_matches_types + ( + lambda_function, + ((CollectionType) collection.get_type()).get_content_type(), + target_signature + ); + + return new Map(origin, lambda_function, collection, extra_params); + } + /***************************************************************************/ /**** MEMBERS **************************************************************/ /***************************************************************************/ @@ -75,50 +102,7 @@ public class Map extends GenericInstruction /***************************************************************************/ /**** PUBLIC ***************************************************************/ /***************************************************************************/ - /**** Constructors *********************************************************/ - public static Map build - ( - final Origin origin, - final Computation lambda_function, - final Computation collection, - final List<Computation> extra_params - ) - throws ParsingError - { - final List<Type> target_signature; - - target_signature = new ArrayList<Type>(); - - RecurrentChecks.assert_is_a_collection(collection); - - target_signature.add - ( - ((CollectionType) collection.get_type()).get_content_type() - ); - - for (final Computation c: extra_params) - { - target_signature.add(c.get_type()); - } - - RecurrentChecks.assert_lambda_matches_types - ( - lambda_function, - ((CollectionType) collection.get_type()).get_content_type(), - target_signature - ); - - return new Map(origin, lambda_function, collection, extra_params); - } - /**** Accessors ************************************************************/ - @Override - public void get_visited_by (final InstructionVisitor iv) - throws Throwable - { - iv.visit_map(this); - } - public Computation get_lambda_function () { return lambda_function; diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Merge.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Merge.java index ddfe4b7..6461848 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Merge.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Merge.java @@ -19,6 +19,8 @@ import tonkadur.fate.v1.lang.meta.InstructionVisitor; import tonkadur.fate.v1.lang.meta.Computation; import tonkadur.fate.v1.lang.meta.RecurrentChecks; +import tonkadur.fate.v1.lang.instruction.GenericInstruction; + public class Merge extends GenericInstruction { public static Collection<String> get_aliases () @@ -27,12 +29,14 @@ public class Merge extends GenericInstruction aliases = new ArrayList<String>(); - aliases.add("list:add_element_at"); - aliases.add("list:addelementat"); - aliases.add("list:addElementAt"); - aliases.add("list:add_at"); - aliases.add("list:addat"); - aliases.add("list:addAt"); + aliases.add("list:merge"); + aliases.add("list:safe_merge"); + aliases.add("list:safemerge"); + aliases.add("list:safeMerge"); + aliases.add("set:merge"); + aliases.add("set:safe_merge"); + aliases.add("set:safemerge"); + aliases.add("set:safeMerge"); return aliases; } @@ -40,62 +44,19 @@ public class Merge extends GenericInstruction public static Instruction build ( final Origin origin, - final String _alias, + final String alias, final List<Computation> call_parameters ) throws Throwable { - /***************************************************************************/ - /**** MEMBERS **************************************************************/ - /***************************************************************************/ - protected final List<Computation> extra_params; - protected final Computation lambda_function; - protected final Computation collection; - protected final Computation default_a; - protected final Computation collection_in_b; - protected final Computation default_b; + // TODO: implement + final Computation lambda_function = null; + final Computation collection_in_b = null; + final Computation default_b = null; + final Computation collection = null; + final Computation default_a = null; + final List<Computation> extra_params = null; - /***************************************************************************/ - /**** PROTECTED ************************************************************/ - /***************************************************************************/ - /**** Constructors *********************************************************/ - protected Merge - ( - final Origin origin, - final Computation lambda_function, - final Computation collection_in_b, - final Computation default_b, - final Computation collection, - final Computation default_a, - final List<Computation> extra_params - ) - { - super(origin); - - this.lambda_function = lambda_function; - this.collection = collection; - this.default_a = default_a; - this.collection_in_b = collection_in_b; - this.default_b = default_b; - this.extra_params = extra_params; - } - - /***************************************************************************/ - /**** PUBLIC ***************************************************************/ - /***************************************************************************/ - /**** Constructors *********************************************************/ - public static Merge build - ( - final Origin origin, - final Computation lambda_function, - final Computation collection_in_b, - final Computation default_b, - final Computation collection, - final Computation default_a, - final List<Computation> extra_params - ) - throws Throwable - { final List<Type> types_in; types_in = new ArrayList<Type>(); @@ -106,7 +67,7 @@ public class Merge extends GenericInstruction } else { - RecurrentChecks.assert_is_a_collection_of(collection, default_a); + //RecurrentChecks.assert_is_a_collection_of(collection, default_a); } if (default_b == null) @@ -115,7 +76,7 @@ public class Merge extends GenericInstruction } else { - RecurrentChecks.assert_is_a_collection_of(collection_in_b, default_b); + //RecurrentChecks.assert_is_a_collection_of(collection_in_b, default_b); } types_in.add @@ -153,14 +114,45 @@ public class Merge extends GenericInstruction ); } - /**** Accessors ************************************************************/ - @Override - public void get_visited_by (final InstructionVisitor iv) - throws Throwable + /***************************************************************************/ + /**** MEMBERS **************************************************************/ + /***************************************************************************/ + protected final List<Computation> extra_params; + protected final Computation lambda_function; + protected final Computation collection; + protected final Computation default_a; + protected final Computation collection_in_b; + protected final Computation default_b; + + /***************************************************************************/ + /**** PROTECTED ************************************************************/ + /***************************************************************************/ + /**** Constructors *********************************************************/ + protected Merge + ( + final Origin origin, + final Computation lambda_function, + final Computation collection_in_b, + final Computation default_b, + final Computation collection, + final Computation default_a, + final List<Computation> extra_params + ) { - iv.visit_merge(this); + super(origin); + + this.lambda_function = lambda_function; + this.collection = collection; + this.default_a = default_a; + this.collection_in_b = collection_in_b; + this.default_b = default_b; + this.extra_params = extra_params; } + /***************************************************************************/ + /**** PUBLIC ***************************************************************/ + /***************************************************************************/ + /**** Accessors ************************************************************/ public Computation get_lambda_function () { return lambda_function; diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Partition.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Partition.java index be4b733..820c8af 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Partition.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Partition.java @@ -20,6 +20,8 @@ import tonkadur.fate.v1.lang.meta.InstructionVisitor; import tonkadur.fate.v1.lang.meta.Computation; import tonkadur.fate.v1.lang.meta.RecurrentChecks; +import tonkadur.fate.v1.lang.instruction.GenericInstruction; + public class Partition extends GenericInstruction { public static Collection<String> get_aliases () @@ -28,12 +30,8 @@ public class Partition extends GenericInstruction aliases = new ArrayList<String>(); - aliases.add("list:add_element_at"); - aliases.add("list:addelementat"); - aliases.add("list:addElementAt"); - aliases.add("list:add_at"); - aliases.add("list:addat"); - aliases.add("list:addAt"); + aliases.add("list:partition"); + aliases.add("set:partition"); return aliases; } @@ -41,54 +39,15 @@ public class Partition extends GenericInstruction public static Instruction build ( final Origin origin, - final String _alias, + final String alias, final List<Computation> call_parameters ) throws Throwable { - /***************************************************************************/ - /**** MEMBERS **************************************************************/ - /***************************************************************************/ - protected final List<Computation> extra_params; - protected final Computation lambda_function; - protected final Computation collection_in; - protected final Computation collection_out; - - /***************************************************************************/ - /**** PROTECTED ************************************************************/ - /***************************************************************************/ - /**** Constructors *********************************************************/ - protected Partition - ( - final Origin origin, - final Computation lambda_function, - final Computation collection_in, - final Computation collection_out, - final List<Computation> extra_params - ) - { - super(origin); - - this.lambda_function = lambda_function; - this.collection_in = collection_in; - this.collection_out = collection_out; - this.extra_params = extra_params; - } - - /***************************************************************************/ - /**** PUBLIC ***************************************************************/ - /***************************************************************************/ - /**** Constructors *********************************************************/ - public static Partition build - ( - final Origin origin, - final Computation lambda_function, - final Computation collection_in, - final Computation collection_out, - final List<Computation> extra_params - ) - throws ParsingError - { + final Computation lambda_function = null; + final Computation collection_in = null; + final Computation collection_out = null; + final List<Computation> extra_params = null; final List<Type> target_signature; target_signature = new ArrayList<Type>(); @@ -129,14 +88,39 @@ public class Partition extends GenericInstruction ); } - /**** Accessors ************************************************************/ - @Override - public void get_visited_by (final InstructionVisitor iv) - throws Throwable + /***************************************************************************/ + /**** MEMBERS **************************************************************/ + /***************************************************************************/ + protected final List<Computation> extra_params; + protected final Computation lambda_function; + protected final Computation collection_in; + protected final Computation collection_out; + + /***************************************************************************/ + /**** PROTECTED ************************************************************/ + /***************************************************************************/ + /**** Constructors *********************************************************/ + protected Partition + ( + final Origin origin, + final Computation lambda_function, + final Computation collection_in, + final Computation collection_out, + final List<Computation> extra_params + ) { - iv.visit_partition(this); + super(origin); + + this.lambda_function = lambda_function; + this.collection_in = collection_in; + this.collection_out = collection_out; + this.extra_params = extra_params; } + /***************************************************************************/ + /**** PUBLIC ***************************************************************/ + /***************************************************************************/ + /**** Accessors ************************************************************/ public Computation get_lambda_function () { return lambda_function; diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/PopElement.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/PopElement.java index 2f16762..c8df7f4 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/PopElement.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/PopElement.java @@ -16,6 +16,8 @@ import tonkadur.fate.v1.lang.meta.Computation; import tonkadur.fate.v1.lang.meta.Computation; import tonkadur.fate.v1.lang.meta.RecurrentChecks; +import tonkadur.fate.v1.lang.instruction.GenericInstruction; + public class PopElement extends GenericInstruction { public static Collection<String> get_aliases () @@ -55,7 +57,7 @@ public class PopElement extends GenericInstruction public static Instruction build ( final Origin origin, - final String _alias, + final String alias, final List<Computation> call_parameters ) throws Throwable @@ -98,7 +100,7 @@ public class PopElement extends GenericInstruction /***************************************************************************/ /**** MEMBERS **************************************************************/ /***************************************************************************/ - protected final Computation storage_ptr; + protected final Computation storage; protected final Computation collection; protected final boolean is_from_left; @@ -109,13 +111,14 @@ public class PopElement extends GenericInstruction protected PopElement ( final Origin origin, + final Computation storage, final Computation collection, final boolean is_from_left ) { super(origin); - this.storage_ptr = storage_ptr; + this.storage = storage; this.collection = collection; this.is_from_left = is_from_left; } diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/PushElement.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/PushElement.java index b4c5a29..612d169 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/PushElement.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/PushElement.java @@ -12,6 +12,8 @@ import tonkadur.fate.v1.lang.meta.Instruction; import tonkadur.fate.v1.lang.meta.Computation; import tonkadur.fate.v1.lang.meta.RecurrentChecks; +import tonkadur.fate.v1.lang.instruction.GenericInstruction; + public class PushElement extends GenericInstruction { public static Collection<String> get_aliases () diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveAllOfElement.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveAllOfElement.java index 79d5bc1..e397097 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveAllOfElement.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveAllOfElement.java @@ -12,6 +12,8 @@ import tonkadur.fate.v1.lang.meta.Instruction; import tonkadur.fate.v1.lang.meta.Computation; import tonkadur.fate.v1.lang.meta.RecurrentChecks; +import tonkadur.fate.v1.lang.instruction.GenericInstruction; + public class RemoveAllOfElement extends GenericInstruction { public static Collection<String> get_aliases () diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveElement.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveElement.java index 667b489..f61a4d9 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveElement.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveElement.java @@ -12,6 +12,8 @@ import tonkadur.fate.v1.lang.meta.Instruction; import tonkadur.fate.v1.lang.meta.Computation; import tonkadur.fate.v1.lang.meta.RecurrentChecks; +import tonkadur.fate.v1.lang.instruction.GenericInstruction; + public class RemoveElement extends GenericInstruction { public static Collection<String> get_aliases () diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveElementAt.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveElementAt.java index a7e83e1..7d6d1ee 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveElementAt.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveElementAt.java @@ -14,6 +14,8 @@ import tonkadur.fate.v1.lang.meta.Instruction; import tonkadur.fate.v1.lang.meta.Computation; import tonkadur.fate.v1.lang.meta.RecurrentChecks; +import tonkadur.fate.v1.lang.instruction.GenericInstruction; + public class RemoveElementAt extends GenericInstruction { public static Collection<String> get_aliases () diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveElementsOf.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveElementsOf.java index e37601d..ebee46d 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveElementsOf.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveElementsOf.java @@ -14,6 +14,8 @@ import tonkadur.fate.v1.lang.meta.Instruction; import tonkadur.fate.v1.lang.meta.Computation; import tonkadur.fate.v1.lang.meta.RecurrentChecks; +import tonkadur.fate.v1.lang.instruction.GenericInstruction; + public class RemoveElementsOf extends GenericInstruction { public static Collection<String> get_aliases () diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/ReverseList.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/ReverseList.java index 3281c5e..f57075b 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/ReverseList.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/ReverseList.java @@ -12,6 +12,8 @@ import tonkadur.fate.v1.lang.meta.Instruction; import tonkadur.fate.v1.lang.meta.Computation; import tonkadur.fate.v1.lang.meta.RecurrentChecks; +import tonkadur.fate.v1.lang.instruction.GenericInstruction; + public class ReverseList extends GenericInstruction { public static Collection<String> get_aliases () diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/SequenceVariableCall.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/SequenceVariableCall.java index f09dcdd..285ed81 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/SequenceVariableCall.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/SequenceVariableCall.java @@ -20,6 +20,8 @@ import tonkadur.fate.v1.lang.meta.InstructionVisitor; import tonkadur.fate.v1.lang.meta.Instruction; import tonkadur.fate.v1.lang.meta.RecurrentChecks; +import tonkadur.fate.v1.lang.instruction.GenericInstruction; + public class SequenceVariableCall extends GenericInstruction { public static Collection<String> get_aliases () diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/SequenceVariableJump.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/SequenceVariableJump.java index 87365c4..ee09bef 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/SequenceVariableJump.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/SequenceVariableJump.java @@ -20,6 +20,8 @@ import tonkadur.fate.v1.lang.meta.InstructionVisitor; import tonkadur.fate.v1.lang.meta.Instruction; import tonkadur.fate.v1.lang.meta.RecurrentChecks; +import tonkadur.fate.v1.lang.instruction.GenericInstruction; + public class SequenceVariableJump extends GenericInstruction { public static Collection<String> get_aliases () diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/SetValue.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/SetValue.java index 324694d..2102743 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/SetValue.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/SetValue.java @@ -12,6 +12,8 @@ import tonkadur.fate.v1.lang.meta.Instruction; import tonkadur.fate.v1.lang.meta.Computation; import tonkadur.fate.v1.lang.meta.RecurrentChecks; +import tonkadur.fate.v1.lang.instruction.GenericInstruction; + public class SetValue extends GenericInstruction { public static Collection<String> get_aliases () @@ -34,7 +36,7 @@ public class SetValue extends GenericInstruction public static Instruction build ( final Origin origin, - final String alias, + final String _alias, final List<Computation> call_parameters ) throws Throwable @@ -42,9 +44,24 @@ public class SetValue extends GenericInstruction final Computation reference; final Computation value; + if (call_parameters.size() != 2) + { + // TODO: Error. + System.err.print + ( + "[E] Wrong number of arguments at " + + origin.toString() + ); + + return null; + } + + reference = call_parameters.get(0); + value = call_parameters.get(1); + reference.expect_non_string(); - RecurrentChecks.propagate_expected_type + RecurrentChecks.handle_expected_type_propagation ( value, reference.get_type() diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Shuffle.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Shuffle.java index ca9e5d7..587826f 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Shuffle.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Shuffle.java @@ -12,6 +12,8 @@ import tonkadur.fate.v1.lang.meta.Instruction; import tonkadur.fate.v1.lang.meta.Computation; import tonkadur.fate.v1.lang.meta.RecurrentChecks; +import tonkadur.fate.v1.lang.instruction.GenericInstruction; + public class Shuffle extends GenericInstruction { public static Collection<String> get_aliases () diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Sort.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Sort.java index df3cc1e..5723518 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Sort.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Sort.java @@ -18,6 +18,8 @@ import tonkadur.fate.v1.lang.meta.Instruction; import tonkadur.fate.v1.lang.meta.InstructionVisitor; import tonkadur.fate.v1.lang.meta.RecurrentChecks; +import tonkadur.fate.v1.lang.instruction.GenericInstruction; + public class Sort extends GenericInstruction { public static Collection<String> get_aliases () @@ -42,7 +44,7 @@ public class Sort extends GenericInstruction // TODO: implement final Computation lambda_function = null; final Computation collection = null; - final List<Computation> extra_params = nulls; + final List<Computation> extra_params = null; final List<Type> types_in; types_in = new ArrayList<Type>(); diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/SubList.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/SubList.java index 933d44d..69c498f 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/SubList.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/SubList.java @@ -14,6 +14,8 @@ import tonkadur.fate.v1.lang.meta.Instruction; import tonkadur.fate.v1.lang.meta.InstructionVisitor; import tonkadur.fate.v1.lang.meta.RecurrentChecks; +import tonkadur.fate.v1.lang.instruction.GenericInstruction; + public class SubList extends GenericInstruction { public static Collection<String> get_aliases () diff --git a/src/core/src/tonkadur/fate/v1/lang/meta/Computation.java b/src/core/src/tonkadur/fate/v1/lang/meta/Computation.java index 851df56..17b3ec3 100644 --- a/src/core/src/tonkadur/fate/v1/lang/meta/Computation.java +++ b/src/core/src/tonkadur/fate/v1/lang/meta/Computation.java @@ -55,7 +55,7 @@ public abstract class Computation extends Node System.err.println ( "[W] Computation at " - + origin.toString + + origin.toString() + " is being used as a reference, but isn't one. The instruction will" + " not be able to modify the memory you thought was targeted by this" + " computation." diff --git a/src/core/src/tonkadur/fate/v1/lang/meta/InstructionVisitor.java b/src/core/src/tonkadur/fate/v1/lang/meta/InstructionVisitor.java index 8b43486..521e850 100644 --- a/src/core/src/tonkadur/fate/v1/lang/meta/InstructionVisitor.java +++ b/src/core/src/tonkadur/fate/v1/lang/meta/InstructionVisitor.java @@ -8,15 +8,6 @@ public interface InstructionVisitor public void visit_assert (final Assert n) throws Throwable; - public void visit_break (final Break n) - throws Throwable; - - public void visit_end (final End n) - throws Throwable; - - public void visit_done (final Done n) - throws Throwable; - public void visit_while (final While n) throws Throwable; @@ -68,18 +59,9 @@ public interface InstructionVisitor public void visit_sequence_jump (final SequenceJump n) throws Throwable; - public void visit_sequence_variable_call (final SequenceVariableCall n) - throws Throwable; - - public void visit_sequence_variable_jump (final SequenceVariableJump n) - throws Throwable; - public void visit_local_variable (final LocalVariable n) throws Throwable; - public void visit_set_value (final SetValue n) - throws Throwable; - public void visit_set_fields (final SetFields n) throws Throwable; 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 becbe0d..049e343 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 @@ -109,235 +109,6 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor compiler.registers().bind(n.get_variable().get_name(), r); } -/* - @Override - public void visit_remove_elements_of - ( - final tonkadur.fate.v1.lang.instruction.RemoveElementsOf n - ) - throws Throwable - { - final ComputationCompiler collection_in_cc, collection_cc; - - collection_cc = new ComputationCompiler(compiler); - - n.get_target_collection().get_visited_by(collection_cc); - - if (collection_cc.has_init()) - { - result.add(collection_cc.get_init()); - } - - collection_in_cc = new ComputationCompiler(compiler); - - n.get_source_collection().get_visited_by(collection_in_cc); - - if (collection_in_cc.has_init()) - { - result.add(collection_in_cc.get_init()); - } - - result.add - ( - RemoveElementsOf.generate - ( - compiler.registers(), - compiler.assembler(), - collection_in_cc.get_address(), - collection_cc.get_address(), - ( - (tonkadur.fate.v1.lang.type.CollectionType) - n.get_target_collection().get_type() - ).is_set() - ) - ); - - collection_cc.release_registers(result); - collection_in_cc.release_registers(result); - } -*/ -/* - @Override - public void visit_add_elements_of - ( - final tonkadur.fate.v1.lang.instruction.AddElementsOf n - ) - throws Throwable - { - final ComputationCompiler collection_in_cc, collection_cc; - - collection_cc = new ComputationCompiler(compiler); - - n.get_target_collection().get_visited_by(collection_cc); - - if (collection_cc.has_init()) - { - result.add(collection_cc.get_init()); - } - - collection_in_cc = new ComputationCompiler(compiler); - - n.get_source_collection().get_visited_by(collection_in_cc); - - if (collection_in_cc.has_init()) - { - result.add(collection_in_cc.get_init()); - } - - result.add - ( - AddElementsOf.generate - ( - compiler.registers(), - compiler.assembler(), - collection_in_cc.get_address(), - collection_cc.get_address(), - ( - (tonkadur.fate.v1.lang.type.CollectionType) - n.get_target_collection().get_type() - ).is_set() - ) - ); - - collection_cc.release_registers(result); - collection_in_cc.release_registers(result); - } -*/ -/* - @Override - public void visit_add_element_at - ( - final tonkadur.fate.v1.lang.instruction.AddElementAt n - ) - throws Throwable - { - final Address collection_as_address; - final ComputationCompiler index_compiler, element_compiler; - final ComputationCompiler collection_compiler; - final Register index_holder; - - index_holder = compiler.registers().reserve(Type.INT, result); - - index_compiler = new ComputationCompiler(compiler); - - n.get_index().get_visited_by(index_compiler); - - if (index_compiler.has_init()) - { - result.add(index_compiler.get_init()); - } - - element_compiler = new ComputationCompiler(compiler); - - n.get_element().get_visited_by(element_compiler); - - if (element_compiler.has_init()) - { - result.add(element_compiler.get_init()); - } - - collection_compiler = new ComputationCompiler(compiler); - - n.get_collection().get_visited_by(collection_compiler); - - if (collection_compiler.has_init()) - { - result.add(collection_compiler.get_init()); - } - - result.add - ( - new SetValue - ( - index_holder.get_address(), - new IfElseComputation - ( - Operation.greater_than - ( - index_compiler.get_computation(), - new Size(collection_compiler.get_address()) - ), - new Size(collection_compiler.get_address()), - new IfElseComputation - ( - Operation.less_than - ( - index_compiler.get_computation(), - Constant.ZERO - ), - Constant.ZERO, - index_compiler.get_computation() - ) - ) - ) - ); - - result.add - ( - InsertAt.generate - ( - compiler.registers(), - compiler.assembler(), - index_holder.get_address(), - element_compiler.get_computation(), - new Size(collection_compiler.get_address()), - collection_compiler.get_address() - ) - ); - - compiler.registers().release(index_holder, result); - - index_compiler.release_registers(result); - element_compiler.release_registers(result); - collection_compiler.release_registers(result); - } -*/ -/* - @Override - public void visit_add_element - ( - final tonkadur.fate.v1.lang.instruction.AddElement n - ) - throws Throwable - { - final ComputationCompiler address_compiler, element_compiler; - - address_compiler = new ComputationCompiler(compiler); - element_compiler = new ComputationCompiler(compiler); - - n.get_collection().get_visited_by(address_compiler); - - if (address_compiler.has_init()) - { - result.add(address_compiler.get_init()); - } - - n.get_element().get_visited_by(element_compiler); - - if (element_compiler.has_init()) - { - result.add(element_compiler.get_init()); - } - - result.add - ( - AddElement.generate - ( - compiler.registers(), - compiler.assembler(), - element_compiler.get_computation(), - address_compiler.get_address(), - ( - (tonkadur.fate.v1.lang.type.CollectionType) - n.get_collection().get_type() - ).is_set() - ) - ); - - element_compiler.release_registers(result); - address_compiler.release_registers(result); - } -*/ @Override public void visit_assert (final tonkadur.fate.v1.lang.instruction.Assert a) @@ -504,115 +275,6 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor /* @Override - public void visit_map - ( - final tonkadur.fate.v1.lang.instruction.Map n - ) - throws Throwable - { - final List<Computation> params; - final List<ComputationCompiler> param_cc_list; - // This is one dangerous operation to do in-place, so we don't. - final Register holder; - final ComputationCompiler lambda_cc, collection_cc; - - params = new ArrayList<Computation>(); - param_cc_list = new ArrayList<ComputationCompiler>(); - - for - ( - final tonkadur.fate.v1.lang.meta.Computation p: - n.get_extra_parameters() - ) - { - final ComputationCompiler param_cc; - - param_cc = new ComputationCompiler(compiler); - - p.get_visited_by(param_cc); - - // Let's not re-compute the parameters on every iteration. - param_cc.generate_address(); - - if (param_cc.has_init()) - { - result.add(param_cc.get_init()); - } - - param_cc_list.add(param_cc); - - params.add(param_cc.get_computation()); - } - - lambda_cc = new ComputationCompiler(compiler); - - n.get_lambda_function().get_visited_by(lambda_cc); - - if (lambda_cc.has_init()) - { - result.add(lambda_cc.get_init()); - } - - collection_cc = new ComputationCompiler(compiler); - - n.get_collection().get_visited_by(collection_cc); - - if (collection_cc.has_init()) - { - result.add(collection_cc.get_init()); - } - - holder = - compiler.registers().reserve - ( - collection_cc.get_computation().get_type(), - result - ); - - result.add - ( - new SetValue(holder.get_address(), collection_cc.get_computation()) - ); - - result.add - ( - Clear.generate - ( - compiler.registers(), - compiler.assembler(), - collection_cc.get_address() - ) - ); - - result.add - ( - MapLambda.generate - ( - compiler.registers(), - compiler.assembler(), - lambda_cc.get_computation(), - holder.get_address(), - collection_cc.get_address(), - ( - (tonkadur.fate.v1.lang.type.CollectionType) - n.get_collection().get_type() - ).is_set(), - params - ) - ); - - lambda_cc.release_registers(result); - collection_cc.release_registers(result); - compiler.registers().release(holder, result); - - for (final ComputationCompiler cc: param_cc_list) - { - cc.release_registers(result); - } - } -*/ -/* - @Override public void visit_sort ( final tonkadur.fate.v1.lang.instruction.Sort n @@ -707,749 +369,6 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor } */ /* - private void visit_merge_with_defaults - ( - final tonkadur.fate.v1.lang.instruction.Merge n - ) - throws Throwable - { - final Register holder; - final ComputationCompiler lambda_cc; - final ComputationCompiler main_default_cc, secondary_default_cc; - final List<Computation> params; - final List<ComputationCompiler> param_cc_list; - final ComputationCompiler main_collection_cc, secondary_collection_cc; - - params = new ArrayList<Computation>(); - param_cc_list = new ArrayList<ComputationCompiler>(); - - lambda_cc = new ComputationCompiler(compiler); - main_default_cc = new ComputationCompiler(compiler); - secondary_default_cc = new ComputationCompiler(compiler); - - n.get_lambda_function().get_visited_by(lambda_cc); - - if (lambda_cc.has_init()) - { - result.add(lambda_cc.get_init()); - } - - main_collection_cc = new ComputationCompiler(compiler); - - n.get_main_collection().get_visited_by(main_collection_cc); - - if (main_collection_cc.has_init()) - { - result.add(main_collection_cc.get_init()); - } - - n.get_main_default().get_visited_by(main_default_cc); - - main_default_cc.generate_address(); - - if (main_default_cc.has_init()) - { - result.add(main_default_cc.get_init()); - } - - n.get_secondary_default().get_visited_by(secondary_default_cc); - - secondary_default_cc.generate_address(); - - if (secondary_default_cc.has_init()) - { - result.add(secondary_default_cc.get_init()); - } - - holder = - compiler.registers().reserve - ( - main_collection_cc.get_computation().get_type(), - result - ); - - result.add - ( - new SetValue - ( - holder.get_address(), - main_collection_cc.get_computation() - ) - ); - - result.add - ( - Clear.generate - ( - compiler.registers(), - compiler.assembler(), - main_collection_cc.get_address() - ) - ); - - secondary_collection_cc = new ComputationCompiler(compiler); - - n.get_secondary_collection().get_visited_by(secondary_collection_cc); - - if (secondary_collection_cc.has_init()) - { - result.add(secondary_collection_cc.get_init()); - } - - for - ( - final tonkadur.fate.v1.lang.meta.Computation p: - n.get_extra_parameters() - ) - { - final ComputationCompiler param_cc; - - param_cc = new ComputationCompiler(compiler); - - p.get_visited_by(param_cc); - - // Let's not re-compute the parameters on every iteration. - param_cc.generate_address(); - - if (param_cc.has_init()) - { - result.add(param_cc.get_init()); - } - - param_cc_list.add(param_cc); - - params.add(param_cc.get_computation()); - } - - result.add - ( - MergeLambda.generate - ( - compiler.registers(), - compiler.assembler(), - lambda_cc.get_computation(), - secondary_default_cc.get_computation(), - secondary_collection_cc.get_address(), - main_default_cc.get_computation(), - holder.get_address(), - main_collection_cc.get_address(), - ( - (tonkadur.fate.v1.lang.type.CollectionType) - n.get_main_collection().get_type() - ).is_set(), - params - ) - ); - - main_collection_cc.release_registers(result); - secondary_collection_cc.release_registers(result); - main_default_cc.release_registers(result); - secondary_default_cc.release_registers(result); - compiler.registers().release(holder, result); - - for (final ComputationCompiler cc: param_cc_list) - { - cc.release_registers(result); - } - } -*/ -/* - @Override - public void visit_merge - ( - final tonkadur.fate.v1.lang.instruction.Merge n - ) - throws Throwable - { - // This is one dangerous operation to do in-place, so we don't. - - if (n.get_main_default() != null) - { - visit_merge_with_defaults(n); - return; - } - - final Register holder; - final ComputationCompiler lambda_cc; - final List<Computation> params; - final List<ComputationCompiler> param_cc_list; - final ComputationCompiler main_collection_cc, secondary_collection_cc; - - params = new ArrayList<Computation>(); - param_cc_list = new ArrayList<ComputationCompiler>(); - - lambda_cc = new ComputationCompiler(compiler); - - n.get_lambda_function().get_visited_by(lambda_cc); - - if (lambda_cc.has_init()) - { - result.add(lambda_cc.get_init()); - } - - main_collection_cc = new ComputationCompiler(compiler); - - n.get_main_collection().get_visited_by(main_collection_cc); - - if (main_collection_cc.has_init()) - { - result.add(main_collection_cc.get_init()); - } - - holder = - compiler.registers().reserve - ( - main_collection_cc.get_computation().get_type(), - result - ); - - result.add - ( - new SetValue - ( - holder.get_address(), - main_collection_cc.get_computation() - ) - ); - - result.add - ( - Clear.generate - ( - compiler.registers(), - compiler.assembler(), - main_collection_cc.get_address() - ) - ); - - secondary_collection_cc = new ComputationCompiler(compiler); - - n.get_secondary_collection().get_visited_by(secondary_collection_cc); - - if (secondary_collection_cc.has_init()) - { - result.add(secondary_collection_cc.get_init()); - } - - for - ( - final tonkadur.fate.v1.lang.meta.Computation p: - n.get_extra_parameters() - ) - { - final ComputationCompiler param_cc; - - param_cc = new ComputationCompiler(compiler); - - p.get_visited_by(param_cc); - - // Let's not re-compute the parameters on every iteration. - param_cc.generate_address(); - - if (param_cc.has_init()) - { - result.add(param_cc.get_init()); - } - - param_cc_list.add(param_cc); - - params.add(param_cc.get_computation()); - } - - result.add - ( - MergeLambda.generate - ( - compiler.registers(), - compiler.assembler(), - lambda_cc.get_computation(), - secondary_collection_cc.get_address(), - holder.get_address(), - main_collection_cc.get_address(), - ( - (tonkadur.fate.v1.lang.type.CollectionType) - n.get_main_collection().get_type() - ).is_set(), - params - ) - ); - - main_collection_cc.release_registers(result); - secondary_collection_cc.release_registers(result); - compiler.registers().release(holder, result); - - for (final ComputationCompiler cc: param_cc_list) - { - cc.release_registers(result); - } - } -*/ -/* - private void visit_indexed_merge_with_defaults - ( - final tonkadur.fate.v1.lang.instruction.IndexedMerge n - ) - throws Throwable - { - final Register holder; - final ComputationCompiler lambda_cc; - final ComputationCompiler main_default_cc, secondary_default_cc; - final List<Computation> params; - final List<ComputationCompiler> param_cc_list; - final ComputationCompiler main_collection_cc, secondary_collection_cc; - - params = new ArrayList<Computation>(); - param_cc_list = new ArrayList<ComputationCompiler>(); - - lambda_cc = new ComputationCompiler(compiler); - main_default_cc = new ComputationCompiler(compiler); - secondary_default_cc = new ComputationCompiler(compiler); - - n.get_lambda_function().get_visited_by(lambda_cc); - - if (lambda_cc.has_init()) - { - result.add(lambda_cc.get_init()); - } - - main_collection_cc = new ComputationCompiler(compiler); - - n.get_main_collection().get_visited_by(main_collection_cc); - - if (main_collection_cc.has_init()) - { - result.add(main_collection_cc.get_init()); - } - - n.get_main_default().get_visited_by(main_default_cc); - - main_default_cc.generate_address(); - - if (main_default_cc.has_init()) - { - result.add(main_default_cc.get_init()); - } - - n.get_secondary_default().get_visited_by(secondary_default_cc); - - secondary_default_cc.generate_address(); - - if (secondary_default_cc.has_init()) - { - result.add(secondary_default_cc.get_init()); - } - - holder = - compiler.registers().reserve - ( - main_collection_cc.get_computation().get_type(), - result - ); - - result.add - ( - new SetValue - ( - holder.get_address(), - main_collection_cc.get_computation() - ) - ); - - result.add - ( - Clear.generate - ( - compiler.registers(), - compiler.assembler(), - main_collection_cc.get_address() - ) - ); - - secondary_collection_cc = new ComputationCompiler(compiler); - - n.get_secondary_collection().get_visited_by(secondary_collection_cc); - - if (secondary_collection_cc.has_init()) - { - result.add(secondary_collection_cc.get_init()); - } - - for - ( - final tonkadur.fate.v1.lang.meta.Computation p: - n.get_extra_parameters() - ) - { - final ComputationCompiler param_cc; - - param_cc = new ComputationCompiler(compiler); - - p.get_visited_by(param_cc); - - // Let's not re-compute the parameters on every iteration. - param_cc.generate_address(); - - if (param_cc.has_init()) - { - result.add(param_cc.get_init()); - } - - param_cc_list.add(param_cc); - - params.add(param_cc.get_computation()); - } - - result.add - ( - IndexedMergeLambda.generate - ( - compiler.registers(), - compiler.assembler(), - lambda_cc.get_computation(), - secondary_default_cc.get_computation(), - secondary_collection_cc.get_address(), - main_default_cc.get_computation(), - holder.get_address(), - main_collection_cc.get_address(), - ( - (tonkadur.fate.v1.lang.type.CollectionType) - n.get_main_collection().get_type() - ).is_set(), - params - ) - ); - - main_collection_cc.release_registers(result); - secondary_collection_cc.release_registers(result); - main_default_cc.release_registers(result); - secondary_default_cc.release_registers(result); - compiler.registers().release(holder, result); - - for (final ComputationCompiler cc: param_cc_list) - { - cc.release_registers(result); - } - } -*/ -/* - @Override - public void visit_indexed_merge - ( - final tonkadur.fate.v1.lang.instruction.IndexedMerge n - ) - throws Throwable - { - if (n.get_main_default() != null) - { - visit_indexed_merge_with_defaults(n); - return; - } - - // This is one dangerous operation to do in-place, so we don't. - final Register holder; - final ComputationCompiler lambda_cc; - final List<Computation> params; - final List<ComputationCompiler> param_cc_list; - final ComputationCompiler main_collection_cc, secondary_collection_cc; - - params = new ArrayList<Computation>(); - param_cc_list = new ArrayList<ComputationCompiler>(); - - lambda_cc = new ComputationCompiler(compiler); - - n.get_lambda_function().get_visited_by(lambda_cc); - - if (lambda_cc.has_init()) - { - result.add(lambda_cc.get_init()); - } - - main_collection_cc = new ComputationCompiler(compiler); - - n.get_main_collection().get_visited_by(main_collection_cc); - - if (main_collection_cc.has_init()) - { - result.add(main_collection_cc.get_init()); - } - - holder = - compiler.registers().reserve - ( - main_collection_cc.get_computation().get_type(), - result - ); - - result.add - ( - new SetValue - ( - holder.get_address(), - main_collection_cc.get_computation() - ) - ); - - result.add - ( - Clear.generate - ( - compiler.registers(), - compiler.assembler(), - main_collection_cc.get_address() - ) - ); - - secondary_collection_cc = new ComputationCompiler(compiler); - - n.get_secondary_collection().get_visited_by(secondary_collection_cc); - - if (secondary_collection_cc.has_init()) - { - result.add(secondary_collection_cc.get_init()); - } - - for - ( - final tonkadur.fate.v1.lang.meta.Computation p: - n.get_extra_parameters() - ) - { - final ComputationCompiler param_cc; - - param_cc = new ComputationCompiler(compiler); - - p.get_visited_by(param_cc); - - // Let's not re-compute the parameters on every iteration. - param_cc.generate_address(); - - if (param_cc.has_init()) - { - result.add(param_cc.get_init()); - } - - param_cc_list.add(param_cc); - - params.add(param_cc.get_computation()); - } - - result.add - ( - IndexedMergeLambda.generate - ( - compiler.registers(), - compiler.assembler(), - lambda_cc.get_computation(), - secondary_collection_cc.get_address(), - holder.get_address(), - main_collection_cc.get_address(), - ( - (tonkadur.fate.v1.lang.type.CollectionType) - n.get_main_collection().get_type() - ).is_set(), - params - ) - ); - - main_collection_cc.release_registers(result); - secondary_collection_cc.release_registers(result); - compiler.registers().release(holder, result); - - for (final ComputationCompiler cc: param_cc_list) - { - cc.release_registers(result); - } - } -*/ -/* - @Override - public void visit_partition - ( - final tonkadur.fate.v1.lang.instruction.Partition n - ) - throws Throwable - { - final List<Computation> params; - final List<ComputationCompiler> param_cc_list; - final ComputationCompiler lambda_cc, collection_in_cc, collection_out_cc; - - params = new ArrayList<Computation>(); - param_cc_list = new ArrayList<ComputationCompiler>(); - - for - ( - final tonkadur.fate.v1.lang.meta.Computation p: - n.get_extra_parameters() - ) - { - final ComputationCompiler param_cc; - - param_cc = new ComputationCompiler(compiler); - - p.get_visited_by(param_cc); - - // Let's not re-compute the parameters on every iteration. - param_cc.generate_address(); - - if (param_cc.has_init()) - { - result.add(param_cc.get_init()); - } - - param_cc_list.add(param_cc); - - params.add(param_cc.get_computation()); - } - - lambda_cc = new ComputationCompiler(compiler); - - n.get_lambda_function().get_visited_by(lambda_cc); - - if (lambda_cc.has_init()) - { - result.add(lambda_cc.get_init()); - } - - collection_in_cc = new ComputationCompiler(compiler); - - n.get_collection_in().get_visited_by(collection_in_cc); - - if (collection_in_cc.has_init()) - { - result.add(collection_in_cc.get_init()); - } - - collection_out_cc = new ComputationCompiler(compiler); - - n.get_collection_out().get_visited_by(collection_out_cc); - - if (collection_out_cc.has_init()) - { - result.add(collection_out_cc.get_init()); - } - - result.add - ( - PartitionLambda.generate - ( - compiler.registers(), - compiler.assembler(), - lambda_cc.get_computation(), - collection_in_cc.get_address(), - collection_out_cc.get_address(), - ( - (tonkadur.fate.v1.lang.type.CollectionType) - n.get_collection_out().get_type() - ).is_set(), - params - ) - ); - - lambda_cc.release_registers(result); - collection_in_cc.release_registers(result); - collection_out_cc.release_registers(result); - - for (final ComputationCompiler cc: param_cc_list) - { - cc.release_registers(result); - } - } -*/ -/* - @Override - public void visit_indexed_partition - ( - final tonkadur.fate.v1.lang.instruction.IndexedPartition n - ) - throws Throwable - { - final List<Computation> params; - final List<ComputationCompiler> param_cc_list; - final ComputationCompiler lambda_cc, collection_in_cc, collection_out_cc; - - params = new ArrayList<Computation>(); - param_cc_list = new ArrayList<ComputationCompiler>(); - - for - ( - final tonkadur.fate.v1.lang.meta.Computation p: - n.get_extra_parameters() - ) - { - final ComputationCompiler param_cc; - - param_cc = new ComputationCompiler(compiler); - - p.get_visited_by(param_cc); - - // Let's not re-compute the parameters on every iteration. - param_cc.generate_address(); - - if (param_cc.has_init()) - { - result.add(param_cc.get_init()); - } - - param_cc_list.add(param_cc); - - params.add(param_cc.get_computation()); - } - - lambda_cc = new ComputationCompiler(compiler); - - n.get_lambda_function().get_visited_by(lambda_cc); - - if (lambda_cc.has_init()) - { - result.add(lambda_cc.get_init()); - } - - collection_in_cc = new ComputationCompiler(compiler); - - n.get_collection_in().get_visited_by(collection_in_cc); - - if (collection_in_cc.has_init()) - { - result.add(collection_in_cc.get_init()); - } - - collection_out_cc = new ComputationCompiler(compiler); - - n.get_collection_out().get_visited_by(collection_out_cc); - - if (collection_out_cc.has_init()) - { - result.add(collection_out_cc.get_init()); - } - - result.add - ( - IndexedPartitionLambda.generate - ( - compiler.registers(), - compiler.assembler(), - lambda_cc.get_computation(), - collection_in_cc.get_address(), - collection_out_cc.get_address(), - ( - (tonkadur.fate.v1.lang.type.CollectionType) - n.get_collection_out().get_type() - ).is_set(), - params - ) - ); - - lambda_cc.release_registers(result); - collection_in_cc.release_registers(result); - collection_out_cc.release_registers(result); - - for (final ComputationCompiler cc: param_cc_list) - { - cc.release_registers(result); - } - } -*/ -/* @Override public void visit_sublist ( @@ -1521,385 +440,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor end_compiler.release_registers(result); } */ -/* - @Override - public void visit_push_element - ( - final tonkadur.fate.v1.lang.instruction.PushElement n - ) - throws Throwable - { - final ComputationCompiler address_compiler, element_compiler; - final Register collection_size, index; - - address_compiler = new ComputationCompiler(compiler); - element_compiler = new ComputationCompiler(compiler); - - n.get_collection().get_visited_by(address_compiler); - - if (address_compiler.has_init()) - { - result.add(address_compiler.get_init()); - } - - n.get_element().get_visited_by(element_compiler); - - if (element_compiler.has_init()) - { - result.add(element_compiler.get_init()); - } - - collection_size = compiler.registers().reserve(Type.INT, result); - index = compiler.registers().reserve(Type.INT, result); - - result.add - ( - new SetValue - ( - collection_size.get_address(), - new Size(address_compiler.get_address()) - ) - ); - - result.add - ( - new SetValue - ( - index.get_address(), - (n.is_from_left() ? Constant.ZERO : collection_size.get_value()) - ) - ); - - result.add - ( - InsertAt.generate - ( - compiler.registers(), - compiler.assembler(), - index.get_address(), - element_compiler.get_computation(), - collection_size.get_value(), - address_compiler.get_address() - ) - ); - - address_compiler.release_registers(result); - element_compiler.release_registers(result); - - compiler.registers().release(collection_size, result); - compiler.registers().release(index, result); - } -*/ -/* - @Override - public void visit_pop_element - ( - final tonkadur.fate.v1.lang.instruction.PopElement n - ) - throws Throwable - { - final ComputationCompiler address_compiler, element_compiler; - - address_compiler = new ComputationCompiler(compiler); - element_compiler = new ComputationCompiler(compiler); - - n.get_collection().get_visited_by(address_compiler); - - if (address_compiler.has_init()) - { - result.add(address_compiler.get_init()); - } - - n.get_storage_pointer().get_visited_by(element_compiler); - - if (element_compiler.has_init()) - { - result.add(element_compiler.get_init()); - } - - result.add - ( - PopElement.generate - ( - compiler.registers(), - compiler.assembler(), - address_compiler.get_address(), - element_compiler.get_computation(), - n.is_from_left() - ) - ); - address_compiler.release_registers(result); - element_compiler.release_registers(result); - } -*/ -/* - @Override - public void visit_filter - ( - final tonkadur.fate.v1.lang.instruction.Filter n - ) - throws Throwable - { - final List<Computation> params; - final List<ComputationCompiler> param_cc_list; - final ComputationCompiler lambda_cc, collection_cc; - - params = new ArrayList<Computation>(); - param_cc_list = new ArrayList<ComputationCompiler>(); - - for - ( - final tonkadur.fate.v1.lang.meta.Computation p: - n.get_extra_parameters() - ) - { - final ComputationCompiler param_cc; - - param_cc = new ComputationCompiler(compiler); - - p.get_visited_by(param_cc); - - // Let's not re-compute the parameters on every iteration. - param_cc.generate_address(); - - if (param_cc.has_init()) - { - result.add(param_cc.get_init()); - } - - param_cc_list.add(param_cc); - - params.add(param_cc.get_computation()); - } - - lambda_cc = new ComputationCompiler(compiler); - - n.get_lambda_function().get_visited_by(lambda_cc); - - if (lambda_cc.has_init()) - { - result.add(lambda_cc.get_init()); - } - - collection_cc = new ComputationCompiler(compiler); - - n.get_collection().get_visited_by(collection_cc); - - if (collection_cc.has_init()) - { - result.add(collection_cc.get_init()); - } - - result.add - ( - FilterLambda.generate - ( - compiler.registers(), - compiler.assembler(), - lambda_cc.get_computation(), - collection_cc.get_address(), - params - ) - ); - - lambda_cc.release_registers(result); - collection_cc.release_registers(result); - - for (final ComputationCompiler cc: param_cc_list) - { - cc.release_registers(result); - } - } -*/ -/* - @Override - public void visit_indexed_filter - ( - final tonkadur.fate.v1.lang.instruction.IndexedFilter n - ) - throws Throwable - { - final List<Computation> params; - final List<ComputationCompiler> param_cc_list; - final ComputationCompiler lambda_cc, collection_cc; - - params = new ArrayList<Computation>(); - param_cc_list = new ArrayList<ComputationCompiler>(); - - for - ( - final tonkadur.fate.v1.lang.meta.Computation p: - n.get_extra_parameters() - ) - { - final ComputationCompiler param_cc; - - param_cc = new ComputationCompiler(compiler); - - p.get_visited_by(param_cc); - - // Let's not re-compute the parameters on every iteration. - param_cc.generate_address(); - - if (param_cc.has_init()) - { - result.add(param_cc.get_init()); - } - - param_cc_list.add(param_cc); - - params.add(param_cc.get_computation()); - } - - lambda_cc = new ComputationCompiler(compiler); - - n.get_lambda_function().get_visited_by(lambda_cc); - - if (lambda_cc.has_init()) - { - result.add(lambda_cc.get_init()); - } - - collection_cc = new ComputationCompiler(compiler); - - n.get_collection().get_visited_by(collection_cc); - - if (collection_cc.has_init()) - { - result.add(collection_cc.get_init()); - } - - result.add - ( - IndexedFilterLambda.generate - ( - compiler.registers(), - compiler.assembler(), - lambda_cc.get_computation(), - collection_cc.get_address(), - params - ) - ); - - lambda_cc.release_registers(result); - collection_cc.release_registers(result); - - for (final ComputationCompiler cc: param_cc_list) - { - cc.release_registers(result); - } - } -*/ -/* - @Override - public void visit_indexed_map - ( - final tonkadur.fate.v1.lang.instruction.IndexedMap n - ) - throws Throwable - { - final List<Computation> params; - final List<ComputationCompiler> param_cc_list; - // This is one dangerous operation to do in-place, so we don't. - final Register holder; - final ComputationCompiler lambda_cc, collection_cc; - - params = new ArrayList<Computation>(); - param_cc_list = new ArrayList<ComputationCompiler>(); - - for - ( - final tonkadur.fate.v1.lang.meta.Computation p: - n.get_extra_parameters() - ) - { - final ComputationCompiler param_cc; - - param_cc = new ComputationCompiler(compiler); - - p.get_visited_by(param_cc); - - // Let's not re-compute the parameters on every iteration. - param_cc.generate_address(); - - if (param_cc.has_init()) - { - result.add(param_cc.get_init()); - } - - param_cc_list.add(param_cc); - - params.add(param_cc.get_computation()); - } - - lambda_cc = new ComputationCompiler(compiler); - - n.get_lambda_function().get_visited_by(lambda_cc); - - if (lambda_cc.has_init()) - { - result.add(lambda_cc.get_init()); - } - - collection_cc = new ComputationCompiler(compiler); - - n.get_collection().get_visited_by(collection_cc); - - if (collection_cc.has_init()) - { - result.add(collection_cc.get_init()); - } - - holder = - compiler.registers().reserve - ( - collection_cc.get_computation().get_type(), - result - ); - - result.add - ( - new SetValue(holder.get_address(), collection_cc.get_computation()) - ); - - result.add - ( - Clear.generate - ( - compiler.registers(), - compiler.assembler(), - collection_cc.get_address() - ) - ); - - result.add - ( - IndexedMapLambda.generate - ( - compiler.registers(), - compiler.assembler(), - lambda_cc.get_computation(), - holder.get_address(), - collection_cc.get_address(), - ( - (tonkadur.fate.v1.lang.type.CollectionType) - n.get_collection().get_type() - ).is_set(), - params - ) - ); - - lambda_cc.release_registers(result); - collection_cc.release_registers(result); - compiler.registers().release(holder, result); - - for (final ComputationCompiler cc: param_cc_list) - { - cc.release_registers(result); - } - } -*/ @Override public void visit_switch_instruction ( @@ -2370,6 +911,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor end_of_loop_label ) ); + compiler.registers().unbind(n.get_parameter_name(), result); compiler.assembler().pop_context_label("breakable"); @@ -2379,63 +921,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor /* Already released by the unbind above. */ /* compiler.registers().release(current_value, result); */ } -/* - @Override - public void visit_remove_element_at - ( - final tonkadur.fate.v1.lang.instruction.RemoveElementAt n - ) - throws Throwable - { - final ComputationCompiler index_cc, collection_cc; - final Address collection; - final Register collection_size; - - index_cc = new ComputationCompiler(compiler); - collection_cc = new ComputationCompiler(compiler); - - collection_size = compiler.registers().reserve(Type.INT, result); - - n.get_index().get_visited_by(index_cc); - n.get_collection().get_visited_by(collection_cc); - index_cc.generate_address(); - - if (index_cc.has_init()) - { - result.add(index_cc.get_init()); - } - - if (collection_cc.has_init()) - { - result.add(collection_cc.get_init()); - } - - collection = collection_cc.get_address(); - - result.add - ( - new SetValue(collection_size.get_address(), new Size(collection)) - ); - - result.add - ( - RemoveAt.generate - ( - compiler.registers(), - compiler.assembler(), - index_cc.get_address(), - collection_size.get_value(), - collection - ) - ); - - compiler.registers().release(collection_size, result); - - index_cc.release_registers(result); - collection_cc.release_registers(result); - } -*/ @Override public void visit_cond_instruction ( @@ -2733,55 +1219,6 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor } @Override - public void visit_done - ( - final tonkadur.fate.v1.lang.instruction.Done n - ) - throws Throwable - { - result.add - ( - compiler.assembler().merge - ( - compiler.registers().get_finalize_context_instructions() - ) - ); - result.add - ( - compiler.assembler().merge - ( - compiler.registers().get_leave_context_instructions() - ) - ); - } - - @Override - public void visit_end - ( - final tonkadur.fate.v1.lang.instruction.End n - ) - throws Throwable - { - result.add(new End()); - } - - @Override - public void visit_break - ( - final tonkadur.fate.v1.lang.instruction.Break n - ) - throws Throwable - { - result.add - ( - new SetPC - ( - compiler.assembler().get_context_label_constant("breakable") - ) - ); - } - - @Override public void visit_text_option ( final tonkadur.fate.v1.lang.instruction.TextOption n @@ -3464,6 +1901,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor } } +/* @Override public void visit_sequence_variable_call ( @@ -3536,7 +1974,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor cc.release_registers(result); } } - +*/ @Override public void visit_sequence_jump ( @@ -3596,7 +2034,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor ) ); } - +/* @Override public void visit_sequence_variable_jump ( @@ -3646,7 +2084,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor cc.release_registers(result); } - /* Terminate current context */ + // Terminate current context result.addAll ( compiler.registers().get_finalize_context_instructions() @@ -3662,7 +2100,8 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor sequence_cc.release_registers(result); } - +*/ +/* @Override public void visit_set_value ( @@ -3673,7 +2112,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor /* * Fate: (set_value address value) * Wyrd: (set_value address value) - */ + *//* final ComputationCompiler value_cc, address_cc; value_cc = new ComputationCompiler(compiler); @@ -3701,6 +2140,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor value_cc.release_registers(result); address_cc.release_registers(result); } +*/ @Override public void visit_prompt_integer diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/AddElementAtCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/AddElementAtCompiler.java new file mode 100644 index 0000000..0948d7a --- /dev/null +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/AddElementAtCompiler.java @@ -0,0 +1,124 @@ +package tonkadur.wyrd.v1.compiler.fate.v1.instruction.generic; + +import tonkadur.fate.v1.lang.instruction.generic.AddElementAt; + +import tonkadur.wyrd.v1.lang.Register; + +import tonkadur.wyrd.v1.lang.computation.Address; +import tonkadur.wyrd.v1.lang.computation.Constant; +import tonkadur.wyrd.v1.lang.computation.IfElseComputation; +import tonkadur.wyrd.v1.lang.computation.Size; +import tonkadur.wyrd.v1.lang.computation.Operation; + +import tonkadur.wyrd.v1.lang.instruction.SetValue; + +import tonkadur.wyrd.v1.lang.type.Type; + +import tonkadur.wyrd.v1.compiler.fate.v1.Compiler; +import tonkadur.wyrd.v1.compiler.fate.v1.TypeCompiler; +import tonkadur.wyrd.v1.compiler.fate.v1.ComputationCompiler; + +import tonkadur.wyrd.v1.compiler.fate.v1.instruction.GenericInstructionCompiler; + +public class AddElementAtCompiler extends GenericInstructionCompiler +{ + public static Class get_target_class () + { + return AddElementAt.class; + } + + public AddElementAtCompiler (final Compiler compiler) + { + super(compiler); + } + + public void compile + ( + final tonkadur.fate.v1.lang.instruction.GenericInstruction instruction + ) + throws Throwable + { + final AddElementAt source; + final Address collection_as_address; + final ComputationCompiler index_compiler, element_compiler; + final ComputationCompiler collection_compiler; + final Register index_holder; + + source = (AddElementAt) instruction; + + index_holder = compiler.registers().reserve(Type.INT, result); + + index_compiler = new ComputationCompiler(compiler); + + source.get_index().get_visited_by(index_compiler); + + if (index_compiler.has_init()) + { + result.add(index_compiler.get_init()); + } + + element_compiler = new ComputationCompiler(compiler); + + source.get_element().get_visited_by(element_compiler); + + if (element_compiler.has_init()) + { + result.add(element_compiler.get_init()); + } + + collection_compiler = new ComputationCompiler(compiler); + + source.get_collection().get_visited_by(collection_compiler); + + if (collection_compiler.has_init()) + { + result.add(collection_compiler.get_init()); + } + + result.add + ( + new SetValue + ( + index_holder.get_address(), + new IfElseComputation + ( + Operation.greater_than + ( + index_compiler.get_computation(), + new Size(collection_compiler.get_address()) + ), + new Size(collection_compiler.get_address()), + new IfElseComputation + ( + Operation.less_than + ( + index_compiler.get_computation(), + Constant.ZERO + ), + Constant.ZERO, + index_compiler.get_computation() + ) + ) + ) + ); + + result.add + ( + tonkadur.wyrd.v1.compiler.util.InsertAt.generate + ( + compiler.registers(), + compiler.assembler(), + index_holder.get_address(), + element_compiler.get_computation(), + new Size(collection_compiler.get_address()), + collection_compiler.get_address() + ) + ); + + compiler.registers().release(index_holder, result); + + index_compiler.release_registers(result); + element_compiler.release_registers(result); + collection_compiler.release_registers(result); + } +} diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/AddElementCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/AddElementCompiler.java new file mode 100644 index 0000000..b3d8a3b --- /dev/null +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/AddElementCompiler.java @@ -0,0 +1,69 @@ +package tonkadur.wyrd.v1.compiler.fate.v1.instruction.generic; + +import tonkadur.fate.v1.lang.instruction.generic.AddElement; + +import tonkadur.wyrd.v1.compiler.fate.v1.Compiler; +import tonkadur.wyrd.v1.compiler.fate.v1.TypeCompiler; +import tonkadur.wyrd.v1.compiler.fate.v1.ComputationCompiler; + +import tonkadur.wyrd.v1.compiler.fate.v1.instruction.GenericInstructionCompiler; + +public class AddElementCompiler extends GenericInstructionCompiler +{ + public static Class get_target_class () + { + return AddElement.class; + } + + public AddElementCompiler (final Compiler compiler) + { + super(compiler); + } + + public void compile + ( + final tonkadur.fate.v1.lang.instruction.GenericInstruction instruction + ) + throws Throwable + { + final AddElement source; + final ComputationCompiler address_compiler, element_compiler; + + source = (AddElement) instruction; + + address_compiler = new ComputationCompiler(compiler); + element_compiler = new ComputationCompiler(compiler); + + source.get_collection().get_visited_by(address_compiler); + + if (address_compiler.has_init()) + { + result.add(address_compiler.get_init()); + } + + source.get_element().get_visited_by(element_compiler); + + if (element_compiler.has_init()) + { + result.add(element_compiler.get_init()); + } + + result.add + ( + tonkadur.wyrd.v1.compiler.util.AddElement.generate + ( + compiler.registers(), + compiler.assembler(), + element_compiler.get_computation(), + address_compiler.get_address(), + ( + (tonkadur.fate.v1.lang.type.CollectionType) + source.get_collection().get_type() + ).is_set() + ) + ); + + element_compiler.release_registers(result); + address_compiler.release_registers(result); + } +} diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/AddElementsOfCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/AddElementsOfCompiler.java new file mode 100644 index 0000000..5cfb0bd --- /dev/null +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/AddElementsOfCompiler.java @@ -0,0 +1,70 @@ +package tonkadur.wyrd.v1.compiler.fate.v1.instruction.generic; + +import tonkadur.fate.v1.lang.instruction.generic.AddElementsOf; + +import tonkadur.wyrd.v1.compiler.fate.v1.Compiler; +import tonkadur.wyrd.v1.compiler.fate.v1.TypeCompiler; +import tonkadur.wyrd.v1.compiler.fate.v1.ComputationCompiler; + +import tonkadur.wyrd.v1.compiler.fate.v1.instruction.GenericInstructionCompiler; + +public class AddElementsOfCompiler extends GenericInstructionCompiler +{ + public static Class get_target_class () + { + return AddElementsOf.class; + } + + public AddElementsOfCompiler (final Compiler compiler) + { + super(compiler); + } + + public void compile + ( + final tonkadur.fate.v1.lang.instruction.GenericInstruction instruction + ) + throws Throwable + { + final AddElementsOf source; + final ComputationCompiler collection_in_cc, collection_cc; + + source = (AddElementsOf) instruction; + + collection_cc = new ComputationCompiler(compiler); + + source.get_target_collection().get_visited_by(collection_cc); + + if (collection_cc.has_init()) + { + result.add(collection_cc.get_init()); + } + + collection_in_cc = new ComputationCompiler(compiler); + + source.get_source_collection().get_visited_by(collection_in_cc); + + if (collection_in_cc.has_init()) + { + result.add(collection_in_cc.get_init()); + } + + result.add + ( + tonkadur.wyrd.v1.compiler.util.AddElementsOf.generate + ( + compiler.registers(), + compiler.assembler(), + collection_in_cc.get_address(), + collection_cc.get_address(), + ( + (tonkadur.fate.v1.lang.type.CollectionType) + source.get_target_collection().get_type() + ).is_set() + ) + ); + + collection_cc.release_registers(result); + collection_in_cc.release_registers(result); + } +} diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/BreakCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/BreakCompiler.java new file mode 100644 index 0000000..eca0841 --- /dev/null +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/BreakCompiler.java @@ -0,0 +1,38 @@ +package tonkadur.wyrd.v1.compiler.fate.v1.instruction.generic; + +import tonkadur.fate.v1.lang.instruction.generic.Break; + +import tonkadur.wyrd.v1.lang.instruction.SetPC; + +import tonkadur.wyrd.v1.compiler.fate.v1.Compiler; + +import tonkadur.wyrd.v1.compiler.fate.v1.instruction.GenericInstructionCompiler; + + +public class BreakCompiler extends GenericInstructionCompiler +{ + public static Class get_target_class () + { + return Break.class; + } + + public BreakCompiler (final Compiler compiler) + { + super(compiler); + } + + public void compile + ( + final tonkadur.fate.v1.lang.instruction.GenericInstruction instruction + ) + throws Throwable + { + result.add + ( + new SetPC + ( + compiler.assembler().get_context_label_constant("breakable") + ) + ); + } +} diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/DoneCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/DoneCompiler.java new file mode 100644 index 0000000..c87262d --- /dev/null +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/DoneCompiler.java @@ -0,0 +1,42 @@ +package tonkadur.wyrd.v1.compiler.fate.v1.instruction.generic; + +import tonkadur.fate.v1.lang.instruction.generic.Done; + +import tonkadur.wyrd.v1.compiler.fate.v1.Compiler; + +import tonkadur.wyrd.v1.compiler.fate.v1.instruction.GenericInstructionCompiler; + +public class DoneCompiler extends GenericInstructionCompiler +{ + public static Class get_target_class () + { + return Done.class; + } + + public DoneCompiler (final Compiler compiler) + { + super(compiler); + } + + public void compile + ( + final tonkadur.fate.v1.lang.instruction.GenericInstruction instruction + ) + throws Throwable + { + result.add + ( + compiler.assembler().merge + ( + compiler.registers().get_finalize_context_instructions() + ) + ); + result.add + ( + compiler.assembler().merge + ( + compiler.registers().get_leave_context_instructions() + ) + ); + } +} diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/EndCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/EndCompiler.java new file mode 100644 index 0000000..7957fe1 --- /dev/null +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/EndCompiler.java @@ -0,0 +1,30 @@ +package tonkadur.wyrd.v1.compiler.fate.v1.instruction.generic; + +import tonkadur.wyrd.v1.lang.instruction.End; + +import tonkadur.wyrd.v1.compiler.fate.v1.Compiler; + +import tonkadur.wyrd.v1.compiler.fate.v1.instruction.GenericInstructionCompiler; + + +public class EndCompiler extends GenericInstructionCompiler +{ + public static Class get_target_class () + { + return tonkadur.fate.v1.lang.instruction.generic.End.class; + } + + public EndCompiler (final Compiler compiler) + { + super(compiler); + } + + public void compile + ( + final tonkadur.fate.v1.lang.instruction.GenericInstruction instruction + ) + throws Throwable + { + result.add(new End()); + } +} diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/FilterCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/FilterCompiler.java new file mode 100644 index 0000000..a7e2035 --- /dev/null +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/FilterCompiler.java @@ -0,0 +1,106 @@ +package tonkadur.wyrd.v1.compiler.fate.v1.instruction.generic; + +import java.util.List; +import java.util.ArrayList; + +import tonkadur.fate.v1.lang.instruction.generic.Filter; + +import tonkadur.wyrd.v1.compiler.fate.v1.Compiler; +import tonkadur.wyrd.v1.compiler.fate.v1.ComputationCompiler; + +import tonkadur.wyrd.v1.lang.meta.Computation; + +import tonkadur.wyrd.v1.compiler.fate.v1.instruction.GenericInstructionCompiler; + +public class FilterCompiler extends GenericInstructionCompiler +{ + public static Class get_target_class () + { + return Filter.class; + } + + public FilterCompiler (final Compiler compiler) + { + super(compiler); + } + + public void compile + ( + final tonkadur.fate.v1.lang.instruction.GenericInstruction instruction + ) + throws Throwable + { + final Filter source; + final List<Computation> params; + final List<ComputationCompiler> param_cc_list; + final ComputationCompiler lambda_cc, collection_cc; + + source = (Filter) instruction; + + params = new ArrayList<Computation>(); + param_cc_list = new ArrayList<ComputationCompiler>(); + + for + ( + final tonkadur.fate.v1.lang.meta.Computation p: + source.get_extra_parameters() + ) + { + final ComputationCompiler param_cc; + + param_cc = new ComputationCompiler(compiler); + + p.get_visited_by(param_cc); + + // Let's not re-compute the parameters on every iteration. + param_cc.generate_address(); + + if (param_cc.has_init()) + { + result.add(param_cc.get_init()); + } + + param_cc_list.add(param_cc); + + params.add(param_cc.get_computation()); + } + + lambda_cc = new ComputationCompiler(compiler); + + source.get_lambda_function().get_visited_by(lambda_cc); + + if (lambda_cc.has_init()) + { + result.add(lambda_cc.get_init()); + } + + collection_cc = new ComputationCompiler(compiler); + + source.get_collection().get_visited_by(collection_cc); + + if (collection_cc.has_init()) + { + result.add(collection_cc.get_init()); + } + + result.add + ( + tonkadur.wyrd.v1.compiler.util.FilterLambda.generate + ( + compiler.registers(), + compiler.assembler(), + lambda_cc.get_computation(), + collection_cc.get_address(), + params + ) + ); + + lambda_cc.release_registers(result); + collection_cc.release_registers(result); + + for (final ComputationCompiler cc: param_cc_list) + { + cc.release_registers(result); + } + } +} diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/IndexedFilterCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/IndexedFilterCompiler.java new file mode 100644 index 0000000..d4e00a3 --- /dev/null +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/IndexedFilterCompiler.java @@ -0,0 +1,106 @@ +package tonkadur.wyrd.v1.compiler.fate.v1.instruction.generic; + +import java.util.List; +import java.util.ArrayList; + +import tonkadur.fate.v1.lang.instruction.generic.IndexedFilter; + +import tonkadur.wyrd.v1.compiler.fate.v1.Compiler; +import tonkadur.wyrd.v1.compiler.fate.v1.ComputationCompiler; + +import tonkadur.wyrd.v1.lang.meta.Computation; + +import tonkadur.wyrd.v1.compiler.fate.v1.instruction.GenericInstructionCompiler; + +public class IndexedFilterCompiler extends GenericInstructionCompiler +{ + public static Class get_target_class () + { + return IndexedFilter.class; + } + + public IndexedFilterCompiler (final Compiler compiler) + { + super(compiler); + } + + public void compile + ( + final tonkadur.fate.v1.lang.instruction.GenericInstruction instruction + ) + throws Throwable + { + final IndexedFilter source; + final List<Computation> params; + final List<ComputationCompiler> param_cc_list; + final ComputationCompiler lambda_cc, collection_cc; + + source = (IndexedFilter) instruction; + + params = new ArrayList<Computation>(); + param_cc_list = new ArrayList<ComputationCompiler>(); + + for + ( + final tonkadur.fate.v1.lang.meta.Computation p: + source.get_extra_parameters() + ) + { + final ComputationCompiler param_cc; + + param_cc = new ComputationCompiler(compiler); + + p.get_visited_by(param_cc); + + // Let's not re-compute the parameters on every iteration. + param_cc.generate_address(); + + if (param_cc.has_init()) + { + result.add(param_cc.get_init()); + } + + param_cc_list.add(param_cc); + + params.add(param_cc.get_computation()); + } + + lambda_cc = new ComputationCompiler(compiler); + + source.get_lambda_function().get_visited_by(lambda_cc); + + if (lambda_cc.has_init()) + { + result.add(lambda_cc.get_init()); + } + + collection_cc = new ComputationCompiler(compiler); + + source.get_collection().get_visited_by(collection_cc); + + if (collection_cc.has_init()) + { + result.add(collection_cc.get_init()); + } + + result.add + ( + tonkadur.wyrd.v1.compiler.util.IndexedFilterLambda.generate + ( + compiler.registers(), + compiler.assembler(), + lambda_cc.get_computation(), + collection_cc.get_address(), + params + ) + ); + + lambda_cc.release_registers(result); + collection_cc.release_registers(result); + + for (final ComputationCompiler cc: param_cc_list) + { + cc.release_registers(result); + } + } +} diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/IndexedMapCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/IndexedMapCompiler.java new file mode 100644 index 0000000..3704db2 --- /dev/null +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/IndexedMapCompiler.java @@ -0,0 +1,140 @@ +package tonkadur.wyrd.v1.compiler.fate.v1.instruction.generic; + +import java.util.List; +import java.util.ArrayList; + +import tonkadur.fate.v1.lang.instruction.generic.IndexedMap; + +import tonkadur.wyrd.v1.compiler.fate.v1.Compiler; +import tonkadur.wyrd.v1.compiler.fate.v1.ComputationCompiler; + +import tonkadur.wyrd.v1.lang.Register; + +import tonkadur.wyrd.v1.lang.meta.Computation; + +import tonkadur.wyrd.v1.lang.instruction.SetValue; + +import tonkadur.wyrd.v1.compiler.fate.v1.instruction.GenericInstructionCompiler; + +public class IndexedMapCompiler extends GenericInstructionCompiler +{ + public static Class get_target_class () + { + return IndexedMap.class; + } + + public IndexedMapCompiler (final Compiler compiler) + { + super(compiler); + } + + public void compile + ( + final tonkadur.fate.v1.lang.instruction.GenericInstruction instruction + ) + throws Throwable + { + final IndexedMap source; + final List<Computation> params; + final List<ComputationCompiler> param_cc_list; + // This is one dangerous operation to do in-place, so we don't. + final Register holder; + final ComputationCompiler lambda_cc, collection_cc; + + source = (IndexedMap) instruction; + + params = new ArrayList<Computation>(); + param_cc_list = new ArrayList<ComputationCompiler>(); + + for + ( + final tonkadur.fate.v1.lang.meta.Computation p: + source.get_extra_parameters() + ) + { + final ComputationCompiler param_cc; + + param_cc = new ComputationCompiler(compiler); + + p.get_visited_by(param_cc); + + // Let's not re-compute the parameters on every iteration. + param_cc.generate_address(); + + if (param_cc.has_init()) + { + result.add(param_cc.get_init()); + } + + param_cc_list.add(param_cc); + + params.add(param_cc.get_computation()); + } + + lambda_cc = new ComputationCompiler(compiler); + + source.get_lambda_function().get_visited_by(lambda_cc); + + if (lambda_cc.has_init()) + { + result.add(lambda_cc.get_init()); + } + + collection_cc = new ComputationCompiler(compiler); + + source.get_collection().get_visited_by(collection_cc); + + if (collection_cc.has_init()) + { + result.add(collection_cc.get_init()); + } + + holder = + compiler.registers().reserve + ( + collection_cc.get_computation().get_type(), + result + ); + + result.add + ( + new SetValue(holder.get_address(), collection_cc.get_computation()) + ); + + result.add + ( + tonkadur.wyrd.v1.compiler.util.Clear.generate + ( + compiler.registers(), + compiler.assembler(), + collection_cc.get_address() + ) + ); + + result.add + ( + tonkadur.wyrd.v1.compiler.util.IndexedMapLambda.generate + ( + compiler.registers(), + compiler.assembler(), + lambda_cc.get_computation(), + holder.get_address(), + collection_cc.get_address(), + ( + (tonkadur.fate.v1.lang.type.CollectionType) + source.get_collection().get_type() + ).is_set(), + params + ) + ); + + lambda_cc.release_registers(result); + collection_cc.release_registers(result); + compiler.registers().release(holder, result); + + for (final ComputationCompiler cc: param_cc_list) + { + cc.release_registers(result); + } + } +} diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/IndexedMergeCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/IndexedMergeCompiler.java new file mode 100644 index 0000000..0f94485 --- /dev/null +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/IndexedMergeCompiler.java @@ -0,0 +1,314 @@ +package tonkadur.wyrd.v1.compiler.fate.v1.instruction.generic; + +import java.util.List; +import java.util.ArrayList; + +import tonkadur.fate.v1.lang.instruction.generic.IndexedMerge; + +import tonkadur.wyrd.v1.compiler.fate.v1.Compiler; +import tonkadur.wyrd.v1.compiler.fate.v1.ComputationCompiler; + +import tonkadur.wyrd.v1.lang.Register; + +import tonkadur.wyrd.v1.lang.meta.Computation; + +import tonkadur.wyrd.v1.lang.instruction.SetValue; + +import tonkadur.wyrd.v1.compiler.fate.v1.instruction.GenericInstructionCompiler; + +public class IndexedMergeCompiler extends GenericInstructionCompiler +{ + public static Class get_target_class () + { + return IndexedMerge.class; + } + + public IndexedMergeCompiler (final Compiler compiler) + { + super(compiler); + } + + private void compile_indexed_merge_with_defaults (final IndexedMerge source) + throws Throwable + { + final Register holder; + final ComputationCompiler lambda_cc; + final ComputationCompiler main_default_cc, secondary_default_cc; + final List<Computation> params; + final List<ComputationCompiler> param_cc_list; + final ComputationCompiler main_collection_cc, secondary_collection_cc; + + params = new ArrayList<Computation>(); + param_cc_list = new ArrayList<ComputationCompiler>(); + + lambda_cc = new ComputationCompiler(compiler); + main_default_cc = new ComputationCompiler(compiler); + secondary_default_cc = new ComputationCompiler(compiler); + + source.get_lambda_function().get_visited_by(lambda_cc); + + if (lambda_cc.has_init()) + { + result.add(lambda_cc.get_init()); + } + + main_collection_cc = new ComputationCompiler(compiler); + + source.get_main_collection().get_visited_by(main_collection_cc); + + if (main_collection_cc.has_init()) + { + result.add(main_collection_cc.get_init()); + } + + source.get_main_default().get_visited_by(main_default_cc); + + main_default_cc.generate_address(); + + if (main_default_cc.has_init()) + { + result.add(main_default_cc.get_init()); + } + + source.get_secondary_default().get_visited_by(secondary_default_cc); + + secondary_default_cc.generate_address(); + + if (secondary_default_cc.has_init()) + { + result.add(secondary_default_cc.get_init()); + } + + holder = + compiler.registers().reserve + ( + main_collection_cc.get_computation().get_type(), + result + ); + + result.add + ( + new SetValue + ( + holder.get_address(), + main_collection_cc.get_computation() + ) + ); + + result.add + ( + tonkadur.wyrd.v1.compiler.util.Clear.generate + ( + compiler.registers(), + compiler.assembler(), + main_collection_cc.get_address() + ) + ); + + secondary_collection_cc = new ComputationCompiler(compiler); + + source.get_secondary_collection().get_visited_by(secondary_collection_cc); + + if (secondary_collection_cc.has_init()) + { + result.add(secondary_collection_cc.get_init()); + } + + for + ( + final tonkadur.fate.v1.lang.meta.Computation p: + source.get_extra_parameters() + ) + { + final ComputationCompiler param_cc; + + param_cc = new ComputationCompiler(compiler); + + p.get_visited_by(param_cc); + + // Let's not re-compute the parameters on every iteration. + param_cc.generate_address(); + + if (param_cc.has_init()) + { + result.add(param_cc.get_init()); + } + + param_cc_list.add(param_cc); + + params.add(param_cc.get_computation()); + } + + result.add + ( + tonkadur.wyrd.v1.compiler.util.IndexedMergeLambda.generate + ( + compiler.registers(), + compiler.assembler(), + lambda_cc.get_computation(), + secondary_default_cc.get_computation(), + secondary_collection_cc.get_address(), + main_default_cc.get_computation(), + holder.get_address(), + main_collection_cc.get_address(), + ( + (tonkadur.fate.v1.lang.type.CollectionType) + source.get_main_collection().get_type() + ).is_set(), + params + ) + ); + + main_collection_cc.release_registers(result); + secondary_collection_cc.release_registers(result); + main_default_cc.release_registers(result); + secondary_default_cc.release_registers(result); + compiler.registers().release(holder, result); + + for (final ComputationCompiler cc: param_cc_list) + { + cc.release_registers(result); + } + } + + private void compile_indexed_merge_without_defaults + ( + final IndexedMerge source + ) + throws Throwable + { + final Register holder; + final ComputationCompiler lambda_cc; + final List<Computation> params; + final List<ComputationCompiler> param_cc_list; + final ComputationCompiler main_collection_cc, secondary_collection_cc; + + params = new ArrayList<Computation>(); + param_cc_list = new ArrayList<ComputationCompiler>(); + + lambda_cc = new ComputationCompiler(compiler); + + source.get_lambda_function().get_visited_by(lambda_cc); + + if (lambda_cc.has_init()) + { + result.add(lambda_cc.get_init()); + } + + main_collection_cc = new ComputationCompiler(compiler); + + source.get_main_collection().get_visited_by(main_collection_cc); + + if (main_collection_cc.has_init()) + { + result.add(main_collection_cc.get_init()); + } + + holder = + compiler.registers().reserve + ( + main_collection_cc.get_computation().get_type(), + result + ); + + result.add + ( + new SetValue + ( + holder.get_address(), + main_collection_cc.get_computation() + ) + ); + + result.add + ( + tonkadur.wyrd.v1.compiler.util.Clear.generate + ( + compiler.registers(), + compiler.assembler(), + main_collection_cc.get_address() + ) + ); + + secondary_collection_cc = new ComputationCompiler(compiler); + + source.get_secondary_collection().get_visited_by(secondary_collection_cc); + + if (secondary_collection_cc.has_init()) + { + result.add(secondary_collection_cc.get_init()); + } + + for + ( + final tonkadur.fate.v1.lang.meta.Computation p: + source.get_extra_parameters() + ) + { + final ComputationCompiler param_cc; + + param_cc = new ComputationCompiler(compiler); + + p.get_visited_by(param_cc); + + // Let's not re-compute the parameters on every iteration. + param_cc.generate_address(); + + if (param_cc.has_init()) + { + result.add(param_cc.get_init()); + } + + param_cc_list.add(param_cc); + + params.add(param_cc.get_computation()); + } + + result.add + ( + tonkadur.wyrd.v1.compiler.util.IndexedMergeLambda.generate + ( + compiler.registers(), + compiler.assembler(), + lambda_cc.get_computation(), + secondary_collection_cc.get_address(), + holder.get_address(), + main_collection_cc.get_address(), + ( + (tonkadur.fate.v1.lang.type.CollectionType) + source.get_main_collection().get_type() + ).is_set(), + params + ) + ); + + main_collection_cc.release_registers(result); + secondary_collection_cc.release_registers(result); + compiler.registers().release(holder, result); + + for (final ComputationCompiler cc: param_cc_list) + { + cc.release_registers(result); + } + } + + public void compile + ( + final tonkadur.fate.v1.lang.instruction.GenericInstruction instruction + ) + throws Throwable + { + final IndexedMerge source; + + source = (IndexedMerge) instruction; + + if (source.get_main_default() != null) + { + compile_indexed_merge_with_defaults(source); + } + else + { + compile_indexed_merge_without_defaults(source); + } + } +} diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/IndexedPartitionCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/IndexedPartitionCompiler.java new file mode 100644 index 0000000..ebe8eb2 --- /dev/null +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/IndexedPartitionCompiler.java @@ -0,0 +1,121 @@ +package tonkadur.wyrd.v1.compiler.fate.v1.instruction.generic; + +import java.util.List; +import java.util.ArrayList; + +import tonkadur.fate.v1.lang.instruction.generic.IndexedPartition; + +import tonkadur.wyrd.v1.compiler.fate.v1.Compiler; +import tonkadur.wyrd.v1.compiler.fate.v1.ComputationCompiler; + +import tonkadur.wyrd.v1.lang.meta.Computation; + +import tonkadur.wyrd.v1.compiler.fate.v1.instruction.GenericInstructionCompiler; + +public class IndexedPartitionCompiler extends GenericInstructionCompiler +{ + public static Class get_target_class () + { + return IndexedPartition.class; + } + + public IndexedPartitionCompiler (final Compiler compiler) + { + super(compiler); + } + + public void compile + ( + final tonkadur.fate.v1.lang.instruction.GenericInstruction instruction + ) + throws Throwable + { + final IndexedPartition source; + final List<Computation> params; + final List<ComputationCompiler> param_cc_list; + final ComputationCompiler lambda_cc, collection_in_cc, collection_out_cc; + + source = (IndexedPartition) instruction; + + params = new ArrayList<Computation>(); + param_cc_list = new ArrayList<ComputationCompiler>(); + + for + ( + final tonkadur.fate.v1.lang.meta.Computation p: + source.get_extra_parameters() + ) + { + final ComputationCompiler param_cc; + + param_cc = new ComputationCompiler(compiler); + + p.get_visited_by(param_cc); + + // Let's not re-compute the parameters on every iteration. + param_cc.generate_address(); + + if (param_cc.has_init()) + { + result.add(param_cc.get_init()); + } + + param_cc_list.add(param_cc); + + params.add(param_cc.get_computation()); + } + + lambda_cc = new ComputationCompiler(compiler); + + source.get_lambda_function().get_visited_by(lambda_cc); + + if (lambda_cc.has_init()) + { + result.add(lambda_cc.get_init()); + } + + collection_in_cc = new ComputationCompiler(compiler); + + source.get_collection_in().get_visited_by(collection_in_cc); + + if (collection_in_cc.has_init()) + { + result.add(collection_in_cc.get_init()); + } + + collection_out_cc = new ComputationCompiler(compiler); + + source.get_collection_out().get_visited_by(collection_out_cc); + + if (collection_out_cc.has_init()) + { + result.add(collection_out_cc.get_init()); + } + + result.add + ( + tonkadur.wyrd.v1.compiler.util.IndexedPartitionLambda.generate + ( + compiler.registers(), + compiler.assembler(), + lambda_cc.get_computation(), + collection_in_cc.get_address(), + collection_out_cc.get_address(), + ( + (tonkadur.fate.v1.lang.type.CollectionType) + source.get_collection_out().get_type() + ).is_set(), + params + ) + ); + + lambda_cc.release_registers(result); + collection_in_cc.release_registers(result); + collection_out_cc.release_registers(result); + + for (final ComputationCompiler cc: param_cc_list) + { + cc.release_registers(result); + } + } +} diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/MapCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/MapCompiler.java new file mode 100644 index 0000000..9e0f883 --- /dev/null +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/MapCompiler.java @@ -0,0 +1,140 @@ +package tonkadur.wyrd.v1.compiler.fate.v1.instruction.generic; + +import java.util.List; +import java.util.ArrayList; + +import tonkadur.fate.v1.lang.instruction.generic.Map; + +import tonkadur.wyrd.v1.compiler.fate.v1.Compiler; +import tonkadur.wyrd.v1.compiler.fate.v1.ComputationCompiler; + +import tonkadur.wyrd.v1.lang.Register; + +import tonkadur.wyrd.v1.lang.meta.Computation; + +import tonkadur.wyrd.v1.lang.instruction.SetValue; + +import tonkadur.wyrd.v1.compiler.fate.v1.instruction.GenericInstructionCompiler; + +public class MapCompiler extends GenericInstructionCompiler +{ + public static Class get_target_class () + { + return Map.class; + } + + public MapCompiler (final Compiler compiler) + { + super(compiler); + } + + public void compile + ( + final tonkadur.fate.v1.lang.instruction.GenericInstruction instruction + ) + throws Throwable + { + final Map source; + final List<Computation> params; + final List<ComputationCompiler> param_cc_list; + // This is one dangerous operation to do in-place, so we don't. + final Register holder; + final ComputationCompiler lambda_cc, collection_cc; + + source = (Map) instruction; + + params = new ArrayList<Computation>(); + param_cc_list = new ArrayList<ComputationCompiler>(); + + for + ( + final tonkadur.fate.v1.lang.meta.Computation p: + source.get_extra_parameters() + ) + { + final ComputationCompiler param_cc; + + param_cc = new ComputationCompiler(compiler); + + p.get_visited_by(param_cc); + + // Let's not re-compute the parameters on every iteration. + param_cc.generate_address(); + + if (param_cc.has_init()) + { + result.add(param_cc.get_init()); + } + + param_cc_list.add(param_cc); + + params.add(param_cc.get_computation()); + } + + lambda_cc = new ComputationCompiler(compiler); + + source.get_lambda_function().get_visited_by(lambda_cc); + + if (lambda_cc.has_init()) + { + result.add(lambda_cc.get_init()); + } + + collection_cc = new ComputationCompiler(compiler); + + source.get_collection().get_visited_by(collection_cc); + + if (collection_cc.has_init()) + { + result.add(collection_cc.get_init()); + } + + holder = + compiler.registers().reserve + ( + collection_cc.get_computation().get_type(), + result + ); + + result.add + ( + new SetValue(holder.get_address(), collection_cc.get_computation()) + ); + + result.add + ( + tonkadur.wyrd.v1.compiler.util.Clear.generate + ( + compiler.registers(), + compiler.assembler(), + collection_cc.get_address() + ) + ); + + result.add + ( + tonkadur.wyrd.v1.compiler.util.MapLambda.generate + ( + compiler.registers(), + compiler.assembler(), + lambda_cc.get_computation(), + holder.get_address(), + collection_cc.get_address(), + ( + (tonkadur.fate.v1.lang.type.CollectionType) + source.get_collection().get_type() + ).is_set(), + params + ) + ); + + lambda_cc.release_registers(result); + collection_cc.release_registers(result); + compiler.registers().release(holder, result); + + for (final ComputationCompiler cc: param_cc_list) + { + cc.release_registers(result); + } + } +} diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/MergeCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/MergeCompiler.java new file mode 100644 index 0000000..21c817e --- /dev/null +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/MergeCompiler.java @@ -0,0 +1,311 @@ +package tonkadur.wyrd.v1.compiler.fate.v1.instruction.generic; + +import java.util.List; +import java.util.ArrayList; + +import tonkadur.fate.v1.lang.instruction.generic.Merge; + +import tonkadur.wyrd.v1.compiler.fate.v1.Compiler; +import tonkadur.wyrd.v1.compiler.fate.v1.ComputationCompiler; + +import tonkadur.wyrd.v1.lang.Register; + +import tonkadur.wyrd.v1.lang.meta.Computation; + +import tonkadur.wyrd.v1.lang.instruction.SetValue; + +import tonkadur.wyrd.v1.compiler.fate.v1.instruction.GenericInstructionCompiler; + +public class MergeCompiler extends GenericInstructionCompiler +{ + public static Class get_target_class () + { + return Merge.class; + } + + public MergeCompiler (final Compiler compiler) + { + super(compiler); + } + + private void compile_merge_with_defaults (final Merge source) + throws Throwable + { + final Register holder; + final ComputationCompiler lambda_cc; + final ComputationCompiler main_default_cc, secondary_default_cc; + final List<Computation> params; + final List<ComputationCompiler> param_cc_list; + final ComputationCompiler main_collection_cc, secondary_collection_cc; + + params = new ArrayList<Computation>(); + param_cc_list = new ArrayList<ComputationCompiler>(); + + lambda_cc = new ComputationCompiler(compiler); + main_default_cc = new ComputationCompiler(compiler); + secondary_default_cc = new ComputationCompiler(compiler); + + source.get_lambda_function().get_visited_by(lambda_cc); + + if (lambda_cc.has_init()) + { + result.add(lambda_cc.get_init()); + } + + main_collection_cc = new ComputationCompiler(compiler); + + source.get_main_collection().get_visited_by(main_collection_cc); + + if (main_collection_cc.has_init()) + { + result.add(main_collection_cc.get_init()); + } + + source.get_main_default().get_visited_by(main_default_cc); + + main_default_cc.generate_address(); + + if (main_default_cc.has_init()) + { + result.add(main_default_cc.get_init()); + } + + source.get_secondary_default().get_visited_by(secondary_default_cc); + + secondary_default_cc.generate_address(); + + if (secondary_default_cc.has_init()) + { + result.add(secondary_default_cc.get_init()); + } + + holder = + compiler.registers().reserve + ( + main_collection_cc.get_computation().get_type(), + result + ); + + result.add + ( + new SetValue + ( + holder.get_address(), + main_collection_cc.get_computation() + ) + ); + + result.add + ( + tonkadur.wyrd.v1.compiler.util.Clear.generate + ( + compiler.registers(), + compiler.assembler(), + main_collection_cc.get_address() + ) + ); + + secondary_collection_cc = new ComputationCompiler(compiler); + + source.get_secondary_collection().get_visited_by(secondary_collection_cc); + + if (secondary_collection_cc.has_init()) + { + result.add(secondary_collection_cc.get_init()); + } + + for + ( + final tonkadur.fate.v1.lang.meta.Computation p: + source.get_extra_parameters() + ) + { + final ComputationCompiler param_cc; + + param_cc = new ComputationCompiler(compiler); + + p.get_visited_by(param_cc); + + // Let's not re-compute the parameters on every iteration. + param_cc.generate_address(); + + if (param_cc.has_init()) + { + result.add(param_cc.get_init()); + } + + param_cc_list.add(param_cc); + + params.add(param_cc.get_computation()); + } + + result.add + ( + tonkadur.wyrd.v1.compiler.util.MergeLambda.generate + ( + compiler.registers(), + compiler.assembler(), + lambda_cc.get_computation(), + secondary_default_cc.get_computation(), + secondary_collection_cc.get_address(), + main_default_cc.get_computation(), + holder.get_address(), + main_collection_cc.get_address(), + ( + (tonkadur.fate.v1.lang.type.CollectionType) + source.get_main_collection().get_type() + ).is_set(), + params + ) + ); + + main_collection_cc.release_registers(result); + secondary_collection_cc.release_registers(result); + main_default_cc.release_registers(result); + secondary_default_cc.release_registers(result); + compiler.registers().release(holder, result); + + for (final ComputationCompiler cc: param_cc_list) + { + cc.release_registers(result); + } + } + + private void compile_merge_without_defaults (final Merge source) + throws Throwable + { + final Register holder; + final ComputationCompiler lambda_cc; + final List<Computation> params; + final List<ComputationCompiler> param_cc_list; + final ComputationCompiler main_collection_cc, secondary_collection_cc; + + params = new ArrayList<Computation>(); + param_cc_list = new ArrayList<ComputationCompiler>(); + + lambda_cc = new ComputationCompiler(compiler); + + source.get_lambda_function().get_visited_by(lambda_cc); + + if (lambda_cc.has_init()) + { + result.add(lambda_cc.get_init()); + } + + main_collection_cc = new ComputationCompiler(compiler); + + source.get_main_collection().get_visited_by(main_collection_cc); + + if (main_collection_cc.has_init()) + { + result.add(main_collection_cc.get_init()); + } + + holder = + compiler.registers().reserve + ( + main_collection_cc.get_computation().get_type(), + result + ); + + result.add + ( + new SetValue + ( + holder.get_address(), + main_collection_cc.get_computation() + ) + ); + + result.add + ( + tonkadur.wyrd.v1.compiler.util.Clear.generate + ( + compiler.registers(), + compiler.assembler(), + main_collection_cc.get_address() + ) + ); + + secondary_collection_cc = new ComputationCompiler(compiler); + + source.get_secondary_collection().get_visited_by(secondary_collection_cc); + + if (secondary_collection_cc.has_init()) + { + result.add(secondary_collection_cc.get_init()); + } + + for + ( + final tonkadur.fate.v1.lang.meta.Computation p: + source.get_extra_parameters() + ) + { + final ComputationCompiler param_cc; + + param_cc = new ComputationCompiler(compiler); + + p.get_visited_by(param_cc); + + // Let's not re-compute the parameters on every iteration. + param_cc.generate_address(); + + if (param_cc.has_init()) + { + result.add(param_cc.get_init()); + } + + param_cc_list.add(param_cc); + + params.add(param_cc.get_computation()); + } + + result.add + ( + tonkadur.wyrd.v1.compiler.util.MergeLambda.generate + ( + compiler.registers(), + compiler.assembler(), + lambda_cc.get_computation(), + secondary_collection_cc.get_address(), + holder.get_address(), + main_collection_cc.get_address(), + ( + (tonkadur.fate.v1.lang.type.CollectionType) + source.get_main_collection().get_type() + ).is_set(), + params + ) + ); + + main_collection_cc.release_registers(result); + secondary_collection_cc.release_registers(result); + compiler.registers().release(holder, result); + + for (final ComputationCompiler cc: param_cc_list) + { + cc.release_registers(result); + } + } + + public void compile + ( + final tonkadur.fate.v1.lang.instruction.GenericInstruction instruction + ) + throws Throwable + { + final Merge source; + + source = (Merge) instruction; + + if (source.get_main_default() != null) + { + compile_merge_with_defaults(source); + } + else + { + compile_merge_without_defaults(source); + } + } +} diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/PartitionCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/PartitionCompiler.java new file mode 100644 index 0000000..602d89f --- /dev/null +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/PartitionCompiler.java @@ -0,0 +1,121 @@ +package tonkadur.wyrd.v1.compiler.fate.v1.instruction.generic; + +import java.util.List; +import java.util.ArrayList; + +import tonkadur.fate.v1.lang.instruction.generic.Partition; + +import tonkadur.wyrd.v1.compiler.fate.v1.Compiler; +import tonkadur.wyrd.v1.compiler.fate.v1.ComputationCompiler; + +import tonkadur.wyrd.v1.lang.meta.Computation; + +import tonkadur.wyrd.v1.compiler.fate.v1.instruction.GenericInstructionCompiler; + +public class PartitionCompiler extends GenericInstructionCompiler +{ + public static Class get_target_class () + { + return Partition.class; + } + + public PartitionCompiler (final Compiler compiler) + { + super(compiler); + } + + public void compile + ( + final tonkadur.fate.v1.lang.instruction.GenericInstruction instruction + ) + throws Throwable + { + final Partition source; + final List<Computation> params; + final List<ComputationCompiler> param_cc_list; + final ComputationCompiler lambda_cc, collection_in_cc, collection_out_cc; + + source = (Partition) instruction; + + params = new ArrayList<Computation>(); + param_cc_list = new ArrayList<ComputationCompiler>(); + + for + ( + final tonkadur.fate.v1.lang.meta.Computation p: + source.get_extra_parameters() + ) + { + final ComputationCompiler param_cc; + + param_cc = new ComputationCompiler(compiler); + + p.get_visited_by(param_cc); + + // Let's not re-compute the parameters on every iteration. + param_cc.generate_address(); + + if (param_cc.has_init()) + { + result.add(param_cc.get_init()); + } + + param_cc_list.add(param_cc); + + params.add(param_cc.get_computation()); + } + + lambda_cc = new ComputationCompiler(compiler); + + source.get_lambda_function().get_visited_by(lambda_cc); + + if (lambda_cc.has_init()) + { + result.add(lambda_cc.get_init()); + } + + collection_in_cc = new ComputationCompiler(compiler); + + source.get_collection_in().get_visited_by(collection_in_cc); + + if (collection_in_cc.has_init()) + { + result.add(collection_in_cc.get_init()); + } + + collection_out_cc = new ComputationCompiler(compiler); + + source.get_collection_out().get_visited_by(collection_out_cc); + + if (collection_out_cc.has_init()) + { + result.add(collection_out_cc.get_init()); + } + + result.add + ( + tonkadur.wyrd.v1.compiler.util.PartitionLambda.generate + ( + compiler.registers(), + compiler.assembler(), + lambda_cc.get_computation(), + collection_in_cc.get_address(), + collection_out_cc.get_address(), + ( + (tonkadur.fate.v1.lang.type.CollectionType) + source.get_collection_out().get_type() + ).is_set(), + params + ) + ); + + lambda_cc.release_registers(result); + collection_in_cc.release_registers(result); + collection_out_cc.release_registers(result); + + for (final ComputationCompiler cc: param_cc_list) + { + cc.release_registers(result); + } + } +} diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/PopElementCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/PopElementCompiler.java new file mode 100644 index 0000000..dbd4bee --- /dev/null +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/PopElementCompiler.java @@ -0,0 +1,67 @@ +package tonkadur.wyrd.v1.compiler.fate.v1.instruction.generic; + +import tonkadur.fate.v1.lang.instruction.generic.PopElement; + +import tonkadur.wyrd.v1.compiler.fate.v1.Compiler; +import tonkadur.wyrd.v1.compiler.fate.v1.ComputationCompiler; + +import tonkadur.wyrd.v1.lang.meta.Computation; + +import tonkadur.wyrd.v1.compiler.fate.v1.instruction.GenericInstructionCompiler; + +public class PopElementCompiler extends GenericInstructionCompiler +{ + public static Class get_target_class () + { + return PopElement.class; + } + + public PopElementCompiler (final Compiler compiler) + { + super(compiler); + } + + public void compile + ( + final tonkadur.fate.v1.lang.instruction.GenericInstruction instruction + ) + throws Throwable + { + final PopElement source; + final ComputationCompiler address_compiler, element_compiler; + + source = (PopElement) instruction; + + address_compiler = new ComputationCompiler(compiler); + element_compiler = new ComputationCompiler(compiler); + + source.get_collection().get_visited_by(address_compiler); + + if (address_compiler.has_init()) + { + result.add(address_compiler.get_init()); + } + + source.get_storage().get_visited_by(element_compiler); + + if (element_compiler.has_init()) + { + result.add(element_compiler.get_init()); + } + + result.add + ( + tonkadur.wyrd.v1.compiler.util.PopElement.generate + ( + compiler.registers(), + compiler.assembler(), + address_compiler.get_address(), + element_compiler.get_address(), + source.is_from_left() + ) + ); + + address_compiler.release_registers(result); + element_compiler.release_registers(result); + } +} diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/PushElementCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/PushElementCompiler.java new file mode 100644 index 0000000..d91699b --- /dev/null +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/PushElementCompiler.java @@ -0,0 +1,106 @@ +package tonkadur.wyrd.v1.compiler.fate.v1.instruction.generic; + +import tonkadur.fate.v1.lang.instruction.generic.PushElement; + +import tonkadur.wyrd.v1.compiler.fate.v1.Compiler; +import tonkadur.wyrd.v1.compiler.fate.v1.ComputationCompiler; + +import tonkadur.wyrd.v1.lang.meta.Computation; + +import tonkadur.wyrd.v1.lang.computation.Constant; +import tonkadur.wyrd.v1.lang.computation.Size; + +import tonkadur.wyrd.v1.lang.instruction.SetValue; + +import tonkadur.wyrd.v1.lang.Register; + +import tonkadur.wyrd.v1.lang.type.Type; + +import tonkadur.wyrd.v1.compiler.fate.v1.instruction.GenericInstructionCompiler; + +public class PushElementCompiler extends GenericInstructionCompiler +{ + public static Class get_target_class () + { + return PushElement.class; + } + + public PushElementCompiler (final Compiler compiler) + { + super(compiler); + } + + public void compile + ( + final tonkadur.fate.v1.lang.instruction.GenericInstruction instruction + ) + throws Throwable + { + final PushElement source; + final ComputationCompiler address_compiler, element_compiler; + final Register collection_size, index; + + source = (PushElement) instruction; + + address_compiler = new ComputationCompiler(compiler); + element_compiler = new ComputationCompiler(compiler); + + source.get_collection().get_visited_by(address_compiler); + + if (address_compiler.has_init()) + { + result.add(address_compiler.get_init()); + } + + source.get_element().get_visited_by(element_compiler); + + if (element_compiler.has_init()) + { + result.add(element_compiler.get_init()); + } + + collection_size = compiler.registers().reserve(Type.INT, result); + index = compiler.registers().reserve(Type.INT, result); + + result.add + ( + new SetValue + ( + collection_size.get_address(), + new Size(address_compiler.get_address()) + ) + ); + + result.add + ( + new SetValue + ( + index.get_address(), + ( + source.is_from_left() ? + Constant.ZERO + : collection_size.get_value() + ) + ) + ); + + result.add + ( + tonkadur.wyrd.v1.compiler.util.InsertAt.generate + ( + compiler.registers(), + compiler.assembler(), + index.get_address(), + element_compiler.get_computation(), + collection_size.get_value(), + address_compiler.get_address() + ) + ); + + address_compiler.release_registers(result); + element_compiler.release_registers(result); + + compiler.registers().release(collection_size, result); + compiler.registers().release(index, result); + } +} diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/RemoveAllOfElementCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/RemoveAllOfElementCompiler.java new file mode 100644 index 0000000..92c9e6e --- /dev/null +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/RemoveAllOfElementCompiler.java @@ -0,0 +1,180 @@ +package tonkadur.wyrd.v1.compiler.fate.v1.instruction.generic; + +import tonkadur.fate.v1.lang.instruction.generic.RemoveAllOfElement; + +import tonkadur.wyrd.v1.lang.Register; + +import tonkadur.wyrd.v1.lang.meta.Computation; + +import tonkadur.wyrd.v1.lang.instruction.SetValue; + +import tonkadur.wyrd.v1.lang.computation.Address; +import tonkadur.wyrd.v1.lang.computation.Size; +import tonkadur.wyrd.v1.lang.computation.ValueOf; + +import tonkadur.wyrd.v1.lang.type.Type; + +import tonkadur.wyrd.v1.compiler.fate.v1.Compiler; +import tonkadur.wyrd.v1.compiler.fate.v1.ComputationCompiler; + +import tonkadur.wyrd.v1.compiler.fate.v1.instruction.GenericInstructionCompiler; + +public class RemoveAllOfElementCompiler extends GenericInstructionCompiler +{ + public static Class get_target_class () + { + return RemoveAllOfElement.class; + } + + public RemoveAllOfElementCompiler (final Compiler compiler) + { + super(compiler); + } + + /* + * Fate: + * (remove_all_of element collection) + * + * Wyrd: + * (declare_variable <element_type> .elem) + * (declare_variable int .collection_size) + * + * (set .elem element) + * (set .collection_size (size collection)) + * + * <if collection is a list: + * <remove_all (var .elem) (var .collection_size) collection> + * > + * <if collection is a set: + * (declare_variable bool .found) + * (declare_variable int .index) + * + * <binary_search + * (var .elem) + * (var .collection_size) + * collection + * .found + * .index + * > + * (ifelse (var .found) + * <remove_at (var .index) (var .collection_size) collection> + * (nop) + * ) + * > + */ + public void compile + ( + final tonkadur.fate.v1.lang.instruction.GenericInstruction instruction + ) + throws Throwable + { + final RemoveAllOfElement source; + final ComputationCompiler elem_cc, collection_cc; + final Register collection_size; + final Address elem, collection; + + source = (RemoveAllOfElement) instruction; + + elem_cc = new ComputationCompiler(compiler); + collection_cc = new ComputationCompiler(compiler); + + collection_size = compiler.registers().reserve(Type.INT, result); + + source.get_element().get_visited_by(elem_cc); + source.get_collection().get_visited_by(collection_cc); + + elem_cc.generate_address(); + + if (elem_cc.has_init()) + { + result.add(elem_cc.get_init()); + } + + if (collection_cc.has_init()) + { + result.add(collection_cc.get_init()); + } + + collection = collection_cc.get_address(); + elem = elem_cc.get_address(); + + result.add + ( + new SetValue(collection_size.get_address(), new Size(collection)) + ); + + if + ( + ( + (tonkadur.fate.v1.lang.type.CollectionType) + source.get_collection().get_type() + ).is_set() + ) + { + final Computation value_of_elem; + final Register index, found; + + index = compiler.registers().reserve(Type.INT, result); + found = compiler.registers().reserve(Type.BOOL, result); + + value_of_elem = new ValueOf(elem); + + result.add + ( + tonkadur.wyrd.v1.compiler.util.BinarySearch.generate + ( + compiler.registers(), + compiler.assembler(), + new ValueOf(elem), + collection_size.get_value(), + collection, + found.get_address(), + index.get_address() + ) + ); + + elem_cc.release_registers(result); + + result.add + ( + tonkadur.wyrd.v1.compiler.util.If.generate + ( + compiler.registers(), + compiler.assembler(), + found.get_value(), + tonkadur.wyrd.v1.compiler.util.RemoveAt.generate + ( + compiler.registers(), + compiler.assembler(), + index.get_address(), + collection_size.get_value(), + collection + ) + ) + ); + + compiler.registers().release(index, result); + compiler.registers().release(found, result); + } + else + { + result.add + ( + tonkadur.wyrd.v1.compiler.util.RemoveAllOf.generate + ( + compiler.registers(), + compiler.assembler(), + new ValueOf(elem), + collection_size.get_value(), + collection + ) + ); + + elem_cc.release_registers(result); + } + + collection_cc.release_registers(result); + + compiler.registers().release(collection_size, result); + } +} diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/RemoveElementAtCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/RemoveElementAtCompiler.java new file mode 100644 index 0000000..48b0cd3 --- /dev/null +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/RemoveElementAtCompiler.java @@ -0,0 +1,88 @@ +package tonkadur.wyrd.v1.compiler.fate.v1.instruction.generic; + +import tonkadur.fate.v1.lang.instruction.generic.RemoveElementAt; + +import tonkadur.wyrd.v1.lang.Register; + +import tonkadur.wyrd.v1.lang.computation.Address; +import tonkadur.wyrd.v1.lang.computation.Size; + +import tonkadur.wyrd.v1.lang.instruction.SetValue; + +import tonkadur.wyrd.v1.lang.type.Type; + +import tonkadur.wyrd.v1.compiler.fate.v1.Compiler; +import tonkadur.wyrd.v1.compiler.fate.v1.ComputationCompiler; + +import tonkadur.wyrd.v1.compiler.fate.v1.instruction.GenericInstructionCompiler; + +public class RemoveElementAtCompiler extends GenericInstructionCompiler +{ + public static Class get_target_class () + { + return RemoveElementAt.class; + } + + public RemoveElementAtCompiler (final Compiler compiler) + { + super(compiler); + } + + public void compile + ( + final tonkadur.fate.v1.lang.instruction.GenericInstruction instruction + ) + throws Throwable + { + final RemoveElementAt source; + final ComputationCompiler index_cc, collection_cc; + final Address collection; + final Register collection_size; + + source = (RemoveElementAt) instruction; + + index_cc = new ComputationCompiler(compiler); + collection_cc = new ComputationCompiler(compiler); + + collection_size = compiler.registers().reserve(Type.INT, result); + + source.get_index().get_visited_by(index_cc); + source.get_collection().get_visited_by(collection_cc); + + index_cc.generate_address(); + + if (index_cc.has_init()) + { + result.add(index_cc.get_init()); + } + + if (collection_cc.has_init()) + { + result.add(collection_cc.get_init()); + } + + collection = collection_cc.get_address(); + + result.add + ( + new SetValue(collection_size.get_address(), new Size(collection)) + ); + + result.add + ( + tonkadur.wyrd.v1.compiler.util.RemoveAt.generate + ( + compiler.registers(), + compiler.assembler(), + index_cc.get_address(), + collection_size.get_value(), + collection + ) + ); + + compiler.registers().release(collection_size, result); + + index_cc.release_registers(result); + collection_cc.release_registers(result); + } +} diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/RemoveElementCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/RemoveElementCompiler.java new file mode 100644 index 0000000..056a720 --- /dev/null +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/RemoveElementCompiler.java @@ -0,0 +1,106 @@ +package tonkadur.wyrd.v1.compiler.fate.v1.instruction.generic; + +import tonkadur.fate.v1.lang.instruction.generic.RemoveElement; + +import tonkadur.wyrd.v1.compiler.fate.v1.Compiler; +import tonkadur.wyrd.v1.compiler.fate.v1.ComputationCompiler; + +import tonkadur.wyrd.v1.compiler.fate.v1.instruction.GenericInstructionCompiler; + +public class RemoveElementCompiler extends GenericInstructionCompiler +{ + public static Class get_target_class () + { + return RemoveElement.class; + } + + public RemoveElementCompiler (final Compiler compiler) + { + super(compiler); + } + + /* + * Fate: + * (remove_element element collection) + * + * Wyrd: + * (declare_variable <element_type> .elem) + * (declare_variable int .collection_size) + * (declare_variable boolean .found) + * (declare_variable int .index) + * + * (set .elem element) + * (set .collection_size (size collection)) + * + * <if collection is a set: + * <BinarySearch + * (var .elem) + * (var .collection_size) + * collection + * .found + * .index + * > + * > + * <if collection is a list: + * <IterativeSearch + * (var .elem) + * (var .collection_size) + * collection + * .found + * .index + * > + * > + * + * (if (var .found) + * <remove_at (var index) (var .collection_size) collection> + * (nop) + * ) + */ + public void compile + ( + final tonkadur.fate.v1.lang.instruction.GenericInstruction instruction + ) + throws Throwable + { + final RemoveElement source; + final ComputationCompiler elem_cc, collection_cc; + + source = (RemoveElement) instruction; + + elem_cc = new ComputationCompiler(compiler); + collection_cc = new ComputationCompiler(compiler); + + source.get_element().get_visited_by(elem_cc); + source.get_collection().get_visited_by(collection_cc); + + elem_cc.generate_address(); + + if (elem_cc.has_init()) + { + result.add(elem_cc.get_init()); + } + + if (collection_cc.has_init()) + { + result.add(collection_cc.get_init()); + } + + result.add + ( + tonkadur.wyrd.v1.compiler.util.RemoveOneOf.generate + ( + compiler.registers(), + compiler.assembler(), + elem_cc.get_computation(), + collection_cc.get_address(), + ( + (tonkadur.fate.v1.lang.type.CollectionType) + source.get_collection().get_type() + ).is_set() + ) + ); + + elem_cc.release_registers(result); + collection_cc.release_registers(result); + } +} diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/RemoveElementsOfCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/RemoveElementsOfCompiler.java new file mode 100644 index 0000000..6a5fbe1 --- /dev/null +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/RemoveElementsOfCompiler.java @@ -0,0 +1,69 @@ +package tonkadur.wyrd.v1.compiler.fate.v1.instruction.generic; + +import tonkadur.fate.v1.lang.instruction.generic.RemoveElementsOf; + +import tonkadur.wyrd.v1.compiler.fate.v1.Compiler; +import tonkadur.wyrd.v1.compiler.fate.v1.ComputationCompiler; + +import tonkadur.wyrd.v1.compiler.fate.v1.instruction.GenericInstructionCompiler; + +public class RemoveElementsOfCompiler extends GenericInstructionCompiler +{ + public static Class get_target_class () + { + return RemoveElementsOf.class; + } + + public RemoveElementsOfCompiler (final Compiler compiler) + { + super(compiler); + } + + public void compile + ( + final tonkadur.fate.v1.lang.instruction.GenericInstruction instruction + ) + throws Throwable + { + final RemoveElementsOf source; + final ComputationCompiler collection_in_cc, collection_cc; + + source = (RemoveElementsOf) instruction; + + collection_cc = new ComputationCompiler(compiler); + + source.get_target_collection().get_visited_by(collection_cc); + + if (collection_cc.has_init()) + { + result.add(collection_cc.get_init()); + } + + collection_in_cc = new ComputationCompiler(compiler); + + source.get_source_collection().get_visited_by(collection_in_cc); + + if (collection_in_cc.has_init()) + { + result.add(collection_in_cc.get_init()); + } + + result.add + ( + tonkadur.wyrd.v1.compiler.util.RemoveElementsOf.generate + ( + compiler.registers(), + compiler.assembler(), + collection_in_cc.get_address(), + collection_cc.get_address(), + ( + (tonkadur.fate.v1.lang.type.CollectionType) + source.get_target_collection().get_type() + ).is_set() + ) + ); + + collection_cc.release_registers(result); + collection_in_cc.release_registers(result); + } +} diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/ReverseListCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/ReverseListCompiler.java new file mode 100644 index 0000000..6cc2856 --- /dev/null +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/ReverseListCompiler.java @@ -0,0 +1,61 @@ +package tonkadur.wyrd.v1.compiler.fate.v1.instruction.generic; + +import tonkadur.fate.v1.lang.instruction.generic.ReverseList; + +import tonkadur.wyrd.v1.lang.computation.Size; +import tonkadur.wyrd.v1.lang.computation.Address; + +import tonkadur.wyrd.v1.compiler.fate.v1.Compiler; +import tonkadur.wyrd.v1.compiler.fate.v1.ComputationCompiler; + +import tonkadur.wyrd.v1.compiler.fate.v1.instruction.GenericInstructionCompiler; + +public class ReverseListCompiler extends GenericInstructionCompiler +{ + public static Class get_target_class () + { + return ReverseList.class; + } + + public ReverseListCompiler (final Compiler compiler) + { + super(compiler); + } + + public void compile + ( + final tonkadur.fate.v1.lang.instruction.GenericInstruction instruction + ) + throws Throwable + { + final ReverseList source; + final ComputationCompiler address_compiler; + final Address collection_address; + + source = (ReverseList) instruction; + + address_compiler = new ComputationCompiler(compiler); + + source.get_collection().get_visited_by(address_compiler); + + if (address_compiler.has_init()) + { + result.add(address_compiler.get_init()); + } + + collection_address = address_compiler.get_address(); + + result.add + ( + tonkadur.wyrd.v1.compiler.util.ReverseList.generate + ( + compiler.registers(), + compiler.assembler(), + new Size(collection_address), + collection_address + ) + ); + + address_compiler.release_registers(result); + } +} |


