| summaryrefslogtreecommitdiff | 
diff options
| author | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2020-09-07 00:02:29 +0200 | 
|---|---|---|
| committer | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2020-09-07 00:02:29 +0200 | 
| commit | 07c0f271e1f30fdc87da9ef122781c83ff410f64 (patch) | |
| tree | d2d256f432e0609b2c768f6c90e832e23942e909 /src/core | |
| parent | 55b0873d35189e6e6f1f36670b9687bfc227da25 (diff) | |
Adds 'Initialize' Wyrd instruction.
The 'SetValue' Wyrd instruction is no longer allowed to write to a
non-existing memory element.
Diffstat (limited to 'src/core')
10 files changed, 277 insertions, 37 deletions
| diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/Compiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/Compiler.java index 4fbe4fe..3b57ff3 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/Compiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/Compiler.java @@ -1,9 +1,15 @@  package tonkadur.wyrd.v1.compiler.fate.v1; +import java.util.List; +import java.util.ArrayList; +  import tonkadur.wyrd.v1.compiler.util.registers.RegisterManager;  import tonkadur.wyrd.v1.compiler.util.InstructionManager;  import tonkadur.wyrd.v1.lang.type.DictType; +import tonkadur.wyrd.v1.lang.type.Type; + +import tonkadur.wyrd.v1.lang.meta.Instruction;  import tonkadur.wyrd.v1.lang.Register;  import tonkadur.wyrd.v1.lang.World; @@ -26,14 +32,20 @@ public class Compiler        compiler = new Compiler(wyrd_world); +      compiler.assembler().handle_adding_instruction +      ( +         compiler.assembler().merge(compiler.registers().pop_initializes()), +         wyrd_world +      ); +        compiler.compile_extensions(fate_world);        compiler.compile_types(fate_world);        compiler.compile_variables(fate_world); -      compiler.compile_main_sequence(fate_world); -        compiler.compile_sequences(fate_world); +      compiler.compile_main_sequence(fate_world); +        compiler.add_registers();        return compiler.wyrd_world; @@ -80,23 +92,30 @@ public class Compiler     )     throws Throwable     { +      final List<Instruction> init_instr; + +      init_instr = new ArrayList<Instruction>(); +        for        (           final tonkadur.fate.v1.lang.Variable variable:              fate_world.variables().get_all()        )        { +         final Type t;           final Register r; -         r = -            registers.register -            ( -               TypeCompiler.compile(this, variable.get_type()), -               variable.get_name() -            ); +         t = TypeCompiler.compile(this, variable.get_type()); +         r = registers.register(t, variable.get_name());           r.set_is_in_use(true);        } + +      this.assembler().handle_adding_instruction +      ( +         this.assembler().merge(init_instr), +         this.world() +      );     }     protected void compile_sequences 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 55ff4a2..67a7e0d 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 @@ -33,9 +33,10 @@ import tonkadur.wyrd.v1.lang.instruction.Assert;  import tonkadur.wyrd.v1.lang.instruction.Display;  import tonkadur.wyrd.v1.lang.instruction.End;  import tonkadur.wyrd.v1.lang.instruction.EventCall; -import tonkadur.wyrd.v1.lang.instruction.Remove; -import tonkadur.wyrd.v1.lang.instruction.PromptString; +import tonkadur.wyrd.v1.lang.instruction.Initialize;  import tonkadur.wyrd.v1.lang.instruction.PromptInteger; +import tonkadur.wyrd.v1.lang.instruction.PromptString; +import tonkadur.wyrd.v1.lang.instruction.Remove;  import tonkadur.wyrd.v1.lang.instruction.ResolveChoices;  import tonkadur.wyrd.v1.lang.instruction.SetPC;  import tonkadur.wyrd.v1.lang.instruction.SetValue; @@ -210,7 +211,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor        result.add        ( -         new SetValue +         new Initialize           (              new RelativeAddress              ( @@ -222,6 +223,28 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor                 ),                 element_compiler.get_computation().get_type()              ), +            element_compiler.get_computation().get_type() +         ) +      ); + +      result.add +      ( +         new SetValue +         ( +            new RelativeAddress +            ( +               collection_as_address, +               new Cast +               ( +                  Operation.minus +                  ( +                     new Size(collection_as_address), +                     Constant.ONE +                  ), +                  Type.STRING +               ), +               element_compiler.get_computation().get_type() +            ),              element_compiler.get_computation()           )        ); diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/SequenceCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/SequenceCompiler.java index cf23045..16f7ec0 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/SequenceCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/SequenceCompiler.java @@ -9,6 +9,7 @@ import tonkadur.wyrd.v1.lang.World;  import tonkadur.wyrd.v1.lang.Register;  import tonkadur.wyrd.v1.lang.instruction.SetValue; +import tonkadur.wyrd.v1.lang.instruction.SetPC;  import tonkadur.wyrd.v1.lang.computation.Constant;  public class SequenceCompiler @@ -26,6 +27,7 @@ public class SequenceCompiler        final List<Instruction> init_instructions;        final List<Register> parameters;        final List<Register> to_be_cleaned; +      final String end_of_sequence;        final InstructionCompiler ic;        init_instructions = new ArrayList<Instruction>(); @@ -33,6 +35,7 @@ public class SequenceCompiler        to_be_cleaned = new ArrayList<Register>();        ic = new InstructionCompiler(compiler); +      end_of_sequence = compiler.assembler().generate_label("<sequence#end>");        compiler.world().add_sequence_label        ( @@ -42,7 +45,15 @@ public class SequenceCompiler        compiler.assembler().add_fixed_name_label(fate_sequence.get_name()); -      compiler.registers().create_stackable_context(fate_sequence.get_name()); +      compiler.registers().create_stackable_context +      ( +         fate_sequence.get_name() +      ); + +      init_instructions.add +      ( +         new SetPC(compiler.assembler().get_label_constant(end_of_sequence)) +      );        init_instructions.add        ( @@ -109,7 +120,17 @@ public class SequenceCompiler        compiler.assembler().handle_adding_instruction        ( -         compiler.assembler().merge(init_instructions), +         compiler.assembler().merge(compiler.registers().pop_initializes()), +         compiler.world() +      ); + +      compiler.assembler().handle_adding_instruction +      ( +         compiler.assembler().mark_after +         ( +            compiler.assembler().merge(init_instructions), +            end_of_sequence +         ),           compiler.world()        );     } @@ -146,6 +167,12 @@ public class SequenceCompiler        compiler.assembler().handle_adding_instruction        ( +         compiler.assembler().merge(compiler.registers().pop_initializes()), +         compiler.world() +      ); + +      compiler.assembler().handle_adding_instruction +      (           ic.get_result(),           compiler.world()        ); diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/FunctionContext.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/FunctionContext.java deleted file mode 100644 index e69de29..0000000 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/FunctionContext.java +++ /dev/null diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/InsertAt.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/InsertAt.java index 7894330..12e4658 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/InsertAt.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/InsertAt.java @@ -19,6 +19,7 @@ import tonkadur.wyrd.v1.lang.computation.RelativeAddress;  import tonkadur.wyrd.v1.lang.computation.ValueOf;  import tonkadur.wyrd.v1.lang.instruction.SetValue; +import tonkadur.wyrd.v1.lang.instruction.Initialize;  import tonkadur.wyrd.v1.compiler.util.registers.RegisterManager; @@ -73,9 +74,29 @@ public class InsertAt        value_of_index = new ValueOf(index); +        /* (set .end collection_size) */        result.add(new SetValue(end.get_address(), collection_size)); +      /* +       * Increasing the size of the list by one. +       * This *does* increase the value of collection_size, so don't do it +       * before setting .end. +       */ +      result.add +      ( +         new Initialize +         ( +            new RelativeAddress +            ( +               collection, +               new Cast(collection_size, Type.STRING), +               element_type +            ), +            element_type +         ) +      ); +        /* (set .prev (- (val .end) 1)) */        while_body.add        ( diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterContext.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterContext.java index 1baabb7..c0d70a3 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterContext.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterContext.java @@ -14,6 +14,8 @@ import tonkadur.wyrd.v1.lang.Register;  import tonkadur.wyrd.v1.lang.type.Type; +import tonkadur.wyrd.v1.lang.instruction.Initialize; +  class RegisterContext  {     protected static final String default_name_prefix = ".anon."; @@ -61,7 +63,11 @@ class RegisterContext        return register_by_name.values();     } -   public Register reserve (final Type t) +   public Register reserve +   ( +      final Type t, +      final List<Instruction> initialize_holder +   )     {        final String name;        final Register result; @@ -88,7 +94,7 @@ class RegisterContext        name = (name_prefix + Integer.toString(generated_registers++)); -      result = create_register(t, name); +      result = create_register(t, name, initialize_holder);        result.set_is_in_use(true); @@ -99,11 +105,16 @@ class RegisterContext        return result;     } -   public Register reserve (final Type t, final String name) +   public Register reserve +   ( +      final Type t, +      final String name, +      final List<Instruction> initialize_holder +   )     {        final Register result; -      result = create_register(t, name); +      result = create_register(t, name, initialize_holder);        if (register_by_name.get(name) != null)        { @@ -191,9 +202,20 @@ class RegisterContext        r.set_is_in_use(false);     } -   protected Register create_register (final Type t, final String name) +   protected Register create_register +   ( +      final Type t, +      final String name, +      final List<Instruction> initialize_holder +   )     { -      return new Register(t, name); +      final Register result; + +      result = new Register(t, name); + +      initialize_holder.add(new Initialize(result.get_address(), t)); + +      return result;     }     public List<Instruction> get_finalize_instructions () diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterManager.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterManager.java index 653fcbe..07ea1ac 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterManager.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterManager.java @@ -23,9 +23,10 @@ import tonkadur.wyrd.v1.lang.computation.Cast;  import tonkadur.wyrd.v1.lang.computation.ValueOf;  import tonkadur.wyrd.v1.lang.computation.Size; -import tonkadur.wyrd.v1.lang.instruction.SetValue; -import tonkadur.wyrd.v1.lang.instruction.SetPC; +import tonkadur.wyrd.v1.lang.instruction.Initialize;  import tonkadur.wyrd.v1.lang.instruction.Remove; +import tonkadur.wyrd.v1.lang.instruction.SetPC; +import tonkadur.wyrd.v1.lang.instruction.SetValue;  import tonkadur.wyrd.v1.lang.type.Type;  import tonkadur.wyrd.v1.lang.type.MapType; @@ -39,19 +40,22 @@ public class RegisterManager     protected final RegisterContext base_context, parameter_context;     protected final Register next_pc, pc_stack;     protected final Register choice_number, rand_mode, rand_value; +   protected List<Instruction> awaiting_inits;     protected int created_contexts;     public RegisterManager ()     { +      awaiting_inits = new ArrayList<Instruction>();        base_context = new RegisterContext("base context");        parameter_context = new RegisterContext("parameter context", ".param."); -      next_pc = base_context.reserve(Type.INT); -      pc_stack = base_context.reserve(new MapType(Type.INT)); +      next_pc = base_context.reserve(Type.INT, awaiting_inits); +      pc_stack = base_context.reserve(new MapType(Type.INT), awaiting_inits); -      choice_number = base_context.reserve(Type.INT); -      rand_mode = base_context.reserve(Type.INT); -      rand_value = base_context.reserve(new MapType(Type.INT)); +      choice_number = base_context.reserve(Type.INT, awaiting_inits); +      rand_mode = base_context.reserve(Type.INT, awaiting_inits); +      rand_value = +         base_context.reserve(new MapType(Type.INT), awaiting_inits);        context_by_name = new HashMap<String, StackableRegisterContext>();        context = new ArrayDeque<RegisterContext>(); @@ -62,7 +66,7 @@ public class RegisterManager     public Register reserve (final Type t)     { -      return context.peekFirst().reserve(t); +      return context.peekFirst().reserve(t, awaiting_inits);     }     public void release (final Register r) @@ -94,7 +98,13 @@ public class RegisterManager     {        final StackableRegisterContext result; -      result = new StackableRegisterContext(base_context, context_name); +      result = +         new StackableRegisterContext +         ( +            base_context, +            context_name, +            awaiting_inits +         );        if (context_by_name.containsKey(context_name))        { @@ -130,7 +140,7 @@ public class RegisterManager     public Register register (final Type t, final String name)     { -      return context.peekFirst().reserve(t, name); +      return context.peekFirst().reserve(t, name, awaiting_inits);     }     public void bind (final String name, final Register register) @@ -169,7 +179,7 @@ public class RegisterManager        result.add        ( -         new SetValue +         new Initialize           (              new RelativeAddress              ( @@ -177,6 +187,27 @@ public class RegisterManager                 new Cast(new Size(pc_stack.get_address()), Type.STRING),                 Type.INT              ), +            Type.INT +         ) +      ); + +      result.add +      ( +         new SetValue +         ( +            new RelativeAddress +            ( +               pc_stack.get_address(), +               new Cast +               ( +                  Operation.minus +                  ( +                     new Size(pc_stack.get_address()), +                     Constant.ONE +                  ), Type.STRING +               ), +               Type.INT +            ),              leave_to           )        ); @@ -294,7 +325,7 @@ public class RegisterManager        {           final Register r; -         r = parameter_context.reserve(p.get_type()); +         r = parameter_context.reserve(p.get_type(), awaiting_inits);           result.add(new SetValue(r.get_address(), p)); @@ -322,7 +353,7 @@ public class RegisterManager        {           final Register r; -         r = parameter_context.reserve(p.get_type()); +         r = parameter_context.reserve(p.get_type(), awaiting_inits);           result.add(new SetValue(p.get_address(), r.get_value())); @@ -337,4 +368,15 @@ public class RegisterManager        return result;     } + +   public List<Instruction> pop_initializes () +   { +      final List<Instruction> result; + +      result = awaiting_inits; + +      awaiting_inits = new ArrayList<Instruction>(); + +      return result; +   }  } diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/StackableRegisterContext.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/StackableRegisterContext.java index 973806a..8731d8c 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/StackableRegisterContext.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/StackableRegisterContext.java @@ -23,6 +23,7 @@ import tonkadur.wyrd.v1.lang.computation.ValueOf;  import tonkadur.wyrd.v1.lang.instruction.SetValue;  import tonkadur.wyrd.v1.lang.instruction.Remove; +import tonkadur.wyrd.v1.lang.instruction.Initialize;  import tonkadur.wyrd.v1.lang.type.Type;  import tonkadur.wyrd.v1.lang.type.PointerType; @@ -43,7 +44,8 @@ class StackableRegisterContext extends RegisterContext     public StackableRegisterContext     (        final RegisterContext base_context, -      final String context_name +      final String context_name, +      final List<Instruction> initialize_holder     )     {        super(context_name); @@ -54,11 +56,12 @@ class StackableRegisterContext extends RegisterContext        context_structure = new DictType(context_name, context_structure_fields); -      context_stack_level = base_context.reserve(Type.INT); +      context_stack_level = base_context.reserve(Type.INT, initialize_holder);        context_stacks =           base_context.reserve           ( -            new MapType(new PointerType(context_structure)) +            new MapType(new PointerType(context_structure)), +            initialize_holder           );        current_context_address_holder = @@ -78,7 +81,12 @@ class StackableRegisterContext extends RegisterContext     }     @Override -   protected Register create_register (final Type t, final String name) +   protected Register create_register +   ( +      final Type t, +      final String name, +      final List<Instruction> initialize_holder +   )     {        final Register result; @@ -96,7 +104,7 @@ class StackableRegisterContext extends RegisterContext        context_structure.get_fields().put(name, t); -      return +      result =           new Register           (              new RelativeAddress @@ -108,6 +116,11 @@ class StackableRegisterContext extends RegisterContext              t,              name           ); + +      /* No need for this: it's part of the type. */ +      //initialize_holder.add(new Initialize(result.get_address(), t)); + +      return result;     }     public List<Instruction> get_initialize_instructions () @@ -127,6 +140,15 @@ class StackableRegisterContext extends RegisterContext        result.add        ( +         new Initialize +         ( +            current_context_address_holder, +            new PointerType(context_structure) +         ) +      ); + +      result.add +      (           new SetValue           (              current_context_address_holder, diff --git a/src/core/src/tonkadur/wyrd/v1/lang/instruction/Initialize.java b/src/core/src/tonkadur/wyrd/v1/lang/instruction/Initialize.java new file mode 100644 index 0000000..04a039e --- /dev/null +++ b/src/core/src/tonkadur/wyrd/v1/lang/instruction/Initialize.java @@ -0,0 +1,61 @@ +package tonkadur.wyrd.v1.lang.instruction; + +import tonkadur.wyrd.v1.lang.computation.Address; + +import tonkadur.wyrd.v1.lang.type.Type; +import tonkadur.wyrd.v1.lang.meta.Instruction; +import tonkadur.wyrd.v1.lang.meta.InstructionVisitor; + +public class Initialize extends Instruction +{ +   /***************************************************************************/ +   /**** MEMBERS **************************************************************/ +   /***************************************************************************/ +   protected final Address address; +   protected final Type type; + +   /***************************************************************************/ +   /**** PUBLIC ***************************************************************/ +   /***************************************************************************/ +   /**** Constructors *********************************************************/ +   public Initialize (final Address address, final Type type) +   { +      this.address = address; +      this.type = type; +   } + +   /**** Accessors ************************************************************/ +   public Address get_address () +   { +      return address; +   } + +   public Type get_type () +   { +      return type; +   } + +   @Override +   public void get_visited_by (final InstructionVisitor iv) +   throws Throwable +   { +      iv.visit_initialize(this); +   } + +   /**** Misc. ****************************************************************/ +   @Override +   public String toString () +   { +      final StringBuilder sb; + +      sb = new StringBuilder(); + +      sb.append("(Initialize "); +      sb.append(address.toString()); +      sb.append(" "); +      sb.append(type.toString()); +      sb.append(")"); + +      return sb.toString(); +   } +} diff --git a/src/core/src/tonkadur/wyrd/v1/lang/meta/InstructionVisitor.java b/src/core/src/tonkadur/wyrd/v1/lang/meta/InstructionVisitor.java index 63ca737..72a4cd4 100644 --- a/src/core/src/tonkadur/wyrd/v1/lang/meta/InstructionVisitor.java +++ b/src/core/src/tonkadur/wyrd/v1/lang/meta/InstructionVisitor.java @@ -36,4 +36,7 @@ public interface InstructionVisitor     public void visit_set_value (final SetValue n)     throws Throwable; + +   public void visit_initialize (final Initialize n) +   throws Throwable;  } | 


