summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/Compiler.java24
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java66
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java187
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/SequenceCompiler.java43
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/BinarySearch.java12
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/Clear.java7
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/CountOccurrences.java4
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/InsertAt.java8
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/RemoveAllOf.java12
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/RemoveAt.java8
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/ReverseList.java12
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterContext.java91
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterManager.java78
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/registers/StackableRegisterContext.java65
-rw-r--r--src/core/src/tonkadur/wyrd/v1/lang/Register.java67
-rw-r--r--src/core/src/tonkadur/wyrd/v1/lang/type/DictType.java8
16 files changed, 370 insertions, 322 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 3b57ff3..79004b2 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
@@ -34,7 +34,7 @@ public class Compiler
compiler.assembler().handle_adding_instruction
(
- compiler.assembler().merge(compiler.registers().pop_initializes()),
+ compiler.assembler().merge(compiler.registers().get_initialization()),
wyrd_world
);
@@ -46,8 +46,6 @@ public class Compiler
compiler.compile_main_sequence(fate_world);
- compiler.add_registers();
-
return compiler.wyrd_world;
}
@@ -106,9 +104,8 @@ public class Compiler
final Register r;
t = TypeCompiler.compile(this, variable.get_type());
- r = registers.register(t, variable.get_name());
-
- r.set_is_in_use(true);
+ r = registers.register(t, variable.get_name(), init_instr);
+ wyrd_world.add_register(r);
}
this.assembler().handle_adding_instruction
@@ -146,21 +143,6 @@ public class Compiler
fate_world.get_global_instructions()
);
}
-
- protected void add_registers ()
- throws Throwable
- {
- for (final DictType type: registers.get_context_structure_types())
- {
- wyrd_world.add_dict_type(type);
- }
-
- for (final Register register: registers.get_base_registers())
- {
- wyrd_world.add_register(register);
- }
- }
-
public World world ()
{
return wyrd_world;
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 996a246..d031b66 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
@@ -111,11 +111,11 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor
}
}
- public void release_registers ()
+ public void release_registers (final List<Instruction> instr_holder)
{
for (final Register reg: reserved_registers)
{
- compiler.registers().release(reg);
+ compiler.registers().release(reg, instr_holder);
}
}
@@ -129,7 +129,7 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor
{
final Register result;
- result = compiler.registers().reserve(t);
+ result = compiler.registers().reserve(t, init_instructions);
reserved_registers.add(result);
@@ -1619,6 +1619,16 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor
out_label = compiler.assembler().generate_label("<lambda_expr#out>");
in_label = compiler.assembler().generate_label("<lambda_expr#in>");
+ parameters = new ArrayList<Register>();
+
+ context_name = compiler.registers().create_stackable_context_name();
+
+ compiler.registers().create_stackable_context
+ (
+ context_name,
+ init_instructions
+ );
+
init_instructions.add
(
compiler.assembler().mark_after
@@ -1628,12 +1638,6 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor
)
);
- parameters = new ArrayList<Register>();
-
- context_name = compiler.registers().create_stackable_context_name();
-
- compiler.registers().create_stackable_context(context_name);
-
init_instructions.addAll
(
compiler.registers().get_initialize_context_instructions(context_name)
@@ -1644,7 +1648,16 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor
result_type =
TypeCompiler.compile(compiler, n.get_lambda_function().get_type());
- result_holder = reserve(new PointerType(result_type));
+ result_holder =
+ /* Defining a context, don't use this.reserve(), otherwise this
+ * context-dependent variable will get released outside the context
+ * (where it doesn't exist) and that will cause an error.
+ */
+ compiler.registers().reserve
+ (
+ new PointerType(result_type),
+ init_instructions
+ );
parameters.add(result_holder);
@@ -1652,7 +1665,13 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor
{
final Register r;
- r = reserve(TypeCompiler.compile(compiler, param.get_type()));
+ r =
+ /* Bound registers, can't use this.reserve() */
+ compiler.registers().reserve
+ (
+ TypeCompiler.compile(compiler, param.get_type()),
+ init_instructions
+ );
parameters.add(r);
@@ -1668,7 +1687,12 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor
n.get_lambda_function().get_visited_by(expr_compiler);
- assimilate(expr_compiler);
+ /* Nope: its variables are removed when the context is left. */
+ /* assimilate(expr_compiler); */
+ if (expr_compiler.has_init())
+ {
+ init_instructions.add(expr_compiler.get_init());
+ }
init_instructions.add
(
@@ -1678,7 +1702,13 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor
expr_compiler.get_computation()
)
);
-
+/*
+ * No need: it's getting finalized anyway.
+ for (final tonkadur.fate.v1.lang.Variable param: n.get_parameters())
+ {
+ compiler.registers().unbind(param.get_name(), init_instructions);
+ }
+*/
init_instructions.addAll
(
compiler.registers().get_finalize_context_instructions()
@@ -1796,7 +1826,13 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor
final ComputationCompiler cc;
name = a.get_car().get_name();
- r = reserve(TypeCompiler.compile(compiler, a.get_car().get_type()));
+ r =
+ /* These are free by the unbind below */
+ compiler.registers().reserve
+ (
+ TypeCompiler.compile(compiler, a.get_car().get_type()),
+ init_instructions
+ );
compiler.registers().bind(name, r);
names.add(name);
@@ -1817,7 +1853,7 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor
for (final String name: names)
{
- compiler.registers().unbind(name);
+ compiler.registers().unbind(name, init_instructions);
}
}
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 67a7e0d..769f2c0 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
@@ -119,9 +119,9 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
collection = address_compiler.get_address();
- element_found = compiler.registers().reserve(Type.BOOL);
- element_index = compiler.registers().reserve(Type.INT);
- collection_size = compiler.registers().reserve(Type.INT);
+ element_found = compiler.registers().reserve(Type.BOOL, result);
+ element_index = compiler.registers().reserve(Type.INT, result);
+ collection_size = compiler.registers().reserve(Type.INT, result);
result.add
(
@@ -161,12 +161,12 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
)
);
- compiler.registers().release(element_found);
- compiler.registers().release(element_index);
- compiler.registers().release(collection_size);
+ compiler.registers().release(element_found, result);
+ compiler.registers().release(element_index, result);
+ compiler.registers().release(collection_size, result);
- element_compiler.release_registers();
- address_compiler.release_registers();
+ element_compiler.release_registers(result);
+ address_compiler.release_registers(result);
}
protected void add_element_to_list
@@ -249,8 +249,8 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
)
);
- address_compiler.release_registers();
- element_compiler.release_registers();
+ address_compiler.release_registers(result);
+ element_compiler.release_registers(result);
}
@Override
@@ -265,7 +265,8 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
r =
compiler.registers().reserve
(
- TypeCompiler.compile(compiler, n.get_variable().get_type())
+ TypeCompiler.compile(compiler, n.get_variable().get_type()),
+ result
);
compiler.registers().bind(n.get_variable().get_name(), r);
@@ -325,7 +326,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
final ComputationCompiler collection_compiler;
final Register index_holder;
- index_holder = compiler.registers().reserve(Type.INT);
+ index_holder = compiler.registers().reserve(Type.INT, result);
index_compiler = new ComputationCompiler(compiler);
@@ -386,11 +387,11 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
)
);
- compiler.registers().release(index_holder);
+ compiler.registers().release(index_holder, result);
- index_compiler.release_registers();
- element_compiler.release_registers();
- collection_compiler.release_registers();
+ index_compiler.release_registers(result);
+ element_compiler.release_registers(result);
+ collection_compiler.release_registers(result);
}
@Override
@@ -465,8 +466,8 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
new Assert(cond_cc.get_computation(), msg_cc.get_computation())
);
- cond_cc.release_registers();
- msg_cc.release_registers();
+ cond_cc.release_registers(result);
+ msg_cc.release_registers(result);
}
@Override
@@ -503,7 +504,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
)
);
- address_compiler.release_registers();
+ address_compiler.release_registers(result);
}
public void visit_reverse_list
@@ -542,7 +543,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
)
);
- address_compiler.release_registers();
+ address_compiler.release_registers(result);
}
@Override
@@ -601,7 +602,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
compiler.registers().push_hierarchical_instruction_level();
n.get_default_instruction().get_visited_by(ic);
- compiler.registers().pop_hierarchical_instruction_level();
+ compiler.registers().pop_hierarchical_instruction_level(ic.result);
previous_else_branch.add(ic.get_result());
@@ -639,7 +640,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
branch.get_car().get_visited_by(cc);
compiler.registers().push_hierarchical_instruction_level();
branch.get_cdr().get_visited_by(ic);
- compiler.registers().pop_hierarchical_instruction_level();
+ compiler.registers().pop_hierarchical_instruction_level(ic.result);
if (cc.has_init())
{
@@ -660,7 +661,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
previous_else_branch = current_branch;
- cc.release_registers();
+ cc.release_registers(result);
}
result.add(compiler.assembler().merge(previous_else_branch));
@@ -688,7 +689,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
result.add(new Display(cc.get_computation()));
- cc.release_registers();
+ cc.release_registers(result);
}
@Override
@@ -721,7 +722,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
result.add(new Remove(target));
- cc.release_registers();
+ cc.release_registers(result);
}
@Override
@@ -751,7 +752,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
body.add(ic.get_result());
}
- compiler.registers().pop_hierarchical_instruction_level();
+ compiler.registers().pop_hierarchical_instruction_level(body);
if (cc.has_init())
@@ -791,7 +792,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
}
compiler.assembler().pop_context_label("breakable");
- cc.release_registers();
+ cc.release_registers(result);
}
@Override
@@ -821,7 +822,10 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
pre_cond_instructions.add(ic.get_result());
}
- compiler.registers().pop_hierarchical_instruction_level();
+ compiler.registers().pop_hierarchical_instruction_level
+ (
+ pre_cond_instructions
+ );
if (cc.has_init())
{
@@ -849,7 +853,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
);
compiler.assembler().pop_context_label("breakable");
- cc.release_registers();
+ cc.release_registers(result);
}
@Override
@@ -881,7 +885,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
body.add(ic.get_result());
}
- compiler.registers().pop_hierarchical_instruction_level();
+ compiler.registers().pop_hierarchical_instruction_level(body);
ic = new InstructionCompiler(compiler);
n.get_post().get_visited_by(ic);
@@ -928,7 +932,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
}
compiler.assembler().pop_context_label("breakable");
- cc.release_registers();
+ cc.release_registers(result);
}
@Override
@@ -956,8 +960,8 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
cc = new ComputationCompiler(compiler);
new_body = new ArrayList<Instruction>();
- index = compiler.registers().reserve(Type.INT);
- collection_size = compiler.registers().reserve(Type.INT);
+ index = compiler.registers().reserve(Type.INT, result);
+ collection_size = compiler.registers().reserve(Type.INT, result);
result.add(new SetValue(index.get_address(), Constant.ZERO));
@@ -977,7 +981,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
member_type = ((MapType) collection.get_target_type()).get_member_type();
- current_value = compiler.registers().reserve(member_type);
+ current_value = compiler.registers().reserve(member_type, result);
end_of_loop_label = compiler.assembler().generate_label("<AfterForEach>");
@@ -1015,7 +1019,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
new_body.add(ic.get_result());
}
- compiler.registers().pop_hierarchical_instruction_level();
+ compiler.registers().pop_hierarchical_instruction_level(new_body);
new_body.add
(
@@ -1044,12 +1048,14 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
end_of_loop_label
)
);
- compiler.registers().unbind(n.get_parameter_name());
+ compiler.registers().unbind(n.get_parameter_name(), result);
compiler.assembler().pop_context_label("breakable");
- compiler.registers().release(index);
- compiler.registers().release(current_value);
- compiler.registers().release(collection_size);
+ compiler.registers().release(index, result);
+ compiler.registers().release(collection_size, result);
+
+ /* Already released by the unbind above. */
+ /* compiler.registers().release(current_value, result); */
}
@Override
@@ -1066,7 +1072,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
index_cc = new ComputationCompiler(compiler);
collection_cc = new ComputationCompiler(compiler);
- collection_size = compiler.registers().reserve(Type.INT);
+ collection_size = compiler.registers().reserve(Type.INT, result);
n.get_index().get_visited_by(index_cc);
n.get_collection().get_visited_by(collection_cc);
@@ -1102,10 +1108,10 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
)
);
- compiler.registers().release(collection_size);
+ compiler.registers().release(collection_size, result);
- index_cc.release_registers();
- collection_cc.release_registers();
+ index_cc.release_registers(result);
+ collection_cc.release_registers(result);
}
@@ -1183,7 +1189,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
branch.get_car().get_visited_by(cc);
compiler.registers().push_hierarchical_instruction_level();
branch.get_cdr().get_visited_by(ic);
- compiler.registers().pop_hierarchical_instruction_level();
+ compiler.registers().pop_hierarchical_instruction_level(ic.result);
if (cc.has_init())
{
@@ -1204,7 +1210,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
previous_else_branch = current_branch;
- cc.release_registers();
+ cc.release_registers(result);
}
result.add(compiler.assembler().merge(previous_else_branch));
@@ -1254,7 +1260,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
for (final ComputationCompiler cc: cc_list)
{
- cc.release_registers();
+ cc.release_registers(result);
}
}
@@ -1282,11 +1288,17 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
compiler.registers().push_hierarchical_instruction_level();
n.get_if_true().get_visited_by(if_true_ic);
- compiler.registers().pop_hierarchical_instruction_level();
+ compiler.registers().pop_hierarchical_instruction_level
+ (
+ if_true_ic.result
+ );
compiler.registers().push_hierarchical_instruction_level();
n.get_if_false().get_visited_by(if_false_ic);
- compiler.registers().pop_hierarchical_instruction_level();
+ compiler.registers().pop_hierarchical_instruction_level
+ (
+ if_false_ic.result
+ );
if (cc.has_init())
{
@@ -1305,7 +1317,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
)
);
- cc.release_registers();
+ cc.release_registers(result);
}
@Override
@@ -1330,7 +1342,10 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
compiler.registers().push_hierarchical_instruction_level();
n.get_if_true().get_visited_by(if_true_ic);
- compiler.registers().pop_hierarchical_instruction_level();
+ compiler.registers().pop_hierarchical_instruction_level
+ (
+ if_true_ic.result
+ );
if (cc.has_init())
{
@@ -1348,7 +1363,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
)
);
- cc.release_registers();
+ cc.release_registers(result);
}
@Override
@@ -1552,7 +1567,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
{
fate_instruction.get_visited_by(this);
}
- compiler.registers().pop_hierarchical_instruction_level();
+ compiler.registers().pop_hierarchical_instruction_level(result);
result.add
(
@@ -1566,7 +1581,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
)
);
- cc.release_registers();
+ cc.release_registers(result);
}
@Override
@@ -1706,7 +1721,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
elem_cc = new ComputationCompiler(compiler);
collection_cc = new ComputationCompiler(compiler);
- collection_size = compiler.registers().reserve(Type.INT);
+ collection_size = compiler.registers().reserve(Type.INT, result);
n.get_element().get_visited_by(elem_cc);
n.get_collection().get_visited_by(collection_cc);
@@ -1742,8 +1757,8 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
final Computation value_of_elem;
final Register index, found;
- index = compiler.registers().reserve(Type.INT);
- found = compiler.registers().reserve(Type.BOOL);
+ index = compiler.registers().reserve(Type.INT, result);
+ found = compiler.registers().reserve(Type.BOOL, result);
value_of_elem = new ValueOf(elem);
@@ -1761,7 +1776,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
)
);
- elem_cc.release_registers();
+ elem_cc.release_registers(result);
result.add
(
@@ -1781,8 +1796,8 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
)
);
- compiler.registers().release(index);
- compiler.registers().release(found);
+ compiler.registers().release(index, result);
+ compiler.registers().release(found, result);
}
else
{
@@ -1798,12 +1813,12 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
)
);
- elem_cc.release_registers();
+ elem_cc.release_registers(result);
}
- collection_cc.release_registers();
+ collection_cc.release_registers(result);
- compiler.registers().release(collection_size);
+ compiler.registers().release(collection_size, result);
}
@Override
@@ -1857,9 +1872,9 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
elem_cc = new ComputationCompiler(compiler);
collection_cc = new ComputationCompiler(compiler);
- collection_size = compiler.registers().reserve(Type.INT);
- found = compiler.registers().reserve(Type.BOOL);
- index = compiler.registers().reserve(Type.INT);
+ collection_size = compiler.registers().reserve(Type.INT, result);
+ found = compiler.registers().reserve(Type.BOOL, result);
+ index = compiler.registers().reserve(Type.INT, result);
n.get_element().get_visited_by(elem_cc);
n.get_collection().get_visited_by(collection_cc);
@@ -1942,12 +1957,12 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
)
);
- compiler.registers().release(index);
- compiler.registers().release(found);
- compiler.registers().release(collection_size);
+ compiler.registers().release(index, result);
+ compiler.registers().release(found, result);
+ compiler.registers().release(collection_size, result);
- elem_cc.release_registers();
- collection_cc.release_registers();
+ elem_cc.release_registers(result);
+ collection_cc.release_registers(result);
}
@Override
@@ -2013,7 +2028,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
for (final ComputationCompiler cc: parameter_ccs)
{
- cc.release_registers();
+ cc.release_registers(result);
}
}
@@ -2054,6 +2069,11 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
result.addAll(compiler.registers().store_parameters(parameters));
+ for (final ComputationCompiler cc: parameter_ccs)
+ {
+ cc.release_registers(result);
+ }
+
/* Terminate current context */
result.addAll
(
@@ -2070,11 +2090,6 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
)
)
);
-
- for (final ComputationCompiler cc: parameter_ccs)
- {
- cc.release_registers();
- }
}
@Override
@@ -2112,8 +2127,8 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
new SetValue(address_cc.get_address(), value_cc.get_computation())
);
- value_cc.release_registers();
- address_cc.release_registers();
+ value_cc.release_registers(result);
+ address_cc.release_registers(result);
}
@Override
@@ -2173,10 +2188,10 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
)
);
- target_cc.release_registers();
- min_cc.release_registers();
- max_cc.release_registers();
- label_cc.release_registers();
+ target_cc.release_registers(result);
+ min_cc.release_registers(result);
+ max_cc.release_registers(result);
+ label_cc.release_registers(result);
}
@Override
@@ -2236,9 +2251,9 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
)
);
- target_cc.release_registers();
- min_cc.release_registers();
- max_cc.release_registers();
- label_cc.release_registers();
+ target_cc.release_registers(result);
+ min_cc.release_registers(result);
+ max_cc.release_registers(result);
+ label_cc.release_registers(result);
}
}
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 16f7ec0..6f3a83d 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
@@ -26,8 +26,8 @@ public class SequenceCompiler
{
final List<Instruction> init_instructions;
final List<Register> parameters;
- final List<Register> to_be_cleaned;
final String end_of_sequence;
+ final List<Register> to_be_cleaned;
final InstructionCompiler ic;
init_instructions = new ArrayList<Instruction>();
@@ -47,7 +47,8 @@ public class SequenceCompiler
compiler.registers().create_stackable_context
(
- fate_sequence.get_name()
+ fate_sequence.get_name(),
+ init_instructions
);
init_instructions.add
@@ -55,6 +56,8 @@ public class SequenceCompiler
new SetPC(compiler.assembler().get_label_constant(end_of_sequence))
);
+ System.out.println("[D] Defining Context " + fate_sequence.get_name());
+
init_instructions.add
(
compiler.assembler().mark
@@ -83,7 +86,8 @@ public class SequenceCompiler
r =
compiler.registers().reserve
(
- TypeCompiler.compile(compiler, param.get_type())
+ TypeCompiler.compile(compiler, param.get_type()),
+ init_instructions
);
parameters.add(r);
@@ -97,35 +101,41 @@ public class SequenceCompiler
compiler.registers().read_parameters(parameters)
);
+
fate_sequence.get_root().get_visited_by(ic);
init_instructions.add(ic.get_result());
+ /* No need: the context is about to be finalized anyway. */
+ /*
+ for (final Register r: to_be_cleaned)
+ {
+ compiler.registers().release(r, init_instructions);
+ }
+ */
+
+
init_instructions.addAll
(
compiler.registers().get_finalize_context_instructions()
);
+ System.out.println
+ (
+ "[D] Completed Context "
+ + compiler.registers().get_current_context_name()
+ );
+
init_instructions.addAll
(
compiler.registers().get_leave_context_instructions()
);
- for (final Register r: to_be_cleaned)
- {
- compiler.registers().release(r);
- }
compiler.registers().pop_context();
compiler.assembler().handle_adding_instruction
(
- compiler.assembler().merge(compiler.registers().pop_initializes()),
- compiler.world()
- );
-
- compiler.assembler().handle_adding_instruction
- (
compiler.assembler().mark_after
(
compiler.assembler().merge(init_instructions),
@@ -164,13 +174,6 @@ public class SequenceCompiler
{
fate_instruction.get_visited_by(ic);
}
-
- compiler.assembler().handle_adding_instruction
- (
- compiler.assembler().merge(compiler.registers().pop_initializes()),
- compiler.world()
- );
-
compiler.assembler().handle_adding_instruction
(
ic.get_result(),
diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/BinarySearch.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/BinarySearch.java
index b08a376..44106bf 100644
--- a/src/core/src/tonkadur/wyrd/v1/compiler/util/BinarySearch.java
+++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/BinarySearch.java
@@ -98,9 +98,9 @@ public class BinarySearch
element_type = target.get_type();
- bot = registers.reserve(Type.INT);
- top = registers.reserve(Type.INT);
- midval = registers.reserve(element_type);
+ bot = registers.reserve(Type.INT, result);
+ top = registers.reserve(Type.INT, result);
+ midval = registers.reserve(element_type, result);
value_of_result_index = new ValueOf(result_index);
@@ -257,9 +257,9 @@ public class BinarySearch
)
);
- registers.release(bot);
- registers.release(top);
- registers.release(midval);
+ registers.release(bot, result);
+ registers.release(top, result);
+ registers.release(midval, result);
return assembler.merge(result);
}
diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/Clear.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/Clear.java
index cb0929c..c5137c2 100644
--- a/src/core/src/tonkadur/wyrd/v1/compiler/util/Clear.java
+++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/Clear.java
@@ -41,6 +41,9 @@ public class Clear
* (set .iterator (- (val .iterator) 1))
* (remove collection[.iterator])
* )
+ * FIXME: this can now be written as
+ * (remove collection)
+ * (initialize collection)
*/
public static Instruction generate
(
@@ -60,7 +63,7 @@ public class Clear
element_type =
((MapType) collection.get_target_type()).get_member_type();
- iterator = registers.reserve(Type.INT);
+ iterator = registers.reserve(Type.INT, result);
/* (set .iterator collection_size) */
result.add(new SetValue(iterator.get_address(), collection_size));
@@ -100,7 +103,7 @@ public class Clear
)
);
- registers.release(iterator);
+ registers.release(iterator, result);
return assembler.merge(result);
}
diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/CountOccurrences.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/CountOccurrences.java
index 5fb9fce..11a928f 100644
--- a/src/core/src/tonkadur/wyrd/v1/compiler/util/CountOccurrences.java
+++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/CountOccurrences.java
@@ -66,7 +66,7 @@ public class CountOccurrences
target_type = target.get_type();
- index = registers.reserve(Type.INT);
+ index = registers.reserve(Type.INT, result);
result.add(new SetValue(count, Constant.ZERO));
result.add(new SetValue(index.get_address(), collection_size));
@@ -117,6 +117,8 @@ public class CountOccurrences
)
);
+ registers.release(index, result);
+
return assembler.merge(result);
}
}
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 12e4658..71c4bc1 100644
--- a/src/core/src/tonkadur/wyrd/v1/compiler/util/InsertAt.java
+++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/InsertAt.java
@@ -69,8 +69,8 @@ public class InsertAt
element_type = element.get_type();
- prev = registers.reserve(Type.INT);
- end = registers.reserve(Type.INT);
+ prev = registers.reserve(Type.INT, result);
+ end = registers.reserve(Type.INT, result);
value_of_index = new ValueOf(index);
@@ -166,8 +166,8 @@ public class InsertAt
)
);
- registers.release(end);
- registers.release(prev);
+ registers.release(end, result);
+ registers.release(prev, result);
return assembler.merge(result);
}
diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/RemoveAllOf.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/RemoveAllOf.java
index e8daadf..50cef0a 100644
--- a/src/core/src/tonkadur/wyrd/v1/compiler/util/RemoveAllOf.java
+++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/RemoveAllOf.java
@@ -87,9 +87,9 @@ public class RemoveAllOf
element_type = element.get_type();
- index = registers.reserve(Type.INT);
- found = registers.reserve(Type.INT);
- end = registers.reserve(Type.INT);
+ index = registers.reserve(Type.INT, result);
+ found = registers.reserve(Type.INT, result);
+ end = registers.reserve(Type.INT, result);
value_of_found_greater_than_0 =
Operation.greater_than(found.get_value(), Constant.ZERO);
@@ -248,9 +248,9 @@ public class RemoveAllOf
)
);
- registers.release(index);
- registers.release(found);
- registers.release(end);
+ registers.release(index, result);
+ registers.release(found, result);
+ registers.release(end, result);
return assembler.merge(result);
}
diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/RemoveAt.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/RemoveAt.java
index d540d67..222738f 100644
--- a/src/core/src/tonkadur/wyrd/v1/compiler/util/RemoveAt.java
+++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/RemoveAt.java
@@ -68,8 +68,8 @@ public class RemoveAt
element_type =
((MapType) collection.get_target_type()).get_member_type();
- next = registers.reserve(Type.INT);
- end = registers.reserve(Type.INT);
+ next = registers.reserve(Type.INT, result);
+ end = registers.reserve(Type.INT, result);
value_of_index = new ValueOf(index);
@@ -143,8 +143,8 @@ public class RemoveAt
/* (remove collection[index]) */
result.add(new Remove(collection_at_index));
- registers.release(end);
- registers.release(next);
+ registers.release(end, result);
+ registers.release(next, result);
return assembler.merge(result);
}
diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/ReverseList.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/ReverseList.java
index 2d5e269..f044cd9 100644
--- a/src/core/src/tonkadur/wyrd/v1/compiler/util/ReverseList.java
+++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/ReverseList.java
@@ -66,9 +66,9 @@ public class ReverseList
element_type =
((MapType) collection.get_target_type()).get_member_type();
- buffer = registers.reserve(element_type);
- top = registers.reserve(Type.INT);
- bot = registers.reserve(Type.INT);
+ buffer = registers.reserve(element_type, result);
+ top = registers.reserve(Type.INT, result);
+ bot = registers.reserve(Type.INT, result);
collection_at_top =
new RelativeAddress
@@ -158,9 +158,9 @@ public class ReverseList
)
);
- registers.release(buffer);
- registers.release(top);
- registers.release(bot);
+ registers.release(buffer, result);
+ registers.release(top, result);
+ registers.release(bot, result);
return assembler.merge(result);
}
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 c0d70a3..e83707b 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
@@ -15,6 +15,7 @@ import tonkadur.wyrd.v1.lang.Register;
import tonkadur.wyrd.v1.lang.type.Type;
import tonkadur.wyrd.v1.lang.instruction.Initialize;
+import tonkadur.wyrd.v1.lang.instruction.Remove;
class RegisterContext
{
@@ -23,7 +24,7 @@ class RegisterContext
protected final Map<String, Register> register_by_name;
protected final Map<String, Register> aliased_registers;
protected final Deque<Collection<String>> hierarchical_aliases;
- protected final Map<Type, List<Register>> anonymous_register_by_type;
+ protected final List<Register> anonymous_registers;
protected final String name_prefix;
protected int generated_registers;
@@ -34,7 +35,7 @@ class RegisterContext
register_by_name = new HashMap<String, Register>();
aliased_registers = new HashMap<String, Register>();
hierarchical_aliases = new ArrayDeque<Collection<String>>();
- anonymous_register_by_type = new HashMap<Type, List<Register>>();
+ anonymous_registers = new ArrayList<Register>();
name_prefix = default_name_prefix;
generated_registers = 0;
@@ -46,7 +47,7 @@ class RegisterContext
register_by_name = new HashMap<String, Register>();
aliased_registers = new HashMap<String, Register>();
- anonymous_register_by_type = new HashMap<Type, List<Register>>();
+ anonymous_registers = new ArrayList<Register>();
hierarchical_aliases = new ArrayDeque<Collection<String>>();
this.name_prefix = name_prefix;
@@ -71,22 +72,14 @@ class RegisterContext
{
final String name;
final Register result;
- List<Register> list;
- list = anonymous_register_by_type.get(t);
-
- if (list == null)
- {
- list = new ArrayList<Register>();
-
- anonymous_register_by_type.put(t, list);
- }
-
- for (final Register r: list)
+ for (final Register r: anonymous_registers)
{
- if (!r.get_is_in_use())
+ if (!r.is_active())
{
- r.set_is_in_use(true);
+ r.activate(t);
+
+ initialize_holder.add(new Initialize(r.get_address(), t));
return r;
}
@@ -94,11 +87,11 @@ class RegisterContext
name = (name_prefix + Integer.toString(generated_registers++));
- result = create_register(t, name, initialize_holder);
+ result = create_register(t, name);
- result.set_is_in_use(true);
+ initialize_holder.add(new Initialize(result.get_address(), t));
- list.add(result);
+ anonymous_registers.add(result);
register_by_name.put(name, result);
@@ -114,7 +107,7 @@ class RegisterContext
{
final Register result;
- result = create_register(t, name, initialize_holder);
+ result = create_register(t, name);
if (register_by_name.get(name) != null)
{
@@ -126,9 +119,9 @@ class RegisterContext
);
}
- register_by_name.put(name, result);
+ initialize_holder.add(new Initialize(result.get_address(), t));
- result.set_is_in_use(true);
+ register_by_name.put(name, result);
return result;
}
@@ -155,10 +148,12 @@ class RegisterContext
}
}
- public void unbind (final String name)
+ public void unbind (final String name, final List<Instruction> instr_holder)
{
- release(aliased_registers.get(name));
+ release(aliased_registers.get(name), instr_holder);
+
aliased_registers.remove(name);
+
if (!hierarchical_aliases.isEmpty())
{
hierarchical_aliases.peekFirst().remove(name);
@@ -170,11 +165,14 @@ class RegisterContext
hierarchical_aliases.push(new ArrayList<String>());
}
- public void pop_hierarchical_instruction_level ()
+ public void pop_hierarchical_instruction_level
+ (
+ final List<Instruction> instr_holder
+ )
{
for (final String s: hierarchical_aliases.pop())
{
- unbind(s);
+ unbind(s, instr_holder);
}
}
@@ -194,26 +192,43 @@ class RegisterContext
public Register get_non_local_register (final String name)
{
- return register_by_name.get(name);
+ final Register result;
+
+ result = register_by_name.get(name);
+
+ if (result == null)
+ {
+ System.err.println("[F] Access to unknown global register: " + name);
+ }
+ else if (!result.is_active())
+ {
+ System.err.println("[P] Inactive global register: " + name);
+ }
+
+ return result;
}
- public void release (final Register r)
+ public void release (final Register r, final List<Instruction> instr_holder)
{
- r.set_is_in_use(false);
+ if (!r.is_active())
+ {
+ System.err.println
+ (
+ "[W][P] Deactivating inactive register: "
+ + r.get_name()
+ );
+ new Throwable().printStackTrace();
+ }
+ instr_holder.add(new Remove(r.get_address()));
+ r.deactivate();
}
- protected Register create_register
- (
- final Type t,
- final String name,
- final List<Instruction> initialize_holder
- )
+ protected Register create_register (final Type t, final String name)
{
final Register result;
- result = new Register(t, name);
-
- initialize_holder.add(new Initialize(result.get_address(), t));
+ result = new Register(name);
+ result.activate(t);
return result;
}
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 07ea1ac..2d12e0a 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
@@ -40,7 +40,7 @@ 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 final List<Instruction> awaiting_inits;
protected int created_contexts;
public RegisterManager ()
@@ -64,14 +64,14 @@ public class RegisterManager
context.push(base_context);
}
- public Register reserve (final Type t)
+ public Register reserve (final Type t, final List<Instruction> instr_holder)
{
- return context.peekFirst().reserve(t, awaiting_inits);
+ return context.peekFirst().reserve(t, instr_holder);
}
- public void release (final Register r)
+ public void release (final Register r, final List<Instruction> instr_holder)
{
- context.peekFirst().release(r);
+ context.peekFirst().release(r, instr_holder);
}
public String create_stackable_context_name ()
@@ -94,7 +94,11 @@ public class RegisterManager
return rand_value;
}
- public void create_stackable_context (final String context_name)
+ public void create_stackable_context
+ (
+ final String context_name,
+ final List<Instruction> instr_holder
+ )
{
final StackableRegisterContext result;
@@ -103,7 +107,7 @@ public class RegisterManager
(
base_context,
context_name,
- awaiting_inits
+ instr_holder
);
if (context_by_name.containsKey(context_name))
@@ -138,9 +142,14 @@ public class RegisterManager
context.pop();
}
- public Register register (final Type t, final String name)
+ public Register register
+ (
+ final Type t,
+ final String name,
+ final List<Instruction> instr_holder
+ )
{
- return context.peekFirst().reserve(t, name, awaiting_inits);
+ return context.peekFirst().reserve(t, name, instr_holder);
}
public void bind (final String name, final Register register)
@@ -148,9 +157,9 @@ public class RegisterManager
context.peekFirst().bind(name, register);
}
- public void unbind (final String name)
+ public void unbind (final String name, final List<Instruction> instr_holder)
{
- context.peekFirst().unbind(name);
+ context.peekFirst().unbind(name, instr_holder);
}
public Register get_context_register (final String name)
@@ -163,6 +172,10 @@ public class RegisterManager
{
return base_context.get_non_local_register(name);
}
+ else if (!result.is_active())
+ {
+ System.err.println("[P] Inactive context register: " + name);
+ }
return result;
}
@@ -289,23 +302,12 @@ public class RegisterManager
context.peekFirst().push_hierarchical_instruction_level();
}
- public void pop_hierarchical_instruction_level ()
+ public void pop_hierarchical_instruction_level
+ (
+ final List<Instruction> instr_holder
+ )
{
- context.peekFirst().pop_hierarchical_instruction_level();
- }
-
- public Collection<DictType> get_context_structure_types ()
- {
- final Collection<DictType> result;
-
- result = new ArrayList<DictType>();
-
- for (final StackableRegisterContext src: context_by_name.values())
- {
- result.add(src.get_structure_type());
- }
-
- return result;
+ context.peekFirst().pop_hierarchical_instruction_level(instr_holder);
}
public Collection<Register> get_base_registers ()
@@ -325,7 +327,7 @@ public class RegisterManager
{
final Register r;
- r = parameter_context.reserve(p.get_type(), awaiting_inits);
+ r = parameter_context.reserve(p.get_type(), result);
result.add(new SetValue(r.get_address(), p));
@@ -335,7 +337,9 @@ public class RegisterManager
for (final Register r: used_registers)
{
/* Side-channel attack to pass parameters, because it's convenient. */
- r.set_is_in_use(false);
+ r.deactivate();
+ // Do not use the context to deactivate here, otherwise the value will
+ // be removed.
}
return result;
@@ -345,15 +349,17 @@ public class RegisterManager
{
final List<Register> used_registers;
final List<Instruction> result;
+ final List<Instruction> ignored_inits;
used_registers = new ArrayList<Register>();
result = new ArrayList<Instruction>();
+ ignored_inits = new ArrayList<Instruction>();
for (final Register p: params)
{
final Register r;
- r = parameter_context.reserve(p.get_type(), awaiting_inits);
+ r = parameter_context.reserve(p.get_type(), ignored_inits);
result.add(new SetValue(p.get_address(), r.get_value()));
@@ -363,20 +369,14 @@ public class RegisterManager
for (final Register r: used_registers)
{
/* Side-channel attack to pass parameters, because it's convenient. */
- r.set_is_in_use(false);
+ parameter_context.release(r, result);
}
return result;
}
- public List<Instruction> pop_initializes ()
+ public List<Instruction> get_initialization ()
{
- final List<Instruction> result;
-
- result = awaiting_inits;
-
- awaiting_inits = new ArrayList<Instruction>();
-
- return result;
+ return awaiting_inits;
}
}
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 8731d8c..83594b5 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
@@ -1,7 +1,5 @@
package tonkadur.wyrd.v1.compiler.util.registers;
-import java.util.Map;
-import java.util.HashMap;
import java.util.Collection;
import java.util.List;
import java.util.ArrayList;
@@ -26,16 +24,14 @@ 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.DictType;
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
{
- protected final Map<String, Type> context_structure_fields;
protected final RegisterContext base_context;
- protected final DictType context_structure;
protected final Register context_stack_level;
protected final Register context_stacks;
protected final Address current_context_address_holder;
@@ -52,15 +48,17 @@ class StackableRegisterContext extends RegisterContext
this.base_context = base_context;
- context_structure_fields = new HashMap<String, Type>();
+ context_stack_level = base_context.reserve(Type.INT, initialize_holder);
- context_structure = new DictType(context_name, context_structure_fields);
+ initialize_holder.add
+ (
+ new SetValue(context_stack_level.get_address(), Constant.ZERO)
+ );
- 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(DictType.WILD)),
initialize_holder
);
@@ -69,55 +67,27 @@ class StackableRegisterContext extends RegisterContext
(
context_stacks.get_address(),
new Cast(context_stack_level.get_value(), Type.STRING),
- new PointerType(context_structure)
+ new PointerType(DictType.WILD)
);
current_context_address =
new Address
(
new ValueOf(current_context_address_holder),
- context_structure
+ DictType.WILD
);
}
@Override
- protected Register create_register
- (
- final Type t,
- final String name,
- final List<Instruction> initialize_holder
- )
+ protected Register create_register (final Type t, final String name)
{
final Register result;
- if (context_structure.get_fields().get(name) != null)
- {
- System.err.println
- (
- "[P] Duplicate register '"
- + name
- + "' in stackable context "
- + this.name
- + "."
- );
- }
+ result = new Register(current_context_address, name);
- context_structure.get_fields().put(name, t);
+ result.activate(t);
- result =
- new Register
- (
- new RelativeAddress
- (
- current_context_address,
- new Constant(Type.STRING, name),
- t
- ),
- t,
- name
- );
-
- /* No need for this: it's part of the type. */
+ /* Handled elsewhere */
//initialize_holder.add(new Initialize(result.get_address(), t));
return result;
@@ -143,7 +113,7 @@ class StackableRegisterContext extends RegisterContext
new Initialize
(
current_context_address_holder,
- new PointerType(context_structure)
+ new PointerType(DictType.WILD)
)
);
@@ -152,7 +122,7 @@ class StackableRegisterContext extends RegisterContext
new SetValue
(
current_context_address_holder,
- new New(context_structure)
+ new New(DictType.WILD)
)
);
@@ -180,9 +150,4 @@ class StackableRegisterContext extends RegisterContext
return result;
}
-
- 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 cefe711..7d87c21 100644
--- a/src/core/src/tonkadur/wyrd/v1/lang/Register.java
+++ b/src/core/src/tonkadur/wyrd/v1/lang/Register.java
@@ -4,46 +4,42 @@ import tonkadur.wyrd.v1.lang.type.Type;
import tonkadur.wyrd.v1.lang.computation.Constant;
import tonkadur.wyrd.v1.lang.computation.Address;
+import tonkadur.wyrd.v1.lang.computation.RelativeAddress;
import tonkadur.wyrd.v1.lang.computation.ValueOf;
import tonkadur.wyrd.v1.lang.meta.Computation;
public class Register
{
- protected final Type type;
protected final String name;
- protected final Address address;
- protected final Computation value;
- protected boolean is_in_use;
+ protected final Address address_prefix;
+ protected Address address;
+ protected Computation value;
+ protected Type current_type;
- public Register (final Type type, final String name)
+ public Register (final String name)
{
this.name = name;
- this.type = type;
- address = new Address(new Constant(Type.STRING, name), type);
- value = new ValueOf(address);
- is_in_use = false;
+ address_prefix = null;
+ address = null;
+ value = null;
+ current_type = Type.INT;
}
- public Register
- (
- final Address address,
- final Type type,
- final String name
- )
+ public Register (final Address address_prefix, final String name)
{
- this.address = address;
+ this.address_prefix = address_prefix;
this.name = name;
- this.type = type;
- value = new ValueOf(address);
- is_in_use = false;
+ address = null;
+ value = null;
+ current_type = Type.INT;
}
public Type get_type ()
{
- return type;
+ return current_type;
}
public String get_name ()
@@ -61,13 +57,36 @@ public class Register
return value;
}
- public boolean get_is_in_use ()
+ public boolean is_active ()
+ {
+ return (address != null);
+ }
+
+ public void activate (final Type type)
{
- return is_in_use;
+ this.current_type = type;
+
+ if (address_prefix == null)
+ {
+ address = new Address(new Constant(Type.STRING, name), type);
+ }
+ else
+ {
+ address =
+ new RelativeAddress
+ (
+ address_prefix,
+ new Constant(Type.STRING, name),
+ type
+ );
+ }
+
+ value = new ValueOf(address);
}
- public void set_is_in_use (final boolean val)
+ public void deactivate ()
{
- is_in_use = val;
+ address = null;
+ value = null;
}
}
diff --git a/src/core/src/tonkadur/wyrd/v1/lang/type/DictType.java b/src/core/src/tonkadur/wyrd/v1/lang/type/DictType.java
index 239fa0c..b5ea5aa 100644
--- a/src/core/src/tonkadur/wyrd/v1/lang/type/DictType.java
+++ b/src/core/src/tonkadur/wyrd/v1/lang/type/DictType.java
@@ -1,9 +1,17 @@
package tonkadur.wyrd.v1.lang.type;
import java.util.Map;
+import java.util.HashMap;
public class DictType extends Type
{
+ public static final DictType WILD;
+
+ static
+ {
+ WILD = new DictType("wild dict", new HashMap<String, Type>());
+ }
+
protected Map<String, Type> fields;
public DictType (final String name, final Map<String, Type> fields)