/// <summary> /// Resolves the default type of the access mode for the given type /// </summary> /// <param name="accessMode">The access mode.</param> /// <param name="type">The type.</param> /// <returns></returns> internal static InteropAccessMode ResolveDefaultAccessModeForType(InteropAccessMode accessMode, Type type) { if (accessMode == InteropAccessMode.Default) { MoonSharpUserDataAttribute attr = Framework.Do.GetCustomAttributes(type, true).OfType <MoonSharpUserDataAttribute>() .SingleOrDefault(); if (attr != null) { accessMode = attr.AccessMode; } } if (accessMode == InteropAccessMode.Default) { accessMode = s_DefaultAccessMode; } return(accessMode); }
/// <summary> /// Registers a type /// </summary> /// <param name="type">The type.</param> /// <param name="accessMode">The access mode (used only if a default type descriptor is created).</param> /// <param name="friendlyName">Friendly name of the descriptor.</param> /// <param name="descriptor">The descriptor, or null to use a default one.</param> /// <returns></returns> internal static IUserDataDescriptor RegisterType_Impl(Type type, InteropAccessMode accessMode, string friendlyName, IUserDataDescriptor descriptor) { if (accessMode == InteropAccessMode.Default) { MoonSharpUserDataAttribute attr = type.GetCustomAttributes(true).OfType <MoonSharpUserDataAttribute>() .SingleOrDefault(); if (attr != null) { accessMode = attr.AccessMode; } } if (accessMode == InteropAccessMode.Default) { accessMode = s_DefaultAccessMode; } lock (s_Lock) { if (!s_Registry.ContainsKey(type)) { if (descriptor == null) { if (IsTypeBlacklisted(type)) { return(null); } if (type.GetInterfaces().Any(ii => ii == typeof(IUserDataType))) { AutoDescribingUserDataDescriptor audd = new AutoDescribingUserDataDescriptor(type, friendlyName); s_Registry.Add(type, audd); return(audd); } else if (type.IsGenericTypeDefinition) { StandardGenericsUserDataDescriptor typeGen = new StandardGenericsUserDataDescriptor(type, accessMode); s_Registry.Add(type, typeGen); return(typeGen); } else if (type.IsEnum) { var enumDescr = new StandardEnumUserDataDescriptor(type, friendlyName); s_Registry.Add(type, enumDescr); return(enumDescr); } else { StandardUserDataDescriptor udd = new StandardUserDataDescriptor(type, accessMode, friendlyName); s_Registry.Add(type, udd); if (accessMode == InteropAccessMode.BackgroundOptimized) { ThreadPool.QueueUserWorkItem(o => ((IOptimizableDescriptor)udd).Optimize()); } return(udd); } } else { s_Registry.Add(type, descriptor); return(descriptor); } } else { return(s_Registry[type]); } } }