aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ScriptEngine/XMREngine/MMRDelegateCommon.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/ScriptEngine/XMREngine/MMRDelegateCommon.cs')
-rw-r--r--OpenSim/Region/ScriptEngine/XMREngine/MMRDelegateCommon.cs106
1 files changed, 106 insertions, 0 deletions
diff --git a/OpenSim/Region/ScriptEngine/XMREngine/MMRDelegateCommon.cs b/OpenSim/Region/ScriptEngine/XMREngine/MMRDelegateCommon.cs
new file mode 100644
index 0000000..48b665b
--- /dev/null
+++ b/OpenSim/Region/ScriptEngine/XMREngine/MMRDelegateCommon.cs
@@ -0,0 +1,106 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections.Generic;
30using System.Reflection;
31using System.Reflection.Emit;
32
33namespace OpenSim.Region.ScriptEngine.XMREngine {
34
35 public class DelegateCommon {
36 private string sig; // rettype(arg1type,arg2type,...), eg, "void(list,string,integer)"
37 private Type type; // resultant delegate type
38
39 private static Dictionary<string, DelegateCommon> delegateCommons = new Dictionary<string, DelegateCommon> ();
40 private static Dictionary<Type, DelegateCommon> delegateCommonsBySysType = new Dictionary<Type, DelegateCommon> ();
41 private static ModuleBuilder delegateModuleBuilder = null;
42 public static Type[] constructorArgTypes = new Type[] { typeof (object), typeof (IntPtr) };
43
44 private DelegateCommon () { }
45
46 public static Type GetType (System.Type ret, System.Type[] args, string sig)
47 {
48 DelegateCommon dc;
49 lock (delegateCommons) {
50 if (!delegateCommons.TryGetValue (sig, out dc)) {
51 dc = new DelegateCommon ();
52 dc.sig = sig;
53 dc.type = CreateDelegateType (sig, ret, args);
54 delegateCommons.Add (sig, dc);
55 delegateCommonsBySysType.Add (dc.type, dc);
56 }
57 }
58 return dc.type;
59 }
60
61 public static Type TryGetType (string sig)
62 {
63 DelegateCommon dc;
64 lock (delegateCommons) {
65 if (!delegateCommons.TryGetValue (sig, out dc)) dc = null;
66 }
67 return (dc == null) ? null : dc.type;
68 }
69
70 public static string TryGetName (Type t)
71 {
72 DelegateCommon dc;
73 lock (delegateCommons) {
74 if (!delegateCommonsBySysType.TryGetValue (t, out dc)) dc = null;
75 }
76 return (dc == null) ? null : dc.sig;
77 }
78
79 // http://blog.bittercoder.com/PermaLink,guid,a770377a-b1ad-4590-9145-36381757a52b.aspx
80 private static Type CreateDelegateType (string name, Type retType, Type[] argTypes)
81 {
82 if (delegateModuleBuilder == null) {
83 AssemblyName assembly = new AssemblyName();
84 assembly.Name = "CustomDelegateAssembly";
85 AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assembly, AssemblyBuilderAccess.Run);
86 delegateModuleBuilder = assemblyBuilder.DefineDynamicModule("CustomDelegateModule");
87 }
88
89 TypeBuilder typeBuilder = delegateModuleBuilder.DefineType(name,
90 TypeAttributes.Public | TypeAttributes.Sealed | TypeAttributes.Class |
91 TypeAttributes.AnsiClass | TypeAttributes.AutoClass, typeof (MulticastDelegate));
92
93 ConstructorBuilder constructorBuilder = typeBuilder.DefineConstructor(
94 MethodAttributes.RTSpecialName | MethodAttributes.HideBySig | MethodAttributes.Public,
95 CallingConventions.Standard, constructorArgTypes);
96 constructorBuilder.SetImplementationFlags(MethodImplAttributes.Runtime | MethodImplAttributes.Managed);
97
98 MethodBuilder methodBuilder = typeBuilder.DefineMethod("Invoke",
99 MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.NewSlot |
100 MethodAttributes.Virtual, retType, argTypes);
101 methodBuilder.SetImplementationFlags(MethodImplAttributes.Managed | MethodImplAttributes.Runtime);
102
103 return typeBuilder.CreateType();
104 }
105 }
106}