| summaryrefslogtreecommitdiff |
diff options
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"); } /***************************************************************************/ |


