コード例 #1
0
        private PapyrusVariableReference ReadValueReference(PapyrusAssemblyDefinition asm, string name = null)
        {
            var tr = new PapyrusVariableReference(new PapyrusStringRef(asm, name),
                                                  (PapyrusPrimitiveType)pexReader.ReadByte());

            switch (tr.Type)
            {
            case PapyrusPrimitiveType.Reference:
                tr.Value = pexReader.ReadString();
                break;

            case PapyrusPrimitiveType.String:
                tr.Value = pexReader.ReadString();
                break;

            case PapyrusPrimitiveType.Boolean:
                tr.Value = pexReader.ReadByte();
                break;

            case PapyrusPrimitiveType.Float:
                tr.Value = pexReader.ReadSingle();
                break;

            case PapyrusPrimitiveType.Integer:
                tr.Value = pexReader.ReadInt32();
                break;

            default:
            case PapyrusPrimitiveType.None:
                break;
            }
            return(tr);
        }
コード例 #2
0
        public PapyrusVariableEditorViewModel(IEnumerable <string> types, PapyrusVariableReference variable = null)
            : base(types)
        {
            this.variable = variable;

            if (this.variable != null)
            {
                Name = this.variable.Name.Value;


                if (variable.TypeName.Value.Contains("[]"))
                {
                    IsArray = true;
                }

                var ft =
                    variable.TypeName.Value.ToLower();

                ft = ft.Replace("[]", "");

                SelectedType = TypeReferences.FirstOrDefault(t => t.ToString().ToLower() == ft);
                if (SelectedType == null)
                {
                    SelectedType = this.variable.TypeName.Value.ToLower();
                }
            }
        }
コード例 #3
0
        private void UpdateSelectedValue()
        {
            var val = selectedValueType as ComboBoxItem;
            var tar = val.Content.ToString().ToLower();

            if (tar == "variable" || tar == "parameter" || tar == "field" || tar == "self" || /*tar == "selfref" || */ tar == "none")
            {
                return;
            }
            if (tar == "string")
            {
                if (currentType.Assembly != null)
                {
                    SelectedItem = new PapyrusVariableReference
                    {
                        Value = selectedConstantValue.ToString().Ref(currentType.Assembly).Value,
                        Type  = PapyrusPrimitiveType.String
                    };
                }
            }
            else
            {
                var type = Utility.GetPapyrusPrimitiveType(Utility.GetPapyrusReturnType(tar));
                if (currentType.Assembly != null)
                {
                    SelectedItem = new PapyrusVariableReference
                    {
                        Value = selectedConstantValue,
                        Type  = type
                    };
                }
            }
        }
コード例 #4
0
 public PapyrusInstruction CreatePapyrusCastInstruction(string destinationVariable,
                                                        PapyrusVariableReference variableToCast)
 {
     return(new PapyrusInstruction {
         OpCode = PapyrusOpCodes.Cast
     });
 }
コード例 #5
0
        private void EditOpArg()
        {
            var dialog = new PapyrusReferenceAndConstantValueViewModel(loadedAssemblies, currentType, currentMethod,
                                                                       null, null);
            var result = dialogService.ShowDialog(dialog);

            if (result == DialogResult.OK)
            {
                var i = OperandArguments.IndexOf(selectedOperandArgument);

                OperandArguments.RemoveAt(i);

                var papyrusVariableReference = new PapyrusVariableReference();

                UpdateOperandArgument(dialog, ref papyrusVariableReference);

                OperandArguments.Insert(i, papyrusVariableReference);

                SelectedOperandArgument = papyrusVariableReference;

                //// FFS! Just update? But nooo.. ObservableCollection refresh only triggers on remove/add :p
                //var dummy = new PapyrusVariableReference();
                //OperandArguments.Add(dummy);
                //OperandArguments.Remove(dummy);
            }
        }
コード例 #6
0
        private void AddOpArg()
        {
            var dialog = new PapyrusReferenceAndConstantValueViewModel(loadedAssemblies, currentType, currentMethod,
                                                                       null, null);
            var result = dialogService.ShowDialog(dialog);

            if (result == DialogResult.OK)
            {
                var papyrusVariableReference = new PapyrusVariableReference();
                OperandArguments.Add(UpdateOperandArgument(dialog, ref papyrusVariableReference));
            }
        }
コード例 #7
0
        private void WriteValueReference(PapyrusVariableReference fieldVariable)
        {
            pexWriter.Write((byte)fieldVariable.Type);
            switch (fieldVariable.Type)
            {
            case PapyrusPrimitiveType.Reference:
                pexWriter.Write((string)fieldVariable.Value);
                break;

            case PapyrusPrimitiveType.String:
                pexWriter.Write((string)fieldVariable.Value);
                break;

            case PapyrusPrimitiveType.Boolean:
            {
                if (fieldVariable.Value is bool)
                {
                    // I think this is Acceptable :p
                    var value = (byte)((bool)fieldVariable.Value ? 1 : 0);
                    pexWriter.Write(value);
                }
                else
                {
                    var val = fieldVariable.Value.ToString().ToLower();
                    pexWriter.Write((byte)(val == "true" || val == "1" ? 1 : 0));
                }
                ;
            }
            break;

            case PapyrusPrimitiveType.Float:
                if (fieldVariable.Value is double)
                {
                    pexWriter.Write((float)(double)fieldVariable.Value);
                }
                else
                {
                    pexWriter.Write(float.Parse(fieldVariable.Value.ToString()));
                }
                break;

            case PapyrusPrimitiveType.Integer:
#warning TODO: The value to write should NEVER need to be parsed.
                pexWriter.Write(int.Parse(fieldVariable.Value.ToString()));
                break;

            default:
            case PapyrusPrimitiveType.None:
                break;
            }
        }
コード例 #8
0
        private PapyrusVariableReference UpdateOperandArgument(PapyrusReferenceAndConstantValueViewModel dialog,
                                                               ref PapyrusVariableReference papyrusVariableReference)
        {
            var asm        = currentType.Assembly;
            var targetType = Utility.GetPapyrusPrimitiveType(Utility.GetPapyrusReturnType(dialog.SelectedTypeName));

            if (dialog.SelectedReferenceValue != null)
            {
                var paramRef = dialog.SelectedReferenceValue as PapyrusParameterDefinition;
                var fieldRef = dialog.SelectedReferenceValue as PapyrusFieldDefinition;
                var varRef   = dialog.SelectedReferenceValue as PapyrusVariableReference;
                if (varRef != null)
                {
                    papyrusVariableReference.Value    = varRef.Value;
                    papyrusVariableReference.Name     = varRef.Name;
                    papyrusVariableReference.TypeName = varRef.TypeName;
                    papyrusVariableReference.Type     = PapyrusPrimitiveType.Reference;
                }
                else if (fieldRef != null)
                {
                    papyrusVariableReference.Value    = fieldRef.Name.Value;
                    papyrusVariableReference.Name     = fieldRef.Name;
                    papyrusVariableReference.TypeName = fieldRef.TypeName.Ref(asm);
                    papyrusVariableReference.Type     = PapyrusPrimitiveType.Reference;
                }
                else if (paramRef != null)
                {
                    papyrusVariableReference.Value    = paramRef.Name.Value;
                    papyrusVariableReference.Name     = paramRef.Name;
                    papyrusVariableReference.TypeName = paramRef.TypeName;
                    papyrusVariableReference.Type     = PapyrusPrimitiveType.Reference;
                }
            }
            else
            {
                if (dialog.SelectedConstantValue == null && dialog.SelectedReferenceName != null)
                {
                    return(CreateReferenceFromName(dialog.SelectedReferenceName));
                }
                var val = dialog.SelectedConstantValue;
                if (val is string)
                {
                    val = val.ToString().Ref(asm).Value;
                }

                papyrusVariableReference.Value = val;
                papyrusVariableReference.Type  = targetType;
            }
            return(papyrusVariableReference);
        }
コード例 #9
0
        private string GetArgumentValue(PapyrusVariableReference arg)
        {
            if (arg == null)
            {
                return(null);
            }
            switch (arg.Type)
            {
            case PapyrusPrimitiveType.Reference:
                return(arg.Value?.ToString());

            case PapyrusPrimitiveType.String:
                return("\"" + arg.Value + "\"");

            case PapyrusPrimitiveType.Boolean:
            {
                if (arg.Value != null)
                {
                    return(arg.Value.Equals(true) || arg.Value.Equals(1) ? "true" : "false");
                }
            }
            break;

            case PapyrusPrimitiveType.Integer:
                if (arg.Value != null)
                {
                    return(arg.Value.ToString());
                }
                break;

            case PapyrusPrimitiveType.Float:
                if (arg.Value != null)
                {
                    return(arg.Value.ToString().Replace(",", ".") + "f");
                }
                break;
            }

            if (arg.Name != null)
            {
                return((string)arg.Name);
            }
            return(null);
        }
コード例 #10
0
        public PapyrusVariableReference GetDefaultValue()
        {
            if (IsArray)
            {
                return(new PapyrusVariableReference());
            }

            var type          = Utility.GetPapyrusReturnType(SelectedTypeName);
            var primitiveType = Utility.GetPapyrusPrimitiveType(type);

            var defVal = fieldToEdit?.DefaultValue;

            if (defVal == null)
            {
                defVal = new PapyrusVariableReference();
            }

            defVal.Type  = primitiveType;
            defVal.Value = Utility.ConvertToPapyrusValue(type, DefaultValue);

            return(defVal);
        }
コード例 #11
0
        private string GetStructFieldType(IReadOnlyCollection <PapyrusAssemblyDefinition> papyrusAssemblyCollection,
                                          PapyrusFieldDefinition structSource, PapyrusVariableReference structField)
        {
            foreach (var a in papyrusAssemblyCollection)
            {
                foreach (var t in a.Types)
                {
                    foreach (var s in t.NestedTypes)
                    {
                        var name = structSource.TypeName.Split('#').LastOrDefault();

                        if (s.Name.Value.ToLower() == name.ToLower())
                        {
                            var targetField = s.Fields.FirstOrDefault(f => f.Name.Value == "::" + structField.Name.Value);
                            if (targetField != null)
                            {
                                return(targetField.TypeName);
                            }
                        }
                    }
                }
            }
            return("none");
        }
コード例 #12
0
        private void UpdateReferenceCollection(ComboBoxItem value)
        {
            if (currentMethod == null)
            {
                return;
            }
            var tar = value.Content.ToString().ToLower();

            ReferenceSelectionVisible = Visibility.Visible;
            if (tar == "variable")
            {
                var papyrusVariableReferences = currentMethod.GetVariables();
                papyrusVariableReferences.ForEach(i => i.Type = PapyrusPrimitiveType.Reference);
                ReferenceCollection = new ObservableCollection <PapyrusMemberReference>(Filter(papyrusVariableReferences));
            }
            else if (tar == "parameter")
            {
                var papyrusParameterDefinitions = currentMethod.Parameters;
                ReferenceCollection =
                    new ObservableCollection <PapyrusMemberReference>(Filter(papyrusParameterDefinitions));
            }
            else if (tar == "field")
            {
                var papyrusFieldDefinitions = currentType.Fields.ToList();
                ReferenceCollection = new ObservableCollection <PapyrusMemberReference>(Filter(papyrusFieldDefinitions));
            }
            else if (tar == "none")
            {
                if (currentType.Assembly != null)
                {
                    SelectedReference = new PapyrusVariableReference
                    {
                        Name  = "".Ref(currentType.Assembly),
                        Value = null,
                        Type  = PapyrusPrimitiveType.None
                    };
                }
                ReferenceSelectionVisible = Visibility.Collapsed;
            }
            else if (tar == "self")
            {
                if (currentType.Assembly != null)
                {
                    SelectedReference = new PapyrusVariableReference
                    {
                        Name  = "Self".Ref(currentType.Assembly),
                        Value = "Self",
                        Type  = PapyrusPrimitiveType.Reference
                    };
                }
                ReferenceSelectionVisible = Visibility.Collapsed;
            }
            //else if (tar == "selfref")
            //{
            //    if (currentType.Assembly != null)
            //    {
            //        SelectedReference = new PapyrusVariableReference
            //        {
            //            Name = "SelfRef".Ref(currentType.Assembly),
            //            Value = "SelfRef",
            //            Type = PapyrusPrimitiveType.Reference
            //        };
            //    }
            //    ReferenceSelectionVisible = Visibility.Collapsed;
            //}
        }
コード例 #13
0
 /// <summary>
 ///     Initializes a new instance of the <see cref="ConstantNode" /> class.
 /// </summary>
 /// <param name="instructionOffset">The instruction offset.</param>
 /// <param name="constant">The value.</param>
 public ConstantNode(int instructionOffset, PapyrusVariableReference constant)
     : base(0, instructionOffset, 0, null)
 {
     Constant = constant;
 }
コード例 #14
0
 public PapyrusInstruction ConditionalJump(PapyrusOpCodes jumpType, PapyrusVariableReference conditionalVar,
                                           object destinationInstruction)
 {
     throw new NotImplementedException();
 }
コード例 #15
0
 private void WriteVariable(PapyrusVariableReference variable)
 {
     pexWriter.Write(variable.Name);
     pexWriter.Write(variable.TypeName);
 }
コード例 #16
0
        /// <summary>
        /// Processes the specified instruction.
        /// </summary>
        /// <param name="mainProcessor">The main instruction processor.</param>
        /// <param name="asmCollection">The papyrus assembly collection.</param>
        /// <param name="instruction">The instruction.</param>
        /// <param name="targetMethod">The target method.</param>
        /// <param name="type">The type.</param>
        /// <returns></returns>
        public IEnumerable <PapyrusInstruction> Process(
            IClrInstructionProcessor mainProcessor,
            IReadOnlyCollection <PapyrusAssemblyDefinition> asmCollection,
            Instruction instruction,
            MethodDefinition targetMethod, TypeDefinition type)
        {
            var output = new List <PapyrusInstruction>();

            if (Utility.IsVoid(targetMethod.ReturnType))
            {
                output.Add(PapyrusReturnNone());
                return(output);
            }

            if (mainProcessor.EvaluationStack.Count >=
                Utility.GetStackPopCount(instruction.OpCode.StackBehaviourPop))
            {
                var topValue = mainProcessor.EvaluationStack.Pop();
                if (topValue.Value is PapyrusVariableReference)
                {
                    var variable = topValue.Value as PapyrusVariableReference;
                    // return "Return " + variable.Name;

                    output.Add(mainProcessor.CreatePapyrusInstruction(PapyrusOpCodes.Return, variable));
                    // PapyrusReturnVariable(variable.Name)

                    return(output);
                }
                if (topValue.Value is PapyrusFieldDefinition)
                {
                    var variable = topValue.Value as PapyrusFieldDefinition;
                    // return "Return " + variable.Name;
                    output.Add(mainProcessor.CreatePapyrusInstruction(PapyrusOpCodes.Return, variable));
                    return(output);
                }
                if (Utility.IsConstantValue(topValue.Value))
                {
                    var val = topValue.Value;

                    var typeName = topValue.TypeName;
                    var newValue = valueTypeConverter.Convert(typeName, val);
                    var papyrusVariableReference = new PapyrusVariableReference
                    {
                        TypeName = StringExtensions.Ref(typeName, mainProcessor.PapyrusAssembly),
                        Value    = newValue,
                        Type     = Utility.GetPapyrusPrimitiveType(typeName)
                    };
                    {
                        output.Add(mainProcessor.CreatePapyrusInstruction(PapyrusOpCodes.Return,
                                                                          papyrusVariableReference));
                        return(output);
                    }
                }
            }
            else
            {
                output.Add(PapyrusReturnNone());
                return(output);
            }
            return(output);
        }