| 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 | |
| parent | 55b0873d35189e6e6f1f36670b9687bfc227da25 (diff) | |
Adds 'Initialize' Wyrd instruction.
The 'SetValue' Wyrd instruction is no longer allowed to write to a
non-existing memory element.
11 files changed, 293 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; } diff --git a/src/json-export/src/tonkadur/jsonexport/InstructionCompiler.java b/src/json-export/src/tonkadur/jsonexport/InstructionCompiler.java index 01b8e76..22c2fca 100644 --- a/src/json-export/src/tonkadur/jsonexport/InstructionCompiler.java +++ b/src/json-export/src/tonkadur/jsonexport/InstructionCompiler.java @@ -149,6 +149,22 @@ public class InstructionCompiler implements InstructionVisitor result.put("value", val_cc.get_result()); } + public void visit_initialize (final Initialize n) + throws Throwable + { + final ComputationCompiler ref_cc; + + ref_cc = new ComputationCompiler(); + + n.get_address().get_visited_by(ref_cc); + + result = new JSONObject(); + + result.put("category", "initialize"); + result.put("reference", ref_cc.get_result()); + result.put("type", Translator.compile_type(n.get_type())); + } + public void visit_prompt_integer (final PromptInteger n) throws Throwable { |


