示例#1
0
        protected SessionAwareByteArrayRequiringValueSerializer(byte manifest,
                                                                Expression <Func <Action <Stream, TElementType, byte[]> > > writeStaticMethod,
                                                                Expression <Func <Func <Stream, byte[], TElementType> > > readStaticMethod)
        {
            _manifest = manifest;
            _write    = GetStatic(writeStaticMethod, typeof(void));
            _read     = GetStatic(readStaticMethod, typeof(TElementType));

#if NET45
            var c = new IlCompiler <Action <Stream, object, byte[]> >();
#else
            var c = new Compiler <Action <Stream, object, byte[]> >();
#endif

            var stream     = c.Parameter <Stream>("stream");
            var value      = c.Parameter <object>("value");
            var buffer     = c.Parameter <byte[]>("buffer");
            var valueTyped = c.CastOrUnbox(value, typeof(TElementType));

            c.EmitStaticCall(_write, stream, valueTyped, buffer);

            _writeCompiled = c.Compile();
#if NET45
            var c2 = new IlCompiler <Func <Stream, byte[], TElementType> >();
#else
            var c2 = new Compiler <Func <Stream, byte[], TElementType> >();
#endif

            var stream2 = c2.Parameter <Stream>("stream");
            var buffer2 = c2.Parameter <byte[]>("buffer");
            c2.EmitStaticCall(_read, stream2, buffer2);

            _readCompiled = c2.Compile();
        }
        public bool CompileIngameScript(MyStringId id, StringBuilder errors)
        {
#if XB1 // XB1_ALLINONEASSEMBLY
            System.Diagnostics.Debug.Assert(false, "XB1 TODO?");
            return(false);
#else // !XB1
            // TODO: Not in use. Remove when Roslyn scripts are activated

            if (!MyFakes.ENABLE_SCRIPTS)
            {
                return(false);
            }
            Assembly assembly;
            bool     success;
            success = IlCompiler.Compile(new string[] { InGameScriptsCode[id].ToString() }, out assembly, false);
            if (success)
            {
                var scriptType = typeof(MyIngameScript);
                if (InGameScripts.ContainsKey(id))
                {
                    InGameScripts.Remove(id);
                }
                foreach (var type in assembly.GetTypes())
                {
                    if (scriptType.IsAssignableFrom(type))
                    {
                        InGameScripts.Add(id, type);
                        return(true);
                    }
                }
            }
            return(false);
#endif // !XB1
        }
示例#3
0
        private static ObjectReader GetDelegate(Type type, FieldInfo[] fields, Serializer serializer)
        {
            var c                       = new IlCompiler <ObjectReader>();
            var stream                  = c.Parameter <Stream>("stream");
            var session                 = c.Parameter <DeserializerSession>("session");
            var newExpression           = c.NewObject(type);
            var target                  = c.Variable <object>("target");
            var assignNewObjectToTarget = c.WriteVar(target, newExpression);

            c.Emit(assignNewObjectToTarget);

            var size         = c.Constant(16);
            var buffer       = c.Variable <byte[]>(DefaultCodeGenerator.PreallocatedByteBuffer);
            var bufferValue  = c.Call(typeof(DeserializerSession).GetMethod("GetBuffer"), session, size);
            var assignBuffer = c.WriteVar(buffer, bufferValue);

            c.Emit(assignBuffer);

            var typedTarget = c.CastOrUnbox(target, type);

            foreach (var field in fields)
            {
                var s    = serializer.GetSerializerByType(field.FieldType);
                var read = s.EmitReadValue(c, stream, session, field);

                var assignReadToField = c.WriteField(field, typedTarget, read);
                c.Emit(assignReadToField);
            }
            c.Emit(target);

            var readAllFields = c.Compile();

            return(readAllFields);
        }
示例#4
0
        protected SessionIgnorantValueSerializer(byte manifest,
                                                 Expression <Func <Action <Stream, TElementType> > > writeStaticMethod,
                                                 Expression <Func <Func <Stream, TElementType> > > readStaticMethod)
        {
            _manifest = manifest;
            _write    = GetStatic(writeStaticMethod, typeof(void));
            _read     = GetStatic(readStaticMethod, typeof(TElementType));

#if DESKTOPCLR
            var c = new IlCompiler <Action <Stream, object> >();
#else
            var c = new Compiler <Action <Stream, object> >();
#endif

            var stream     = c.Parameter <Stream>("stream");
            var value      = c.Parameter <object>("value");
            var valueTyped = c.CastOrUnbox(value, typeof(TElementType));
            c.EmitStaticCall(_write, stream, valueTyped);

            _writeCompiled = c.Compile();

#if DESKTOPCLR
            var c2 = new IlCompiler <Func <Stream, TElementType> >();
#else
            var c2 = new Compiler <Func <Stream, TElementType> >();
#endif

            var stream2 = c2.Parameter <Stream>("stream");
            c2.EmitStaticCall(_read, stream2);

            _readCompiled = c2.Compile();
        }
示例#5
0
        public void CanCreateEmptyMethodWithArguments()
        {
            var c = new IlCompiler <Action <bool> >();
            var a = c.Compile();

            a(true);
        }
示例#6
0
        public bool CompileIngameScript(MyStringId id, StringBuilder errors)
        {
            if (!MyFakes.ENABLE_SCRIPTS)
            {
                return(false);
            }
            Assembly assembly;
            bool     success;

            success = IlCompiler.Compile(new string[] { InGameScriptsCode[id].ToString() }, out assembly, false);
            if (success)
            {
                var scriptType = typeof(MyIngameScript);
                if (InGameScripts.ContainsKey(id))
                {
                    InGameScripts.Remove(id);
                }
                foreach (var type in assembly.GetTypes())
                {
                    if (scriptType.IsAssignableFrom(type))
                    {
                        InGameScripts.Add(id, type);
                        return(true);
                    }
                }
            }
            return(false);
        }
示例#7
0
        public void CanCreateEmptyMethod()
        {
            var c = new IlCompiler <Action>();
            var a = c.Compile();

            a();
        }
        public static bool CompileProgram(string program, List <string> errors, ref Assembly assembly)
        {
#if !XB1
            if (!string.IsNullOrEmpty(program))
            {
                if (MyFakes.ENABLE_ROSLYN_SCRIPTS)
                {
                    var messageList = new List <MyScriptCompiler.Message>();
                    assembly = MyScriptCompiler.Static.Compile(
                        MyApiTarget.Ingame,
                        Path.Combine(MyFileSystem.UserDataPath, "EditorCode.dll"),
                        MyScriptCompiler.Static.GetIngameScript(program, "Program", typeof(MyGridProgram).Name),
                        messageList).Result;
                    errors.Clear();
                    errors.AddRange(messageList.OrderByDescending(m => m.Severity).Select(m => m.Text));

                    return(assembly != null);
                }

                string finalCode = CODE_WRAPPER_BEFORE + program + CODE_WRAPPER_AFTER;
                if (true == IlCompiler.CompileStringIngame(Path.Combine(MyFileSystem.UserDataPath, "IngameScript.dll"), new string[] { finalCode }, out assembly, errors))
                {
                    return(true);
                }
            }
#else // XB1
            System.Diagnostics.Debug.Assert(false, "No scripts on XB1");
#endif // XB1
            return(false);
        }
示例#9
0
        private void Compile(IEnumerable <string> scriptFiles, string assemblyName, bool zipped, MyModContext context)
        {
#if XB1
            System.Diagnostics.Debug.Assert(false, "Unsupported runtime script compilation on XB1.");
#else
            Assembly assembly = null;
            bool     compiled = false;
            if (zipped)
            {
                var tmp = Path.GetTempPath();
                foreach (var file in scriptFiles)
                {
                    try
                    {
                        var newPath = string.Format("{0}{1}", tmp, Path.GetFileName(file));
                        var stream  = MyFileSystem.OpenRead(file);
                        using (var sr = new StreamReader(stream))
                        {
                            stream = MyFileSystem.OpenWrite(newPath);// (newPath);
                            using (var sw = new StreamWriter(stream))
                            {
                                sw.Write(sr.ReadToEnd()); //create file in tmp for debugging
                            }
                        }
                        m_cachedFiles.Add(newPath);
                    }
                    catch (Exception e)
                    {
                        MySandboxGame.Log.WriteLine(e);
                        MyDefinitionErrors.Add(context, string.Format("Cannot load {0}", Path.GetFileName(file)), TErrorSeverity.Error);
                        MyDefinitionErrors.Add(context, e.Message, TErrorSeverity.Error);
                    }
                }
                compiled = IlCompiler.CompileFileModAPI(assemblyName, m_cachedFiles.ToArray(), out assembly, m_errors);
            }
            else
            {
                compiled = IlCompiler.CompileFileModAPI(assemblyName, scriptFiles.ToArray(), out assembly, m_errors);
            }
            Debug.Assert(compiled == (assembly != null), "Compile results inconsistency!");
            if (assembly != null && compiled)
            {
                AddAssembly(context, MyStringId.GetOrCompute(assemblyName), assembly);
            }
            else
            {
                MyDefinitionErrors.Add(context, string.Format("Compilation of {0} failed:", assemblyName), TErrorSeverity.Error);
                MySandboxGame.Log.IncreaseIndent();
                foreach (var error in m_errors)
                {
                    MyDefinitionErrors.Add(context, error.ToString(), TErrorSeverity.Error);
                    Debug.Assert(false, error.ToString());
                }
                MySandboxGame.Log.DecreaseIndent();
                m_errors.Clear();
            }
            m_cachedFiles.Clear();
#endif
        }
示例#10
0
        private void Compile(IEnumerable <string> scriptFiles, string assemblyName, bool zipped)
        {
            Assembly assembly = null;
            var      c        = new MyModContext();

            c.Init(assemblyName, assemblyName);
            if (zipped)
            {
                var tmp = Path.GetTempPath();
                foreach (var file in scriptFiles)
                {
                    try
                    {
                        var newPath = string.Format("{0}{1}", tmp, Path.GetFileName(file));
                        var stream  = MyFileSystem.OpenRead(file);
                        using (var sr = new StreamReader(stream))
                        {
                            stream = MyFileSystem.OpenWrite(newPath);// (newPath);
                            using (var sw = new StreamWriter(stream))
                            {
                                sw.Write(sr.ReadToEnd()); //create file in tmp for debugging
                            }
                        }
                        m_cachedFiles.Add(newPath);
                    }
                    catch (Exception e)
                    {
                        MySandboxGame.Log.WriteLine(e);
                        MyDefinitionErrors.Add(c, string.Format("Cannot load {0}", Path.GetFileName(file)), ErrorSeverity.Error);
                        MyDefinitionErrors.Add(c, e.Message, ErrorSeverity.Error);
                    }
                }
                IlCompiler.CompileFileModAPI(assemblyName, m_cachedFiles.ToArray(), out assembly, m_errors);
            }
            else
            {
                IlCompiler.CompileFileModAPI(assemblyName, scriptFiles.ToArray(), out assembly, m_errors);
            }
            if (assembly != null)
            {
                AddAssembly(MyStringId.GetOrCompute(assemblyName), assembly);
            }
            else
            {
                MyDefinitionErrors.Add(c, string.Format("Compilation of {0} failed:", assemblyName), ErrorSeverity.Error);
                MySandboxGame.Log.IncreaseIndent();
                foreach (var error in m_errors)
                {
                    MyDefinitionErrors.Add(c, error.ToString(), ErrorSeverity.Error);
                    Debug.Assert(false, error.ToString());
                }
                MySandboxGame.Log.DecreaseIndent();
                m_errors.Clear();
            }
            m_cachedFiles.Clear();
        }
示例#11
0
        public void CanCreateObject()
        {
            var c   = new IlCompiler <Func <Dummy> >();
            var obj = c.NewObject(typeof(Dummy));

            c.Emit(obj);
            var a = c.Compile();

            a();
        }
示例#12
0
        public void CanReturnConstantString()
        {
            var c = new IlCompiler <Func <string> >();
            var b = c.Constant("hello");

            c.Emit(b);
            var a   = c.Compile();
            var res = a();

            Assert.Equal("hello", res);
        }
示例#13
0
        public void CanCreateEmptyMethodWithReturnType()
        {
            var c = new IlCompiler <Func <bool> >();
            var b = c.Constant(true);

            c.Emit(b);
            var a   = c.Compile();
            var res = a();

            Assert.Equal(true, res);
        }
示例#14
0
        public void CanCreateObjectAndStoreInVar()
        {
            var c        = new IlCompiler <Action>();
            var variable = c.Variable <Dummy>("dummy");
            var obj      = c.NewObject(typeof(Dummy));
            var assign   = c.WriteVar(variable, obj);

            c.Emit(assign);
            var a = c.Compile();

            a();
        }
示例#15
0
        public void CanStoreBoolInField()
        {
            var c     = new IlCompiler <Action>();
            var True  = c.Constant(true);
            var obj   = c.NewObject(typeof(Dummy));
            var write = c.WriteField(BoolField, obj, True);

            c.Emit(write);
            var a = c.Compile();

            a();
        }
示例#16
0
        public void CanCallStaticMethodUsingParameter()
        {
            var c     = new IlCompiler <Action <Dummy> >();
            var param = c.Parameter <Dummy>("dummy");

            c.EmitStaticCall(SetStatic, param);
            var a     = c.Compile();
            var dummy = new Dummy();

            a(dummy);
            Assert.Equal(true, dummy.BoolField);
        }
示例#17
0
        public void CanCallInstanceMethodOnParameter()
        {
            var c     = new IlCompiler <Action <Dummy> >();
            var param = c.Parameter <Dummy>("dummy");

            c.EmitCall(SetBool, param);
            var a     = c.Compile();
            var dummy = new Dummy();

            a(dummy);
            Assert.Equal(true, dummy.BoolField);
        }
示例#18
0
 public static bool CompileProgram(string program, List <string> errors, ref Assembly assembly)
 {
     if (program != null && program.Length > 0)
     {
         string finalCode = CODE_WRAPPER_BEFORE + program + CODE_WRAPPER_AFTER;
         if (true == IlCompiler.CompileString("IngameScript.dll", new string[] { finalCode }, out assembly, errors))
         {
             return(true);
         }
     }
     return(false);
 }
示例#19
0
        public void CanModifyParameter()
        {
            var c     = new IlCompiler <Action <Dummy> >();
            var param = c.Parameter <Dummy>("dummy");
            var write = c.WriteField(BoolField, param, c.Constant(true));

            c.Emit(write);
            var a     = c.Compile();
            var dummy = new Dummy();

            a(dummy);
            Assert.Equal(true, dummy.BoolField);
        }
示例#20
0
        public void CanCastToAndFromObject()
        {
            var c = new IlCompiler <Action>();

            var True        = c.Constant(true);
            var boxedBool   = c.Convert(True, typeof(object));
            var unboxedBool = c.CastOrUnbox(boxedBool, typeof(bool));

            var obj   = c.NewObject(typeof(Dummy));
            var write = c.WriteField(BoolField, obj, unboxedBool);

            c.Emit(write);
            var a = c.Compile();

            a();
        }
示例#21
0
        private bool CallScriptInternal(string message)
        {
            Assembly ass;

            if (IlCompiler.Buffer.Length > 0)
            {
                if (IlCompiler.Compile(new string[] { IlCompiler.Buffer.ToString() }, out ass, true))
                {
                    var retval = ass.GetType("wrapclass").GetMethod("run").Invoke(null, null);
                    if (!string.IsNullOrEmpty(message))
                    {
                        Sandbox.Game.Gui.MyHud.Chat.ShowMessage("returned", retval.ToString());
                    }
                    return(true);

                    IlCompiler.Buffer.Clear();
                }
                else
                {
                    IlCompiler.Buffer.Clear();
                    return(false);
                }
            }
            var parts = message.Split(Separators, StringSplitOptions.RemoveEmptyEntries);

            if (parts.Length < 3)
            {
                MyAPIGateway.Utilities.ShowNotification("Not enought parameters for script please provide following paramaters : Sriptname Classname MethodName", 5000);
                return(false);
            }
            if (!Scripts.ContainsKey(MyStringId.TryGet(parts[1])))
            {
                string availableScripts = "";
                foreach (var scriptName in Scripts)
                {
                    availableScripts += scriptName.Key + "\n";
                }
                MyAPIGateway.Utilities.ShowMissionScreen("Script not found", "", "Available scripts:", availableScripts);
                return(false);
            }
            ass = Scripts[MyStringId.Get(parts[1])];
            var type = ass.GetType(parts[2]);

            if (type == null)
            {
                string availableScripts = "";
                var    types            = ass.GetTypes();
                foreach (var scriptType in types)
                {
                    availableScripts += scriptType.FullName + "\n";
                }
                MyAPIGateway.Utilities.ShowMissionScreen("Class not found", "", "Available classes:", availableScripts);
                return(false);
            }
            var method = type.GetMethod(parts[3]);

            if (method == null)
            {
                string availableScripts = "";
                var    types            = type.GetMethods(BindingFlags.Static | BindingFlags.Public);
                foreach (var scriptType in types)
                {
                    availableScripts += scriptType.Name + "\n";
                }
                MyAPIGateway.Utilities.ShowMissionScreen("Method not found", "", "Available methods:", availableScripts);
                return(false);
            }
            var           paramInfos = method.GetParameters();
            List <object> parameters = new List <object>();

            for (int i = 4; i < paramInfos.Length + 4 && i < parts.Length; i++)
            {
                var paramType = paramInfos[i - 4].ParameterType;
                var parseMet  = paramType.GetMethod("TryParse", new Type[] { typeof(System.String), paramType.MakeByRefType() });
                if (parseMet != null)
                {
                    var output = Activator.CreateInstance(paramType);
                    var args   = new object[] { parts[i], output };
                    var par    = parseMet.Invoke(null, args);
                    parameters.Add(args[1]);
                }
                else
                {
                    parameters.Add(parts[i]);
                }
            }
            if (paramInfos.Length == parameters.Count)
            {
                var retval = method.Invoke(null, parameters.ToArray());
                if (retval != null)
                {
                    Sandbox.Game.Gui.MyHud.Chat.ShowMessage("return value", retval.ToString());
                }
                Sandbox.Game.Gui.MyHud.Chat.ShowMessage("Call", "Success");
                return(true);
            }
            return(false);
        }