////////////////////////////////////////////// /*public PainState(String DisplayName, Guid ObjectID, PainContextType ContextType) * { * this.DisplayName = DisplayName ?? ""; * this.ObjectID = ObjectID; * this.ID = Guid.NewGuid(); * this.ContextType = ContextType; * this.Object = new PainObject(); * this.Lines = new PainCodeLines(); * this.CurrentLineIndex = 0; * }*/ public PainState(PainProgram Program, PainContextType ContextType) { this.Program = Program; //this.DisplayName = DisplayName ?? ""; //this.ObjectID = ObjectID; this.ID = Guid.NewGuid(); this.ContextType = ContextType; this.Object = new PainObject(); //this.Lines = new PainCodeLines(); this.CurrentLineIndex = 0; }
////////////////////////////////////////////// //public PainState PushContext(String DisplayName, Guid ObjectID, PainContextType ContextType) public PainState PushContext( PainProgram Program, PainContextType ContextType, IList <Object> Parameters) { PainState state = new PainState(Program, ContextType); // DisplayName, ObjectID, ContextType); PainObject obj = state.Object; this.Stack.Push(state); this.CurrentState = state; List <PainMethodParam> finalParameters = new List <PainMethodParam>(); Int32 index = -1; if (Program is PainMethod) { PainMethod method = (PainMethod)Program; foreach (String parameter in method.Parameters) { index++; Object parameterValue = Parameters == null ? null : index < Parameters.Count ? Parameters[index] : new Undefined(); if (obj != null) { obj[parameter] = parameterValue; finalParameters.Add(new PainMethodParam() { Name = parameter, Value = parameterValue }); } } } if (obj != null) { foreach (PainMethod painMethod in Program.Methods) { if (state.Program is PainClass) { PainMethod newMethod = (PainMethod)painMethod.Clone(); newMethod.ParentObject = obj; obj[newMethod.Name] = newMethod; } else { obj[painMethod.Name] = painMethod; } } foreach (PainClass painClass in Program.Classes) { obj[painClass.Name] = painClass; } } RaiseProgramStart( state, finalParameters); return(state); }
public static Boolean EvaluateMethod( Object Object, Object MethodObject, IList <Object> Parameters, PainContext PainContext) { if (MethodObject is PainMethod) { if (Parameters == null) { Parameters = new Object[0]; } PainMethod method = (PainMethod)MethodObject; PainContextType contextType = PainContextType.METHOD; // jesli tworzenie klasy (wolanie konstruktora) if (MethodObject is PainClass) { contextType = PainContextType.CLASS; } PainState newContext = PainContext. PushContext(method, contextType, Parameters); newContext.Object.ParentObject = method.ParentObject; return(true); } else if (MethodObject is PainProgram) { PainProgram program = (PainProgram)MethodObject; IDictionary <String, Object> currentValues = (PainContext == null || PainContext.CurrentState == null || PainContext.CurrentState.Object == null ? null : PainContext. CurrentState. Object. DynamicValues); IDictionary <String, Object> currentStaticValues = (PainContext == null || PainContext.CurrentState == null || PainContext.CurrentState.Object == null ? null : PainContext. CurrentState. Object. StaticValues); PainState newState = PainContext.PushContext( program, PainContextType.METHOD, null); if (currentValues != null) { foreach (String key in currentValues.Keys) { newState.Object.DynamicValues[key] = currentValues[key]; } } newState.Object.StaticValues = currentStaticValues; return(true); } else { ExpressionMethodResult methodResult = EvaluateInlineMethod( Object, MethodObject, Parameters, PainContext); if (methodResult != null && methodResult.NewContextCreated) { return(true); } else { var v = methodResult == null ? null : methodResult.Value; PainContext.CurrentExpressionState.PushValue(v); return(false); } } }