summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2020-08-14 00:47:50 +0200
committerNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2020-08-14 00:47:50 +0200
commitb35105f81f862100c274cd5899cb53244168560f (patch)
treec12aa66984c56047bdd149a45332744c52cbe433
parent41c53b856944146e5cd1d1713ba11b931790978a (diff)
...
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/Compiler.java10
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java12
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java14
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/MacroManager.java92
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/TypeCompiler.java8
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterContext.java25
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterManager.java33
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/registers/StackableRegisterContext.java32
-rw-r--r--src/core/src/tonkadur/wyrd/v1/lang/Register.java19
9 files changed, 86 insertions, 159 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 c88b8be..5c64cd5 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,8 +1,10 @@
package tonkadur.wyrd.v1.compiler.fate.v1;
-import tonkadur.wyrd.v1.compiler.util.RegisterManager;
+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.Register;
import tonkadur.wyrd.v1.lang.World;
@@ -41,7 +43,6 @@ public class Compiler
{
this.wyrd_world = wyrd_world;
- macro_manager = new MacroManager();
registers = new RegisterManager();
assembler = new InstructionManager();
}
@@ -146,9 +147,4 @@ public class Compiler
{
return assembler;
}
-
- public MacroManager macros ()
- {
- return macro_manager;
- }
}
diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java
index ac24ae7..7d92f21 100644
--- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java
+++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java
@@ -1,9 +1,10 @@
package tonkadur.wyrd.v1.compiler.fate.v1;
+import java.util.ArrayList;
+import java.util.Collection;
import java.util.Collections;
-import java.util.List;
import java.util.Iterator;
-import java.util.ArrayList;
+import java.util.List;
import tonkadur.error.Error;
@@ -637,7 +638,7 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor
new Size(collection_compiler.get_address()),
collection_compiler.get_address(),
result_as_address,
- index.get_address();
+ index.get_address()
)
);
@@ -1355,10 +1356,7 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor
final Register register;
register =
- compiler.registers().get_register
- (
- n.get_variable().get_name()
- );
+ compiler.registers().get_context_register(n.get_variable().get_name());
result_as_address = register.get_address();
result_as_computation = register.get_value();
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 04a7bcd..a138417 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
@@ -814,7 +814,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
end_of_loop_label = compiler.assembler().generate_label("<AfterForEach>");
compiler.assembler().push_context_label("breakable", end_of_loop_label);
- compiler.registers().bind(current_value, n.get_parameter_name());
+ compiler.registers().bind(n.get_parameter_name(), current_value);
new_body.add
(
@@ -1413,7 +1413,10 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
collection = collection_cc.get_address();
- result.add(new SetValue(collection_size, new Size(collection)));
+ result.add
+ (
+ new SetValue(collection_size.get_address(), new Size(collection))
+ );
if
(
@@ -1563,13 +1566,11 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
elem = elem_cc.get_address();
collection = collection_cc.get_address();
- result.add(new SetValue(elem.get_address(), elem_cc.get_computation()));
result.add
(
new SetValue(collection_size.get_address(), new Size(collection))
);
- elem_cc.release_registers();
if
(
@@ -1610,8 +1611,6 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
);
}
- compiler.registers().release(elem);
-
result.add
(
If.generate
@@ -1624,7 +1623,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
compiler.registers(),
compiler.assembler(),
index.get_address(),
- value_of_collection_size,
+ collection_size.get_value(),
collection
)
)
@@ -1634,6 +1633,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
compiler.registers().release(found);
compiler.registers().release(collection_size);
+ elem_cc.release_registers();
collection_cc.release_registers();
}
diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/MacroManager.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/MacroManager.java
deleted file mode 100644
index e471f28..0000000
--- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/MacroManager.java
+++ /dev/null
@@ -1,92 +0,0 @@
-package tonkadur.wyrd.v1.compiler.fate.v1;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Stack;
-
-import tonkadur.wyrd.v1.lang.computation.Address;
-
-public class MacroManager
-{
- protected final Map<String, Address> wild_parameters;
- protected final Stack<Map<String, Address>> context_stack;
-
- public MacroManager ()
- {
- wild_parameters = new HashMap<String, Address>();
- context_stack = new Stack<Map<String, Address>>();
- }
-
- public void add_wild_parameter (final String name, final Address ref)
- {
- if (wild_parameters.containsKey(name))
- {
- System.err.println("[P] duplicate wild parameter '" + name + "'.");
-
- return;
- }
-
- wild_parameters.put(name, ref);
- }
-
- public void remove_wild_parameter (final String name)
- {
- wild_parameters.remove(name);
- }
-
- public void pop ()
- {
- context_stack.pop();
- }
-
- public void push
- (
- final tonkadur.fate.v1.lang.Macro macro,
- final List<Address> parameter_refs
- )
- {
- final Iterator<Address> pri;
- final Iterator<tonkadur.fate.v1.lang.meta.TypedEntryList.TypedEntry> pre;
- final Map<String, Address> parameters;
-
- parameters = new HashMap<String, Address>();
-
- pri = parameter_refs.iterator();
- pre = macro.get_parameters().get_entries().iterator();
-
- while (pri.hasNext())
- {
- final String name;
-
- name = pre.next().get_name();
-
- parameters.put(name, pri.next());
- }
-
- context_stack.push(parameters);
- }
-
- public Address get_parameter_ref (final String parameter)
- {
- Address result;
-
- result = wild_parameters.get(parameter);
-
- if (result == null)
- {
- if (!context_stack.isEmpty())
- {
- result = context_stack.peek().get(parameter);
- }
-
- if (result == null)
- {
- System.err.println("[P] No such parameter '" + parameter + "'.");
- }
- }
-
- return result;
- }
-}
diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/TypeCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/TypeCompiler.java
index b433002..7013e1e 100644
--- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/TypeCompiler.java
+++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/TypeCompiler.java
@@ -42,7 +42,7 @@ public class TypeCompiler
);
}
- if (fate_type instanceof tonkadur.fate.v1.lang.type.AddressType)
+ if (fate_type instanceof tonkadur.fate.v1.lang.type.PointerType)
{
return
new PointerType
@@ -51,7 +51,7 @@ public class TypeCompiler
(
compiler,
(
- (tonkadur.fate.v1.lang.type.AddressType)
+ (tonkadur.fate.v1.lang.type.PointerType)
fate_type
).get_referenced_type()
)
@@ -166,7 +166,7 @@ public class TypeCompiler
return MapType.MAP_TO_RICH_TEXT;
}
- if (fate_content_type instanceof tonkadur.fate.v1.lang.type.AddressType)
+ if (fate_content_type instanceof tonkadur.fate.v1.lang.type.PointerType)
{
return
new MapType
@@ -177,7 +177,7 @@ public class TypeCompiler
(
compiler,
(
- (tonkadur.fate.v1.lang.type.AddressType)
+ (tonkadur.fate.v1.lang.type.PointerType)
fate_content_type
).get_referenced_type()
)
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 1689231..3c45e83 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
@@ -16,7 +16,7 @@ class RegisterContext
protected final String name;
protected final Map<String, Register> register_by_name;
protected final Map<String, Register> aliased_registers;
- protected final Map<Type, Register> anonymous_register_by_type;
+ protected final Map<Type, List<Register>> anonymous_register_by_type;
protected int generated_registers;
public RegisterContext (final String name)
@@ -25,7 +25,7 @@ class RegisterContext
register_by_name = new HashMap<String, Register>();
aliased_registers = new HashMap<String, Register>();
- anonymous_register_by_type = new HashMap<Type, Register>();
+ anonymous_register_by_type = new HashMap<Type, List<Register>>();
generated_registers = 0;
}
@@ -50,9 +50,9 @@ class RegisterContext
anonymous_register_by_type.put(t, list);
}
- for (final register r: list)
+ for (final Register r: list)
{
- if (!entry.get_is_in_use())
+ if (!r.get_is_in_use())
{
r.set_is_in_use(true);
@@ -62,7 +62,7 @@ class RegisterContext
name = (name_prefix + Integer.toString(generated_registers++));
- result = create_register(t, "local", name);
+ result = create_register(t, name);
result.set_is_in_use(true);
@@ -73,11 +73,11 @@ class RegisterContext
return result;
}
- public Register reserve (final Type t, final String scope, final String name)
+ public Register reserve (final Type t, final String name)
{
final Register result;
- result = create_register(t, scope, name);
+ result = create_register(t, name);
if (register_by_name.get(name) != null)
{
@@ -96,7 +96,7 @@ class RegisterContext
return result;
}
- public void bind (final Register reg, final String name)
+ public void bind (final String name, final Register reg)
{
if (aliased_registers.containsKey(name))
{
@@ -137,13 +137,8 @@ class RegisterContext
r.set_is_in_use(false);
}
- protected Register create_register
- (
- final Type t,
- final String scope,
- final String name
- )
+ protected Register create_register (final Type t, final String name)
{
- return new Register(t, scope, name);
+ return new Register(t, name);
}
}
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 dffb52a..88f3eeb 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
@@ -1,21 +1,25 @@
package tonkadur.wyrd.v1.compiler.util.registers;
-import java.util.Map;
-import java.util.HashMap;
+import java.util.ArrayDeque;
+import java.util.ArrayList;
import java.util.Collection;
+import java.util.Deque;
+import java.util.HashMap;
import java.util.List;
-import java.util.ArrayList;
+import java.util.Map;
import tonkadur.functional.Cons;
import tonkadur.wyrd.v1.lang.Register;
import tonkadur.wyrd.v1.lang.meta.Computation;
+import tonkadur.wyrd.v1.lang.meta.Instruction;
import tonkadur.wyrd.v1.lang.computation.Address;
import tonkadur.wyrd.v1.lang.computation.Constant;
import tonkadur.wyrd.v1.lang.type.Type;
+import tonkadur.wyrd.v1.lang.type.DictType;
public class RegisterManager
@@ -30,7 +34,7 @@ public class RegisterManager
{
base_context = new RegisterContext("base context");
- context_by_name = new HashMap<String, RegisterContext>();
+ context_by_name = new HashMap<String, StackableRegisterContext>();
context = new ArrayDeque<RegisterContext>();
created_contexts = 0;
@@ -39,7 +43,7 @@ public class RegisterManager
public Register reserve (final Type t)
{
- context.peekFirst().reserve(t);
+ return context.peekFirst().reserve(t);
}
public void release (final Register r)
@@ -56,14 +60,19 @@ public class RegisterManager
{
final StackableRegisterContext result;
- result = StackableRegisterContext.generate(base_context, context_name);
+ result = new StackableRegisterContext(base_context, context_name);
+
+ if (context_by_name.containsKey(context_name))
+ {
+ System.err.println("[P] Duplicate context '" + context_name +"'.");
+ }
- context_by_name.put(result);
+ context_by_name.put(context_name, result);
}
- public void register (final Type t, final String register_name)
+ public Register register (final Type t, final String name)
{
- context.peekFirst().reserve(t, name);
+ return context.peekFirst().reserve(t, name);
}
public void bind (final String name, final Register register)
@@ -76,7 +85,7 @@ public class RegisterManager
context.peekFirst().unbind(name);
}
- public Register get_context_register (final String register_name)
+ public Register get_context_register (final String name)
{
final Register result;
@@ -110,9 +119,9 @@ public class RegisterManager
{
final Collection<DictType> result;
- result = new ArrayList<Type>();
+ result = new ArrayList<DictType>();
- for (final StackableRegisterContext src: register_by_name.values())
+ for (final StackableRegisterContext src: context_by_name.values())
{
result.add(src.get_structure_type());
}
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 193315b..e8f79a8 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
@@ -8,14 +8,20 @@ import java.util.ArrayList;
import tonkadur.functional.Cons;
-import tonkadur.wyrd.v1.lang.Variable;
+import tonkadur.wyrd.v1.lang.Register;
import tonkadur.wyrd.v1.lang.meta.Computation;
+import tonkadur.wyrd.v1.lang.meta.Instruction;
import tonkadur.wyrd.v1.lang.computation.Address;
+import tonkadur.wyrd.v1.lang.computation.RelativeAddress;
import tonkadur.wyrd.v1.lang.computation.Constant;
+import tonkadur.wyrd.v1.lang.computation.Cast;
import tonkadur.wyrd.v1.lang.type.Type;
+import tonkadur.wyrd.v1.lang.type.PointerType;
+import tonkadur.wyrd.v1.lang.type.MapType;
+import tonkadur.wyrd.v1.lang.type.DictType;
class StackableRegisterContext extends RegisterContext
@@ -55,16 +61,11 @@ class StackableRegisterContext extends RegisterContext
}
@Override
- protected Register generate_register
- (
- final Type t,
- final String scope,
- final String name
- )
+ protected Register create_register (final Type t, final String name)
{
final Register result;
- if (context_structure.get(name) != null)
+ if (context_structure.get_fields().get(name) != null)
{
System.err.println
(
@@ -76,7 +77,7 @@ class StackableRegisterContext extends RegisterContext
);
}
- context_structure.put(name, t);
+ context_structure.get_fields().put(name, t);
return
new Register
@@ -88,11 +89,22 @@ class StackableRegisterContext extends RegisterContext
t
),
t,
- scope,
name
);
}
+ public List<Instruction> get_enter_instructions ()
+ {
+ /* TODO */
+ return new ArrayList<>();
+ }
+
+ public List<Instruction> get_leave_instructions ()
+ {
+ /* TODO */
+ return new ArrayList<>();
+ }
+
public DictType get_structure_type ()
{
return context_structure;
diff --git a/src/core/src/tonkadur/wyrd/v1/lang/Register.java b/src/core/src/tonkadur/wyrd/v1/lang/Register.java
index 4f1c671..4dfbf23 100644
--- a/src/core/src/tonkadur/wyrd/v1/lang/Register.java
+++ b/src/core/src/tonkadur/wyrd/v1/lang/Register.java
@@ -10,35 +10,34 @@ import tonkadur.wyrd.v1.lang.meta.Computation;
public class Register
{
protected final Type type;
- protected final String scope;
protected final String name;
protected final Address address;
protected final Computation value;
+ protected boolean is_in_use;
- public Register (final Type type, final String scope, final String name)
+ public Register (final Type type, final String name)
{
this.name = name;
- this.scope = scope;
this.type = type;
address = new Address(new Constant(Type.STRING, name), type);
value = new ValueOf(address);
+ is_in_use = false;
}
public Register
(
final Address address,
final Type type,
- final String scope,
final String name
)
{
this.address = address;
this.name = name;
- this.scope = scope;
this.type = type;
value = new ValueOf(address);
+ is_in_use = false;
}
public Type get_type ()
@@ -65,4 +64,14 @@ public class Register
{
return value;
}
+
+ public boolean get_is_in_use ()
+ {
+ return is_in_use;
+ }
+
+ public void set_is_in_use (final boolean val)
+ {
+ is_in_use = val;
+ }
}