summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornsensfel <SpamShield0@noot-noot.org>2020-09-08 14:33:01 +0200
committernsensfel <SpamShield0@noot-noot.org>2020-09-08 14:33:01 +0200
commit59d05224a5831b19668b879a9fe46bfc08dc0784 (patch)
tree0c5eb57a3c4e524a7af7e384351314280c2ee1d0
parent7d8ad25fb295d64c33f39273bc61b004a1bdb2af (diff)
Still has issues with removing already removed registers.
Looks to be related to context registers being removed after the context register holder itself was already removed.
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/Compiler.java22
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java22
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java179
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/SequenceCompiler.java52
-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.java24
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterManager.java4
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/registers/StackableRegisterContext.java11
-rw-r--r--src/core/src/tonkadur/wyrd/v1/lang/type/DictType.java8
-rw-r--r--src/core/src/tonkadur/wyrd/v1/lang/type/MapType.java2
-rw-r--r--src/core/src/tonkadur/wyrd/v1/lang/type/Type.java2
17 files changed, 212 insertions, 177 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 9dca78b..d246012 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
@@ -42,11 +42,9 @@ public class Compiler
compiler.compile_types(fate_world);
compiler.compile_variables(fate_world);
- compiler.compile_sequences(fate_world);
-
compiler.compile_main_sequence(fate_world);
- compiler.add_registers();
+ compiler.compile_sequences(fate_world);
return compiler.wyrd_world;
}
@@ -106,7 +104,8 @@ public class Compiler
final Register r;
t = TypeCompiler.compile(this, variable.get_type());
- r = registers.register(t, variable.get_name());
+ r = registers.register(t, variable.get_name(), init_instr);
+ wyrd_world.add_register(r);
}
this.assembler().handle_adding_instruction
@@ -144,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..312fa47 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);
@@ -1632,7 +1632,11 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor
context_name = compiler.registers().create_stackable_context_name();
- compiler.registers().create_stackable_context(context_name);
+ compiler.registers().create_stackable_context
+ (
+ context_name,
+ init_instructions
+ );
init_instructions.addAll
(
@@ -1796,7 +1800,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 +1827,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..0dfe2bb 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);
}
}
@@ -2073,7 +2088,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
for (final ComputationCompiler cc: parameter_ccs)
{
- cc.release_registers();
+ cc.release_registers(result);
}
}
@@ -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 16c5eae..5403ca6 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
@@ -24,19 +24,17 @@ public class SequenceCompiler
)
throws Throwable
{
- final List<Instruction> init_instructions;
+ final List<Instruction> init_instructions, pre_init;
final List<Register> parameters;
final List<Register> to_be_cleaned;
- final String end_of_sequence;
final InstructionCompiler ic;
init_instructions = new ArrayList<Instruction>();
+ pre_init = new ArrayList<Instruction>();
parameters = new ArrayList<Register>();
to_be_cleaned = new ArrayList<Register>();
ic = new InstructionCompiler(compiler);
- end_of_sequence = compiler.assembler().generate_label("<sequence#end>");
-
compiler.world().add_sequence_label
(
fate_sequence.get_name(),
@@ -47,25 +45,26 @@ public class SequenceCompiler
compiler.registers().create_stackable_context
(
- fate_sequence.get_name()
+ fate_sequence.get_name(),
+ pre_init
);
init_instructions.add
(
- new SetPC(compiler.assembler().get_label_constant(end_of_sequence))
+ compiler.assembler().mark
+ (
+ fate_sequence.get_name(),
+ compiler.assembler().merge(pre_init)
+ )
);
init_instructions.add
(
- compiler.assembler().mark
+ compiler.assembler().merge
(
- fate_sequence.get_name(),
- compiler.assembler().merge
+ compiler.registers().get_initialize_context_instructions
(
- compiler.registers().get_initialize_context_instructions
- (
- fate_sequence.get_name()
- )
+ fate_sequence.get_name()
)
)
);
@@ -83,7 +82,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,10 +97,16 @@ public class SequenceCompiler
compiler.registers().read_parameters(parameters)
);
+
fate_sequence.get_root().get_visited_by(ic);
init_instructions.add(ic.get_result());
+ for (final Register r: to_be_cleaned)
+ {
+ compiler.registers().release(r, init_instructions);
+ }
+
init_instructions.addAll
(
compiler.registers().get_finalize_context_instructions()
@@ -111,20 +117,11 @@ public class SequenceCompiler
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().mark_after
- (
- compiler.assembler().merge(init_instructions),
- end_of_sequence
- ),
+ compiler.assembler().merge(init_instructions),
compiler.world()
);
}
@@ -158,13 +155,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 e335374..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
@@ -192,11 +192,33 @@ 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, final List<Instruction> instr_holder)
{
+ 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();
}
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 9593eaf..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
@@ -172,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;
}
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 0ceaa4f..449a1ee 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
@@ -24,6 +24,7 @@ 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;
@@ -51,7 +52,7 @@ class StackableRegisterContext extends RegisterContext
context_stacks =
base_context.reserve
(
- new MapType(new PointerType(MapType.MAP_TO_ANY)),
+ new MapType(new PointerType(DictType.WILD)),
initialize_holder
);
@@ -60,14 +61,14 @@ class StackableRegisterContext extends RegisterContext
(
context_stacks.get_address(),
new Cast(context_stack_level.get_value(), Type.STRING),
- new PointerType(MapType.MAP_TO_ANY)
+ new PointerType(DictType.WILD)
);
current_context_address =
new Address
(
new ValueOf(current_context_address_holder),
- MapType.MAP_TO_ANY
+ DictType.WILD
);
}
@@ -106,7 +107,7 @@ class StackableRegisterContext extends RegisterContext
new Initialize
(
current_context_address_holder,
- new PointerType(MapType.MAP_TO_ANY)
+ new PointerType(DictType.WILD)
)
);
@@ -115,7 +116,7 @@ class StackableRegisterContext extends RegisterContext
new SetValue
(
current_context_address_holder,
- new New(MapType.MAP_TO_ANY)
+ new New(DictType.WILD)
)
);
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)
diff --git a/src/core/src/tonkadur/wyrd/v1/lang/type/MapType.java b/src/core/src/tonkadur/wyrd/v1/lang/type/MapType.java
index 7773fac..c9586ee 100644
--- a/src/core/src/tonkadur/wyrd/v1/lang/type/MapType.java
+++ b/src/core/src/tonkadur/wyrd/v1/lang/type/MapType.java
@@ -7,7 +7,6 @@ public class MapType extends Type
public static final MapType MAP_TO_INT;
public static final MapType MAP_TO_STRING;
public static final MapType MAP_TO_RICH_TEXT;
- public static final MapType MAP_TO_ANY;
static
{
@@ -16,7 +15,6 @@ public class MapType extends Type
MAP_TO_INT = new MapType(Type.INT);
MAP_TO_RICH_TEXT = new MapType(Type.RICH_TEXT);
MAP_TO_STRING = new MapType(Type.STRING);
- MAP_TO_ANY = new MapType(Type.ANY);
}
/***************************************************************************/
diff --git a/src/core/src/tonkadur/wyrd/v1/lang/type/Type.java b/src/core/src/tonkadur/wyrd/v1/lang/type/Type.java
index 6f87094..d123104 100644
--- a/src/core/src/tonkadur/wyrd/v1/lang/type/Type.java
+++ b/src/core/src/tonkadur/wyrd/v1/lang/type/Type.java
@@ -7,7 +7,6 @@ public class Type
public static final Type INT;
public static final Type RICH_TEXT;
public static final Type STRING;
- public static final Type ANY;
static
{
@@ -16,7 +15,6 @@ public class Type
INT = new Type("int");
RICH_TEXT = new Type("rich_text");
STRING = new Type("string");
- ANY = new Type("any");
}
/***************************************************************************/