summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2020-09-07 00:02:29 +0200
committerNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2020-09-07 00:02:29 +0200
commit07c0f271e1f30fdc87da9ef122781c83ff410f64 (patch)
treed2d256f432e0609b2c768f6c90e832e23942e909
parent55b0873d35189e6e6f1f36670b9687bfc227da25 (diff)
Adds 'Initialize' Wyrd instruction.
The 'SetValue' Wyrd instruction is no longer allowed to write to a non-existing memory element.
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/Compiler.java35
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java29
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/SequenceCompiler.java31
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/FunctionContext.java0
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/InsertAt.java21
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterContext.java34
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterManager.java68
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/registers/StackableRegisterContext.java32
-rw-r--r--src/core/src/tonkadur/wyrd/v1/lang/instruction/Initialize.java61
-rw-r--r--src/core/src/tonkadur/wyrd/v1/lang/meta/InstructionVisitor.java3
-rw-r--r--src/json-export/src/tonkadur/jsonexport/InstructionCompiler.java16
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
{