From 47178c4bd7d7e8b0d328b047fcf07ced64693a01 Mon Sep 17 00:00:00 2001 From: Fyodor Soikin Date: Sun, 6 Jul 2014 00:41:49 -0400 Subject: [PATCH] Open certain aspects of VM state (frames, environments, stack, etc.) to enable inspection of a running program. --- csharp/NShovel/Shovel/Api.cs | 14 ++- csharp/NShovel/Shovel/Callable.cs | 8 +- .../Shovel/Serialization/VmStateSerializer.cs | 23 ++--- csharp/NShovel/Shovel/StructInstance.cs | 5 +- csharp/NShovel/Shovel/Value.cs | 86 +++++++++++++++---- csharp/NShovel/Shovel/Vm/Prim0.cs | 36 ++++---- csharp/NShovel/Shovel/Vm/Types/NamedBlock.cs | 13 ++- .../NShovel/Shovel/Vm/Types/ReturnAddress.cs | 11 ++- csharp/NShovel/Shovel/Vm/Types/VmEnvFrame.cs | 17 ++-- .../NShovel/Shovel/Vm/Types/VmEnvironment.cs | 9 +- csharp/NShovel/Shovel/Vm/Vm.cs | 75 ++++++++-------- 11 files changed, 180 insertions(+), 117 deletions(-) diff --git a/csharp/NShovel/Shovel/Api.cs b/csharp/NShovel/Shovel/Api.cs index 54c18c3..1058b5a 100644 --- a/csharp/NShovel/Shovel/Api.cs +++ b/csharp/NShovel/Shovel/Api.cs @@ -26,6 +26,8 @@ using System.Linq; using System.Security.Cryptography; using Shovel.Exceptions; +using Shovel.Vm.Types; +using Shovel.Vm; namespace Shovel { @@ -214,6 +216,14 @@ public static Value CheckStackTop (Vm.Vm vm) return vm.CheckStackTop (); } + public static IEnumerable GetUsedStack( Vm.Vm vm ) { + return vm.GetUsedStack(); + } + + public static VmEnvironment GetCurrentEnvironment( Vm.Vm vm ) { + return vm.GetCurrentEnvironment(); + } + public static void WakeUpVm (Vm.Vm vm) { vm.WakeUp (); @@ -253,7 +263,7 @@ public static Value GetStructInstanceValue(StructInstance str, string key, Value { for (int i = 0; i < str.Struct.Fields.Length; i++) { if (str.Struct.Fields[i] == key) { - return str.Values[i]; + return str.values[i]; } } return defaultValue; @@ -263,7 +273,7 @@ public static bool SetStructInstanceValue(StructInstance str, string key, Value { for (int i = 0; i < str.Struct.Fields.Length; i++) { if (str.Struct.Fields[i] == key) { - str.Values[i] = newValue; + str.values[i] = newValue; return true; } } diff --git a/csharp/NShovel/Shovel/Callable.cs b/csharp/NShovel/Shovel/Callable.cs index 889a4b1..93c1bff 100644 --- a/csharp/NShovel/Shovel/Callable.cs +++ b/csharp/NShovel/Shovel/Callable.cs @@ -41,7 +41,7 @@ public class Callable // The next two fields are only used if this is a ShovelScript closure. internal int? ProgramCounter { get; set; } - internal Vm.Types.VmEnvironment Environment { get; set; } + public Vm.VmEnvironment Environment { get; internal set; } internal Func RequiredPrimitive { get; set; } @@ -95,8 +95,6 @@ internal static Func MakeHostCallable ( Func callable) { return (vmapi, args, start, length) => callable (vmapi, args [start], args [start + 1], args [start + 2]); - } - + } } -} - +} \ No newline at end of file diff --git a/csharp/NShovel/Shovel/Serialization/VmStateSerializer.cs b/csharp/NShovel/Shovel/Serialization/VmStateSerializer.cs index 2463b00..8cdf8f2 100644 --- a/csharp/NShovel/Shovel/Serialization/VmStateSerializer.cs +++ b/csharp/NShovel/Shovel/Serialization/VmStateSerializer.cs @@ -24,7 +24,8 @@ using System.IO; using Shovel.Vm.Types; using System.Text; -using System.Linq; +using System.Linq; +using Shovel.Vm; namespace Shovel.Serialization { @@ -433,8 +434,8 @@ VmEnvFrame RebuildEnvFrame ( var result = new VmEnvFrame (); objects [index] = result; - result.VarNames = (string[])reader (composite.Elements [0]); - result.Values = (Value[])reader (composite.Elements [1]); + result.VarNamesInternal = (string[])reader (composite.Elements [0]); + result.ValuesInernal = (Value[])reader (composite.Elements [1]); result.IntroducedAtProgramCounter = (int)(long)reader (composite.Elements [2]); return result; @@ -457,7 +458,7 @@ StructInstance RebuildStructInstance ( objects [index] = result; result.Struct = (Struct)reader (composite.Elements [0]); - result.Values = (Value[])reader (composite.Elements [1]); + result.values = (Value[])reader (composite.Elements [1]); return result; } @@ -670,8 +671,8 @@ int SerializeEnvFrame (VmEnvFrame frame, object obj) Elements = new int[3] }; var result = SerializeOneHashed (composite, obj); - composite.Elements [0] = Serialize (frame.VarNames); - composite.Elements [1] = Serialize (frame.Values); + composite.Elements [0] = Serialize (frame.VarNamesInternal); + composite.Elements [1] = Serialize (frame.ValuesInernal); composite.Elements [2] = SerializeOne (frame.IntroducedAtProgramCounter); return result; } @@ -695,7 +696,7 @@ int SerializeStructInstance (StructInstance structInstance, object obj) }; var result = SerializeOneHashed (composite, obj); composite.Elements [0] = Serialize (structInstance.Struct); - composite.Elements [1] = SerializeShovelValueArray (structInstance.Values); + composite.Elements [1] = SerializeShovelValueArray (structInstance.values); return result; } @@ -717,15 +718,15 @@ int SerializeShovelValue (Value sv, object obj) case Value.Kinds.Hash: return SerializeHash (sv.hashValue, obj); case Value.Kinds.Callable: - return SerializeCallable (sv.CallableValue, obj); + return SerializeCallable (sv.callableValue, obj); case Value.Kinds.ReturnAddress: - return SerializeReturnAddress (sv.ReturnAddressValue, obj); + return SerializeReturnAddress (sv.returnAddressValue, obj); case Value.Kinds.NamedBlock: - return SerializeNamedBlock (sv.NamedBlockValue, obj); + return SerializeNamedBlock (sv.namedBlockValue, obj); case Value.Kinds.Struct: return SerializeStruct (sv.StructValue, obj); case Value.Kinds.StructInstance: - return SerializeStructInstance (sv.StructInstanceValue, obj); + return SerializeStructInstance (sv.structInstanceValue, obj); default: Shovel.Utils.Panic (); throw new InvalidOperationException (); diff --git a/csharp/NShovel/Shovel/StructInstance.cs b/csharp/NShovel/Shovel/StructInstance.cs index 4e8c902..7eb9c4c 100644 --- a/csharp/NShovel/Shovel/StructInstance.cs +++ b/csharp/NShovel/Shovel/StructInstance.cs @@ -1,11 +1,14 @@ using System; +using System.Collections.Generic; namespace Shovel { public class StructInstance { internal Struct Struct; - internal Value[] Values; + internal Value[] values; + + public IEnumerable Values { get { return values; } } } } diff --git a/csharp/NShovel/Shovel/Value.cs b/csharp/NShovel/Shovel/Value.cs index 917403b..0ab6a71 100644 --- a/csharp/NShovel/Shovel/Value.cs +++ b/csharp/NShovel/Shovel/Value.cs @@ -226,15 +226,63 @@ public Either> HashValue } [FieldOffset(8)] - internal Callable CallableValue; - [FieldOffset(8)] - internal ReturnAddress ReturnAddressValue; + internal Callable callableValue; + + public Either CallableValue { + get { + if ( Kind == Kinds.Callable ) { + return new Either( this.callableValue ); + } + else { + return new Either( new ShovelException( "Value is not a callable.", null ) ); + } + } + } + [FieldOffset(8)] - internal NamedBlock NamedBlockValue; + internal StructInstance structInstanceValue; + + public Either StructInstanceValue { + get { + if ( Kind == Kinds.StructInstance ) { + return new Either( this.structInstanceValue ); + } + else { + return new Either( new ShovelException( "Value is not a struct instance.", null ) ); + } + } + } + + [FieldOffset( 8 )] + internal NamedBlock namedBlockValue; + + public Either NamedBlockValue { + get { + if ( Kind == Kinds.NamedBlock ) { + return new Either( this.namedBlockValue ); + } + else { + return new Either( new ShovelException( "Value is not a named block.", null ) ); + } + } + } + [FieldOffset(8)] - internal Struct StructValue; + internal ReturnAddress returnAddressValue; + + public Either ReturnAddressValue { + get { + if ( Kind == Kinds.ReturnAddress ) { + return new Either( this.returnAddressValue ); + } + else { + return new Either( new ShovelException( "Value is not a return address.", null ) ); + } + } + } + [FieldOffset(8)] - public StructInstance StructInstanceValue; + internal Struct StructValue; static Value value; @@ -255,7 +303,7 @@ public static Value Make(StructInstance structInstance) { Value result = value; result.Kind = Kinds.StructInstance; - result.StructInstanceValue = structInstance; + result.structInstanceValue = structInstance; return result; } @@ -320,7 +368,7 @@ internal static Value Make (Callable c) { Value result = value; result.Kind = Kinds.Callable; - result.CallableValue = c; + result.callableValue = c; return result; } @@ -328,7 +376,7 @@ internal static Value Make (ReturnAddress ra) { Value result = value; result.Kind = Kinds.ReturnAddress; - result.ReturnAddressValue = ra; + result.returnAddressValue = ra; return result; } @@ -336,7 +384,7 @@ internal static Value Make (NamedBlock nb) { Value result = value; result.Kind = Kinds.NamedBlock; - result.NamedBlockValue = nb; + result.namedBlockValue = nb; return result; } @@ -362,15 +410,15 @@ public override bool Equals (object obj) case Kinds.Hash: return sv.Kind == Kinds.Hash && this.hashValue == sv.hashValue; case Kinds.Callable: - return sv.Kind == Kinds.Callable && this.CallableValue == sv.CallableValue; + return sv.Kind == Kinds.Callable && Equals( this.callableValue, sv.callableValue ); case Kinds.ReturnAddress: - return sv.Kind == Kinds.ReturnAddress && this.ReturnAddressValue == sv.ReturnAddressValue; + return sv.Kind == Kinds.ReturnAddress && Equals( this.returnAddressValue, sv.returnAddressValue ); case Kinds.NamedBlock: - return sv.Kind == Kinds.NamedBlock && this.NamedBlockValue == sv.NamedBlockValue; + return sv.Kind == Kinds.NamedBlock && Equals( this.namedBlockValue, sv.namedBlockValue ); case Kinds.Struct: - return sv.Kind == Kinds.Struct && this.StructValue == sv.StructValue; + return sv.Kind == Kinds.Struct && Equals( this.StructValue, sv.StructValue ); case Kinds.StructInstance: - return sv.Kind == Kinds.StructInstance && this.StructInstanceValue == sv.StructInstanceValue; + return sv.Kind == Kinds.StructInstance && Equals( this.structInstanceValue, sv.structInstanceValue ); default: Utils.Panic (); throw new InvalidOperationException (); @@ -395,15 +443,15 @@ public override int GetHashCode () case Kinds.Hash: return this.hashValue.GetHashCode (); case Kinds.Callable: - return this.CallableValue.GetHashCode (); + return this.callableValue.GetHashCode (); case Kinds.ReturnAddress: - return this.ReturnAddressValue.GetHashCode (); + return this.returnAddressValue.GetHashCode (); case Kinds.NamedBlock: - return this.NamedBlockValue.GetHashCode (); + return this.namedBlockValue.GetHashCode (); case Kinds.Struct: return this.StructValue.GetHashCode(); case Kinds.StructInstance: - return this.StructInstanceValue.GetHashCode(); + return this.structInstanceValue.GetHashCode(); default: Utils.Panic (); throw new InvalidOperationException (); diff --git a/csharp/NShovel/Shovel/Vm/Prim0.cs b/csharp/NShovel/Shovel/Vm/Prim0.cs index 2f30c85..9b0fb0a 100644 --- a/csharp/NShovel/Shovel/Vm/Prim0.cs +++ b/csharp/NShovel/Shovel/Vm/Prim0.cs @@ -102,14 +102,14 @@ static Value HashToStruct (VmApi api, Value[] args, int start, int length) var ztruct = args [start].StructValue; var result = new StructInstance (); result.Struct = ztruct; - result.Values = new Value[ztruct.Fields.Length]; + result.values = new Value[ztruct.Fields.Length]; var hash = args [start + 1].hashValue; var sizeIncrease = 1 + ztruct.Fields.Length; api.CellsIncrementHerald (sizeIncrease); for (int i = 0; i < ztruct.Fields.Length; i++) { var svKey = Value.Make (ztruct.Fields [i]); if (hash.ContainsKey (svKey)) { - result.Values [i] = hash [svKey]; + result.values [i] = hash [svKey]; } } api.CellsIncrementer (sizeIncrease); @@ -122,12 +122,12 @@ static Value StructToHash (VmApi api, Value[] args, int start, int length) api.RaiseShovelError ("First argument must be a struct instance."); } var result = new HashInstance (); - var structInstance = args [start].StructInstanceValue; + var structInstance = args [start].structInstanceValue; var ztruct = structInstance.Struct; var sizeIncrease = 1 + 2 * ztruct.Fields.Length; api.CellsIncrementHerald (sizeIncrease); for (int i = 0; i < ztruct.Fields.Length; i++) { - result [Value.Make (ztruct.Fields [i])] = structInstance.Values [i]; + result [Value.Make (ztruct.Fields [i])] = structInstance.values [i]; } api.CellsIncrementer (sizeIncrease); return Value.Make (result); @@ -146,9 +146,9 @@ static Value InstantiateStruct (VmApi api, Value[] args, int start, int length) api.CellsIncrementHerald (sizeIncrease); var result = new StructInstance (); result.Struct = ztruct; - result.Values = new Value[ztruct.Fields.Length]; + result.values = new Value[ztruct.Fields.Length]; for (int i = 1; i < length; i++) { - result.Values [i - 1] = args [start + i]; + result.values [i - 1] = args [start + i]; } api.CellsIncrementer (sizeIncrease); return Value.Make (result); @@ -913,17 +913,17 @@ internal static bool HashOrStructGetDot (Vm vm, VmApi api, ref Value obj, ref Va } if (obj.Kind == Value.Kinds.StructInstance) { var cache = vm.GetCurrentCache (); - var structInstance = obj.StructInstanceValue; + var structInstance = obj.structInstanceValue; var ztruct = structInstance.Struct; if (cache != null) { var info = (Tuple)cache; if (info.Item1 == ztruct) { - obj = structInstance.Values [info.Item2]; + obj = structInstance.values [info.Item2]; return true; } } int location = FindLocationInStruct (api, ztruct, index.stringValue); - obj = structInstance.Values [location]; + obj = structInstance.values [location]; vm.SetCurrentCache (Tuple.Create (ztruct, location)); } else if (obj.Kind == Value.Kinds.Hash) { if (!obj.hashValue.ContainsKey (index)) { @@ -946,17 +946,17 @@ internal static bool HashOrStructDotSet ( { if (obj.Kind == Value.Kinds.StructInstance) { var cache = vm.GetCurrentCache (); - var structInstance = obj.StructInstanceValue; + var structInstance = obj.structInstanceValue; var ztruct = structInstance.Struct; if (cache != null) { var info = (Tuple)cache; if (info.Item1 == ztruct) { - structInstance.Values [info.Item2] = value; + structInstance.values [info.Item2] = value; return true; } } int location = FindLocationInStruct (api, ztruct, index.stringValue); - structInstance.Values [location] = value; + structInstance.values [location] = value; vm.SetCurrentCache (Tuple.Create (ztruct, location)); } else if (obj.Kind == Value.Kinds.Hash) { return HashSet(api, ref obj, ref index, ref value); @@ -1062,12 +1062,12 @@ static void AdjustRealStartEnd (VmApi api, ref int realStart, ref int realEnd, i static Value SetHandlers(VmApi api, Value arrayOrHash, Value getter, Value setter) { - if (getter.Kind != Value.Kinds.Null && (getter.Kind != Value.Kinds.Callable || getter.CallableValue.Arity != 2)) + if (getter.Kind != Value.Kinds.Null && (getter.Kind != Value.Kinds.Callable || getter.callableValue.Arity != 2)) { api.RaiseShovelError("The second parameter (getter) should be a callable with 2 parameters."); throw new InvalidOperationException(); } - if (setter.Kind != Value.Kinds.Null && (setter.Kind != Value.Kinds.Callable || setter.CallableValue.Arity != 3)) + if (setter.Kind != Value.Kinds.Null && (setter.Kind != Value.Kinds.Callable || setter.callableValue.Arity != 3)) { api.RaiseShovelError("The third parameter (setter) should be a callable with 3 parameters."); throw new InvalidOperationException(); @@ -1299,7 +1299,7 @@ internal static void IsStructInstance (VmApi api, ref Value obj, ref Value str) if (str.Kind != Value.Kinds.Struct) { api.RaiseShovelError ("Second argument must be a struct."); } - var result = obj.Kind == Value.Kinds.StructInstance && obj.StructInstanceValue.Struct == str.StructValue; + var result = obj.Kind == Value.Kinds.StructInstance && obj.structInstanceValue.Struct == str.StructValue; obj.boolValue = result; obj.Kind = Value.Kinds.Bool; } @@ -1391,11 +1391,11 @@ private static string ShovelStringRepresentationImpl ( var sb = new StringBuilder (); sb.Append ("make("); var pieces = new List (); - var structInstance = obj.StructInstanceValue; + var structInstance = obj.structInstanceValue; var ztruct = structInstance.Struct; pieces.Add (StructAsString (ztruct)); - for (var i = 0; i < structInstance.Values.Length; i++) { - pieces.Add (ShovelStringRepresentationImpl (api, structInstance.Values [i], visited)); + for (var i = 0; i < structInstance.values.Length; i++) { + pieces.Add (ShovelStringRepresentationImpl (api, structInstance.values [i], visited)); } sb.Append (String.Join (", ", pieces)); sb.Append (")"); diff --git a/csharp/NShovel/Shovel/Vm/Types/NamedBlock.cs b/csharp/NShovel/Shovel/Vm/Types/NamedBlock.cs index 1fc316e..bae6f58 100644 --- a/csharp/NShovel/Shovel/Vm/Types/NamedBlock.cs +++ b/csharp/NShovel/Shovel/Vm/Types/NamedBlock.cs @@ -24,14 +24,13 @@ namespace Shovel.Vm.Types { - internal class NamedBlock - { - internal string Name { get; set; } + public class NamedBlock + { + internal string Name { get; set; } - internal int BlockEnd { get; set; } - - internal VmEnvironment Environment { get; set; } - } + internal int BlockEnd { get; set; } + public VmEnvironment Environment { get; internal set; } + } } diff --git a/csharp/NShovel/Shovel/Vm/Types/ReturnAddress.cs b/csharp/NShovel/Shovel/Vm/Types/ReturnAddress.cs index 34a2b60..1e2cf96 100644 --- a/csharp/NShovel/Shovel/Vm/Types/ReturnAddress.cs +++ b/csharp/NShovel/Shovel/Vm/Types/ReturnAddress.cs @@ -23,12 +23,11 @@ namespace Shovel.Vm.Types { - internal class ReturnAddress - { - internal VmEnvironment Environment { get; set; } + public class ReturnAddress + { + public VmEnvironment Environment { get; internal set; } - internal int ProgramCounter { get; set; } - - } + internal int ProgramCounter { get; set; } + } } diff --git a/csharp/NShovel/Shovel/Vm/Types/VmEnvFrame.cs b/csharp/NShovel/Shovel/Vm/Types/VmEnvFrame.cs index 3bc1277..aa0d78e 100644 --- a/csharp/NShovel/Shovel/Vm/Types/VmEnvFrame.cs +++ b/csharp/NShovel/Shovel/Vm/Types/VmEnvFrame.cs @@ -22,15 +22,18 @@ using System; using System.Collections.Generic; -namespace Shovel.Vm.Types +namespace Shovel.Vm { - internal class VmEnvFrame - { - internal string[] VarNames { get; set; } + public class VmEnvFrame + { + public IEnumerable Names { get { return VarNamesInternal; } } + public IEnumerable Values { get { return ValuesInernal; } } - internal Value[] Values { get; set; } + internal string[] VarNamesInternal { get; set; } - internal int? IntroducedAtProgramCounter; - } + internal Value[] ValuesInernal { get; set; } + + internal int? IntroducedAtProgramCounter; + } } diff --git a/csharp/NShovel/Shovel/Vm/Types/VmEnvironment.cs b/csharp/NShovel/Shovel/Vm/Types/VmEnvironment.cs index be5fd34..5222374 100644 --- a/csharp/NShovel/Shovel/Vm/Types/VmEnvironment.cs +++ b/csharp/NShovel/Shovel/Vm/Types/VmEnvironment.cs @@ -22,13 +22,12 @@ using System; using System.Linq; -namespace Shovel.Vm.Types +namespace Shovel.Vm { - internal class VmEnvironment + public class VmEnvironment { - internal VmEnvFrame Frame { get; set; } - - internal VmEnvironment Next { get; set; } + public VmEnvFrame Frame { get; internal set; } + public VmEnvironment Next { get; internal set; } } } diff --git a/csharp/NShovel/Shovel/Vm/Vm.cs b/csharp/NShovel/Shovel/Vm/Vm.cs index 827f3a0..04f56d0 100644 --- a/csharp/NShovel/Shovel/Vm/Vm.cs +++ b/csharp/NShovel/Shovel/Vm/Vm.cs @@ -143,7 +143,10 @@ internal Value CheckStackTop () Utils.Panic (); } return this.stack.Top (); - } + } + + internal IEnumerable GetUsedStack() { return this.stack.GetUsedStack(); } + internal VmEnvironment GetCurrentEnvironment() { return this.currentEnvironment; } #endregion @@ -221,9 +224,9 @@ static string DumpShovelValue (VmApi api, Value obj) } else if (obj.Kind == Value.Kinds.Null) { return Prim0.ShovelStringRepresentation (api, obj).stringValue; } else if (obj.Kind == Value.Kinds.ReturnAddress) { - return String.Format ("Return to {0}", obj.ReturnAddressValue.ProgramCounter); + return String.Format ("Return to {0}", obj.returnAddressValue.ProgramCounter); } else if (obj.Kind == Value.Kinds.NamedBlock) { - return String.Format ("Named block {0} to {0}", obj.NamedBlockValue.Name, obj.NamedBlockValue.BlockEnd); + return String.Format ("Named block {0} to {0}", obj.namedBlockValue.Name, obj.namedBlockValue.BlockEnd); } else { throw new InvalidOperationException (); } @@ -779,7 +782,7 @@ static void HandleCallImpl (Vm vm, int numArgs, bool saveReturnAddress, bool inA "Object [{0}] is not callable.", Prim0.ShovelStringRepresentation (vm.api, maybeCallable)) ); } - var callable = maybeCallable.CallableValue; + var callable = maybeCallable.callableValue; if (callable.ProgramCounter.HasValue) { vm.stack.Pop (); CallFunction (callable, vm, numArgs, saveReturnAddress, inApply); @@ -838,7 +841,7 @@ static void FinishPrimitiveCall ( } else { var maybeRa = vm.stack.PopTop (); if (maybeRa.Kind == Value.Kinds.ReturnAddress) { - vm.ApplyReturnAddress (maybeRa.ReturnAddressValue); + vm.ApplyReturnAddress (maybeRa.returnAddressValue); } else { Utils.Panic (); } @@ -958,7 +961,7 @@ static void HandleLset (Vm vm) static void SetInEnvironment ( VmEnvironment env, int frameNumber, int varIndex, Value value) { - FindFrame (env, frameNumber).Values [varIndex] = value; + FindFrame (env, frameNumber).ValuesInernal [varIndex] = value; } static VmEnvFrame FindFrame (VmEnvironment env, int frameNumber) @@ -983,14 +986,14 @@ static void HandleLget (Vm vm) { var instruction = vm.CurrentInstruction (); var args = (int[])instruction.Arguments; - vm.stack.Push (FindFrame (vm.currentEnvironment, args [0]).Values [args [1]]); + vm.stack.Push (FindFrame (vm.currentEnvironment, args [0]).ValuesInernal [args [1]]); vm.IncrementCells (1); vm.programCounter++; } static Value GetFromEnvironment (VmEnvironment env, int frameNumber, int varIndex) { - return FindFrame (env, frameNumber).Values [varIndex]; + return FindFrame (env, frameNumber).ValuesInernal [varIndex]; } static void HandleFn (Vm vm) @@ -1019,8 +1022,8 @@ static void HandleNewFrame (Vm vm) var instruction = vm.CurrentInstruction (); var args = (string[])instruction.Arguments; var frame = new VmEnvFrame () { - VarNames = args, - Values = new Value[args.Length], + VarNamesInternal = args, + ValuesInernal = new Value[args.Length], IntroducedAtProgramCounter = vm.programCounter }; var newEnv = new VmEnvironment () { @@ -1047,7 +1050,7 @@ static void HandleArgs (Vm vm) if (vm.stack.Top ().Kind == Value.Kinds.ReturnAddress) { returnAddress = vm.stack.PopTop (); } - var values = vm.currentEnvironment.Frame.Values; + var values = vm.currentEnvironment.Frame.ValuesInernal; Array.Copy ( vm.stack.Storage, vm.stack.Count - argCount, values, 0, argCount); @@ -1062,10 +1065,10 @@ static void HandleArgs (Vm vm) static void HandleArgs1 (Vm vm) { if (vm.stack.TopIsReturnAddress ()) { - vm.currentEnvironment.Frame.Values [0] = vm.stack.UnderTopOne (); + vm.currentEnvironment.Frame.ValuesInernal [0] = vm.stack.UnderTopOne (); vm.stack.UnderPopOneAndCopyTop (); } else { - vm.currentEnvironment.Frame.Values [0] = vm.stack.PopTop (); + vm.currentEnvironment.Frame.ValuesInernal [0] = vm.stack.PopTop (); } vm.programCounter++; } @@ -1073,12 +1076,12 @@ static void HandleArgs1 (Vm vm) static void HandleArgs2 (Vm vm) { if (vm.stack.TopIsReturnAddress ()) { - vm.currentEnvironment.Frame.Values [0] = vm.stack.UnderTop (2); - vm.currentEnvironment.Frame.Values [1] = vm.stack.UnderTop (1); + vm.currentEnvironment.Frame.ValuesInernal [0] = vm.stack.UnderTop (2); + vm.currentEnvironment.Frame.ValuesInernal [1] = vm.stack.UnderTop (1); vm.stack.UnderPopAndCopyTop (2); } else { - vm.currentEnvironment.Frame.Values [1] = vm.stack.PopTop (); - vm.currentEnvironment.Frame.Values [0] = vm.stack.PopTop (); + vm.currentEnvironment.Frame.ValuesInernal [1] = vm.stack.PopTop (); + vm.currentEnvironment.Frame.ValuesInernal [0] = vm.stack.PopTop (); } vm.programCounter++; } @@ -1086,14 +1089,14 @@ static void HandleArgs2 (Vm vm) static void HandleArgs3 (Vm vm) { if (vm.stack.TopIsReturnAddress ()) { - vm.currentEnvironment.Frame.Values [0] = vm.stack.UnderTop (3); - vm.currentEnvironment.Frame.Values [1] = vm.stack.UnderTop (2); - vm.currentEnvironment.Frame.Values [2] = vm.stack.UnderTop (1); + vm.currentEnvironment.Frame.ValuesInernal [0] = vm.stack.UnderTop (3); + vm.currentEnvironment.Frame.ValuesInernal [1] = vm.stack.UnderTop (2); + vm.currentEnvironment.Frame.ValuesInernal [2] = vm.stack.UnderTop (1); vm.stack.UnderPopAndCopyTop (3); } else { - vm.currentEnvironment.Frame.Values [2] = vm.stack.PopTop (); - vm.currentEnvironment.Frame.Values [1] = vm.stack.PopTop (); - vm.currentEnvironment.Frame.Values [0] = vm.stack.PopTop (); + vm.currentEnvironment.Frame.ValuesInernal [2] = vm.stack.PopTop (); + vm.currentEnvironment.Frame.ValuesInernal [1] = vm.stack.PopTop (); + vm.currentEnvironment.Frame.ValuesInernal [0] = vm.stack.PopTop (); } vm.programCounter++; } @@ -1104,7 +1107,7 @@ static void HandleReturn (Vm vm) var result = vm.stack.PopTop (); var maybeRa = vm.stack.PopTop (); if (maybeRa.Kind == Value.Kinds.ReturnAddress) { - vm.ApplyReturnAddress (maybeRa.ReturnAddressValue); + vm.ApplyReturnAddress (maybeRa.returnAddressValue); } else { Utils.Panic (); } @@ -1158,7 +1161,7 @@ static void HandleBlockReturn (Vm vm) if (vm.stack.Count > namedBlockIndex + 1) { vm.stack.RemoveRange (namedBlockIndex + 1, vm.stack.Count - namedBlockIndex - 1); } - var namedBlock = vm.stack.Top ().NamedBlockValue; + var namedBlock = vm.stack.Top ().namedBlockValue; vm.stack.Push (returnValue); vm.programCounter = namedBlock.BlockEnd; vm.currentEnvironment = namedBlock.Environment; @@ -1168,7 +1171,7 @@ int FindNamedBlock (string blockName) { for (var i = this.stack.Count - 1; i >= 0; i--) { if (this.stack.Storage [i].Kind == Value.Kinds.NamedBlock - && this.stack.Storage [i].NamedBlockValue.Name == blockName) { + && this.stack.Storage [i].namedBlockValue.Name == blockName) { return i; } } @@ -1305,8 +1308,8 @@ int CountCellsEnvFrame (VmEnvFrame envFrame, HashSet visited) var sum = 3; visited.Add (envFrame); - sum += CountCellsImpl (envFrame.VarNames, visited); - sum += CountCellsImpl (envFrame.Values, visited); + sum += CountCellsImpl (envFrame.VarNamesInternal, visited); + sum += CountCellsImpl (envFrame.ValuesInernal, visited); return sum; } @@ -1344,15 +1347,15 @@ int CountCellsImpl (object obj, HashSet visited) case Value.Kinds.Hash: return 1 + CountCellsHash (sv.hashValue, visited); case Value.Kinds.Callable: - return 1 + CountCellsCallable (sv.CallableValue, visited); + return 1 + CountCellsCallable (sv.callableValue, visited); case Value.Kinds.ReturnAddress: - return 1 + CountCellsReturnAddress (sv.ReturnAddressValue, visited); + return 1 + CountCellsReturnAddress (sv.returnAddressValue, visited); case Value.Kinds.NamedBlock: - return 1 + CountCellsNamedBlock (sv.NamedBlockValue, visited); + return 1 + CountCellsNamedBlock (sv.namedBlockValue, visited); case Value.Kinds.Struct: return 1 + CountCellsStringArray (sv.StructValue.Fields, visited); case Value.Kinds.StructInstance: - return 1 + CountCellsSvArray (sv.StructInstanceValue.Values, visited); + return 1 + CountCellsSvArray (sv.structInstanceValue.values, visited); default: Utils.Panic (); return 0; @@ -1486,11 +1489,11 @@ void WriteCurrentEnvironment (StringBuilder sb) this.PrintLineFor (sb, pc, instruction.StartPos, instruction.StartPos); } sb.AppendLine ("Frame variables are:"); - for (var i = 0; i < env.Frame.VarNames.Length; i++) { + for (var i = 0; i < env.Frame.VarNamesInternal.Length; i++) { sb.AppendLine (String.Format ( "{0} = {1}", - env.Frame.VarNames [i], - Prim0.ShovelStringRepresentation (this.api, env.Frame.Values [i]).stringValue) + env.Frame.VarNamesInternal [i], + Prim0.ShovelStringRepresentation (this.api, env.Frame.ValuesInernal [i]).stringValue) ); } sb.AppendLine (); @@ -1530,7 +1533,7 @@ void WriteStackTrace (StringBuilder sb) this.PrintLineFor (sb, this.programCounter, startPos, endPos); for (var i = this.stack.Count - 1; i >= 0; i--) { if (this.stack.Storage [i].Kind == Value.Kinds.ReturnAddress) { - var ra = this.stack.Storage [i].ReturnAddressValue; + var ra = this.stack.Storage [i].returnAddressValue; var pc = ra.ProgramCounter; var callSite = this.bytecode [pc - 1]; this.PrintLineFor (sb, pc, callSite.StartPos, callSite.EndPos);