예제 #1
0
        /// <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);
        }
예제 #2
0
        /// <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]);
                }
            }
        }