void AssignMethodProc(JavaScriptValue setTo, MethodInfo[] methods) { var methodDic = new Dictionary <string, List <MethodInfo> >(); foreach (var m in methods) { if (m.IsSpecialName) { continue; } if (m.IsGenericMethodDefinition) { continue; } if (m.IsGenericMethod) { continue; } if (!methodDic.ContainsKey(m.Name)) { methodDic[m.Name] = new List <MethodInfo>(); } methodDic[m.Name].Add(m); } foreach (var methodName in methodDic.Keys) { var ms = methodDic[methodName]; if (ms.Count == 1) { var m = ms[0]; var smw = (m.IsStatic) ? (FunctionWrapper)StaticMethodWrapper.Wrap(m) : (FunctionWrapper)InstanceMethodWrapper.Wrap(m); setTo.SetIndexedProperty(JavaScriptValue.FromString(m.Name), smw.GetJavaScriptValue()); methodWrappers.Add(smw); } else { var os = new OverloadSelector(); foreach (var m in ms) { os.AppendMethod(m); } setTo.SetIndexedProperty(JavaScriptValue.FromString(os.GetName()), os.GetJavaScriptValue()); methodWrappers.Add(os); } } }
TypeWrapper(Type type) { TypeWrapper baseTypeWrapper = null; if (type.BaseType != null) { baseTypeWrapper = TypeWrapper.Wrap(type.BaseType); } this.type = type; var ctors = type.GetConstructors(); thisPtr = GCHandle.Alloc(this); if (ctors.Length == 0) { constructorValue = JavaScriptValue.CreateFunction(NoConstructorDg, GCHandle.ToIntPtr(thisPtr)); } else if (ctors.Length == 1) { var ctorw = ConstructorWrapper.Wrap(ctors[0]); constructorValue = ctorw.GetJavaScriptValue(); ctorWrapper = ctorw; } else { var os = new OverloadSelector(); foreach (var m in ctors) { os.AppendMethod(m); } constructorValue = os.GetJavaScriptValue(); ctorWrapper = os; } constructorValue.AddRef(); prototypeValue = JavaScriptValue.CreateObject(); prototypeValue.AddRef(); typePtr = GCHandle.Alloc(type); constructorValue.SetIndexedProperty(JavaScriptValue.FromString("_clrtypevalue"), JavaScriptValue.CreateExternalObject(GCHandle.ToIntPtr(typePtr), FreeDg)); // statics ctorStr = type.FullName; constructorValue.SetIndexedProperty(JavaScriptValue.FromString("toString"), JavaScriptValue.CreateFunction(InternalUtil.GetSavedStringDg, GCHandle.ToIntPtr(GCHandle.Alloc(ctorStr)))); AssignMethodProc(constructorValue, type.GetMethods(BindingFlags.Public | BindingFlags.DeclaredOnly | BindingFlags.Static)); AssignFieldProc(constructorValue, type.GetFields(BindingFlags.Public | BindingFlags.DeclaredOnly | BindingFlags.Static)); AssignPropertyProc(constructorValue, type.GetProperties(BindingFlags.Public | BindingFlags.DeclaredOnly | BindingFlags.Static)); // instances prototypeStr = type.FullName + " Instance"; prototypeValue.SetIndexedProperty(JavaScriptValue.FromString("toString"), JavaScriptValue.CreateFunction(InternalUtil.GetSavedStringDg, GCHandle.ToIntPtr(GCHandle.Alloc(prototypeStr)))); AssignMethodProc(prototypeValue, type.GetMethods(BindingFlags.Public | BindingFlags.DeclaredOnly | BindingFlags.Instance)); AssignFieldProc(prototypeValue, type.GetFields(BindingFlags.Public | BindingFlags.DeclaredOnly | BindingFlags.Instance)); AssignPropertyProc(prototypeValue, type.GetProperties(BindingFlags.Public | BindingFlags.DeclaredOnly | BindingFlags.Instance)); constructorValue.SetIndexedProperty(JavaScriptValue.FromString("prototype"), prototypeValue); if (baseTypeWrapper != null) { constructorValue.Prototype = baseTypeWrapper.constructorValue; prototypeValue.Prototype = baseTypeWrapper.prototypeValue; } }