summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/Compiler.java2
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/SequenceCompiler.java6
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterContext.java34
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterManager.java72
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/registers/StackableRegisterContext.java48
-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
7 files changed, 66 insertions, 100 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 4dc56d6..9dca78b 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
);
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..16c5eae 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
@@ -120,12 +120,6 @@ public class SequenceCompiler
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),
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 24ec2eb..e335374 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
{
@@ -78,13 +79,17 @@ class RegisterContext
{
r.activate(t);
+ initialize_holder.add(new Initialize(r.get_address(), t));
+
return r;
}
}
name = (name_prefix + Integer.toString(generated_registers++));
- result = create_register(t, name, initialize_holder);
+ result = create_register(t, name);
+
+ initialize_holder.add(new Initialize(result.get_address(), t));
anonymous_registers.add(result);
@@ -102,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)
{
@@ -114,6 +119,8 @@ class RegisterContext
);
}
+ initialize_holder.add(new Initialize(result.get_address(), t));
+
register_by_name.put(name, result);
return result;
@@ -141,9 +148,9 @@ 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);
@@ -158,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);
}
}
@@ -185,25 +195,19 @@ class RegisterContext
return register_by_name.get(name);
}
- public void release (final Register r)
+ public void release (final Register r, final List<Instruction> instr_holder)
{
+ 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(name);
result.activate(t);
- initialize_holder.add(new Initialize(result.get_address(), 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 da5b063..9593eaf 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)
@@ -289,23 +298,12 @@ public class RegisterManager
context.peekFirst().push_hierarchical_instruction_level();
}
- public void pop_hierarchical_instruction_level ()
- {
- context.peekFirst().pop_hierarchical_instruction_level();
- }
-
- public Collection<DictType> get_context_structure_types ()
+ public void pop_hierarchical_instruction_level
+ (
+ final List<Instruction> instr_holder
+ )
{
- 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 +323,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));
@@ -336,6 +334,8 @@ public class RegisterManager
{
/* Side-channel attack to pass parameters, because it's convenient. */
r.deactivate();
+ // Do not use the context to deactivate here, otherwise the value will
+ // be removed.
}
return result;
@@ -345,15 +345,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 +365,14 @@ public class RegisterManager
for (final Register r: used_registers)
{
/* Side-channel attack to pass parameters, because it's convenient. */
- r.deactivate();
+ 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 5f38107..0ceaa4f 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;
@@ -28,14 +26,11 @@ import tonkadur.wyrd.v1.lang.instruction.Initialize;
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
{
- 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 +47,11 @@ class StackableRegisterContext extends RegisterContext
this.base_context = base_context;
- context_structure_fields = new HashMap<String, Type>();
-
- context_structure = new DictType(context_name, context_structure_fields);
-
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(MapType.MAP_TO_ANY)),
initialize_holder
);
@@ -69,45 +60,27 @@ class StackableRegisterContext extends RegisterContext
(
context_stacks.get_address(),
new Cast(context_stack_level.get_value(), Type.STRING),
- new PointerType(context_structure)
+ new PointerType(MapType.MAP_TO_ANY)
);
current_context_address =
new Address
(
new ValueOf(current_context_address_holder),
- context_structure
+ MapType.MAP_TO_ANY
);
}
@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
- + "."
- );
- }
-
- context_structure.get_fields().put(name, Type.INT);
-
result = new Register(current_context_address, name);
+
result.activate(t);
- /* No need for this: it's part of the type. */
+ /* Handled elsewhere */
//initialize_holder.add(new Initialize(result.get_address(), t));
return result;
@@ -133,7 +106,7 @@ class StackableRegisterContext extends RegisterContext
new Initialize
(
current_context_address_holder,
- new PointerType(context_structure)
+ new PointerType(MapType.MAP_TO_ANY)
)
);
@@ -142,7 +115,7 @@ class StackableRegisterContext extends RegisterContext
new SetValue
(
current_context_address_holder,
- new New(context_structure)
+ new New(MapType.MAP_TO_ANY)
)
);
@@ -170,9 +143,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/type/MapType.java b/src/core/src/tonkadur/wyrd/v1/lang/type/MapType.java
index c9586ee..7773fac 100644
--- a/src/core/src/tonkadur/wyrd/v1/lang/type/MapType.java
+++ b/src/core/src/tonkadur/wyrd/v1/lang/type/MapType.java
@@ -7,6 +7,7 @@ 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
{
@@ -15,6 +16,7 @@ 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 d123104..6f87094 100644
--- a/src/core/src/tonkadur/wyrd/v1/lang/type/Type.java
+++ b/src/core/src/tonkadur/wyrd/v1/lang/type/Type.java
@@ -7,6 +7,7 @@ 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
{
@@ -15,6 +16,7 @@ public class Type
INT = new Type("int");
RICH_TEXT = new Type("rich_text");
STRING = new Type("string");
+ ANY = new Type("any");
}
/***************************************************************************/