Пример #1
0
        /// <summary>
        /// Generate the command implementation (fixed variant).
        /// </summary>
        /// <param name="sw">
        /// The <see cref="SourceStreamWriter"/> used to write the source code.
        /// </param>
        /// <param name="ctx">
        /// The <see cref="RegistryContext"/> defining the OpenGL registry information.
        /// </param>
        /// <param name="commandParams">
        /// A <see cref="T:List{CommandParameter}"/> determining the method overload.
        /// </param>
        private void GenerateImplementation_Default(SourceStreamWriter sw, RegistryContext ctx, List <CommandParameter> commandParams)
        {
            List <Command> aliases      = new List <Command>();
            Command        aliasCommand = this;

            // The implementation returned type
            string returnType = aliasCommand.GetImplementationReturnType(ctx);
            // Is fixed implementation
            bool fixedImplementation = IsFixedImplementation(ctx, commandParams);

            aliases.Add(this);
            aliases.AddRange(Aliases);

            // Signature
            GenerateImplementation_Signature(sw, ctx, commandParams);

            // Implementation block
            sw.WriteLine("{");
            sw.Indent();

            #region Debug Assertions

            // Debug assertions
            foreach (CommandParameter param in commandParams)
            {
                param.WriteDebugAssertion(sw, ctx, this);
            }

            #endregion

            #region Local Variables

            // Local variable: returned value
            if (HasReturnValue)
            {
                sw.WriteLine("{0} {1};", DelegateReturnType, ReturnVariableName);
                sw.WriteLine();
            }

            #endregion

            #region Unsafe Block (Open)

            if (fixedImplementation)
            {
                sw.WriteLine("unsafe {");                                                                               // (1)
                sw.Indent();

                foreach (CommandParameter param in commandParams)
                {
                    param.WriteFixedStatement(sw, ctx, this);
                }

                sw.WriteLine("{");                                                                                              // (2)
                sw.Indent();
            }

            #endregion

            sw.WriteLine("Debug.Assert(Delegates.{0} != null, \"{0} not implemented\");", aliasCommand.DelegateName);

            #region Delegate Call

            sw.WriteIdentation();

            // Local return value
            if (HasReturnValue)
            {
                sw.Write("{0} = ", ReturnVariableName);
            }

            sw.Write("Delegates.{0}(", aliasCommand.DelegateName);

            #region Parameters

            for (int i = 0; i < commandParams.Count; i++)
            {
                CommandParameter param = commandParams[i];

                param.WriteDelegateParam(sw, ctx, this);

                if (i != Parameters.Count - 1)
                {
                    sw.Write(", ");
                }
            }

            #endregion

            sw.Write(")");

            sw.Write(";");
            sw.WriteLine();

            #endregion

            #region Call Log

            sw.WriteIdentation(); sw.Write("LogFunction(");

            #region Call Log - Format String

            sw.Write("\"{0}(", aliasCommand.ImportName);
            for (int i = 0; i < commandParams.Count; i++)
            {
                commandParams[i].WriteCallLogFormatParam(sw, ctx, this, i);
                if (i < commandParams.Count - 1)
                {
                    sw.Write(", ");
                }
            }
            sw.Write(")");

            if (HasReturnValue)
            {
                sw.Write(" = {{{0}}}", commandParams.Count);
            }

            sw.Write("\"");

            #endregion

            #region Call Log - Format Arguments

            if ((commandParams.Count > 0) || HasReturnValue)
            {
                sw.Write(", ");

                for (int i = 0; i < commandParams.Count; i++)
                {
                    commandParams[i].WriteCallLogArgParam(sw, ctx, this);
                    if (i < commandParams.Count - 1)
                    {
                        sw.Write(", ");
                    }
                }
            }

            // Return value
            if (HasReturnValue)
            {
                if (commandParams.Count > 0)
                {
                    sw.Write(", ");
                }
                CommandParameter.WriteCallLogArgParam(sw, GetReturnValueExpression(ctx), returnType);
            }

            #endregion

            sw.Write(");");
            sw.WriteLine();

            #endregion

            #region Unsafe Block (Close)

            if (fixedImplementation)
            {
                sw.Unindent();
                sw.WriteLine("}");                                                                                              // (2) CLOSED
                sw.Unindent();
                sw.WriteLine("}");                                                                                              // (1) CLOSED
            }

            #endregion

            // Check call errors
            if ((Flags & CommandFlags.NoGetError) == 0)
            {
                string returnValue = "null";

                // Optionally pass the returned value to error checking method
                if (HasReturnValue)
                {
                    returnValue = ReturnVariableName;
                }

                sw.WriteLine("DebugCheckErrors({0});", returnValue);
            }

            // Returns value
            if (HasReturnValue)
            {
                sw.WriteLine();
                sw.WriteLine("return ({0});", GetReturnValueExpression(ctx));
            }

            sw.Unindent();
            sw.WriteLine("}");
        }
Пример #2
0
        /// <summary>
        /// Generate the command implementation (pinned variant).
        /// </summary>
        /// <param name="sw">
        /// The <see cref="SourceStreamWriter"/> used to write the source code.
        /// </param>
        /// <param name="ctx">
        /// The <see cref="RegistryContext"/> defining the OpenGL registry information.
        /// </param>
        /// <param name="commandParams">
        /// A <see cref="T:List{CommandParameter}"/> determining the method overload.
        /// </param>
        private void GenerateImplementation_Pinned(SourceStreamWriter sw, RegistryContext ctx, List <CommandParameter> commandParams)
        {
            // Signature
            GenerateImplementation_Signature(sw, ctx, commandParams);

            // Implementation block
            sw.WriteLine("{");
            sw.Indent();

            #region Pinned Object Block (Open)

            foreach (CommandParameter param in commandParams)
            {
                param.WritePinnedVariable(sw, ctx, this);
            }

            sw.WriteLine("try {");
            sw.Indent();

            #endregion

            #region Implementation Call

            sw.WriteIdentation();
            if (HasReturnValue)
            {
                sw.Write("return (");
            }

            sw.Write("{0}(", GetImplementationName(ctx));

            #region Parameters

            for (int i = 0; i < commandParams.Count; i++)
            {
                CommandParameter param = commandParams[i];

                param.WriteDelegateParam(sw, ctx, this);

                if (i != commandParams.Count - 1)
                {
                    sw.Write(", ");
                }
            }

            #endregion

            sw.Write(")");

            if (HasReturnValue)
            {
                sw.Write(")");
            }
            sw.Write(";");
            sw.WriteLine();

            #endregion

            #region Pinned Object Block (Close)

            sw.Unindent();
            sw.WriteLine("} finally {");
            sw.Indent();

            foreach (CommandParameter param in commandParams)
            {
                param.WriteUnpinCommand(sw, ctx, this);
            }

            sw.Unindent();
            sw.WriteLine("}");

            #endregion

            sw.Unindent();
            sw.WriteLine("}");
        }
Пример #3
0
        /// <summary>
        /// Generate the command implementation (generate one object variant).
        /// </summary>
        /// <param name="sw">
        /// The <see cref="SourceStreamWriter"/> used to write the source code.
        /// </param>
        /// <param name="ctx">
        /// The <see cref="RegistryContext"/> defining the OpenGL registry information.
        /// </param>
        /// <param name="commandParams">
        /// A <see cref="T:List{CommandParameter}"/> determining the method overload.
        /// </param>
        private void GenerateImplementation_GenOneObject(SourceStreamWriter sw, RegistryContext ctx)
        {
            List <CommandParameter> commandParams = new List <CommandParameter>();
            string implementationName             = GetImplementationName(ctx);

            if (implementationName.EndsWith("ies"))
            {
                implementationName = implementationName.Substring(0, implementationName.Length - 3) + "y";
            }
            else if (implementationName.EndsWith("s"))
            {
                implementationName = implementationName.Substring(0, implementationName.Length - 1);
            }

            foreach (CommandParameter commandParameter in Parameters)
            {
                commandParams.Add(new CommandParameterArrayLength(commandParameter, ctx, this));
            }

            List <CommandParameterArrayLength> arrayParameters = new List <CommandParameterArrayLength>();
            List <CommandParameter>            signatureParams = commandParams.FindAll(delegate(CommandParameter item) {
                bool compatible       = CommandParameterArrayLength.IsCompatible(ctx, this, item);
                bool arrayLengthParam = CommandParameterArrayLength.IsArrayLengthParameter(item, ctx, this);

                if (compatible)
                {
                    arrayParameters.Add((CommandParameterArrayLength)item);
                }

                return(!compatible && !arrayLengthParam);
            });

            Debug.Assert(arrayParameters.Count == 1);
            CommandParameterArrayLength returnParameter = arrayParameters[0];
            string returnParameterType = returnParameter.GetImplementationType(ctx, this);

            // Remove []
            returnParameterType = returnParameterType.Substring(0, returnParameterType.Length - 2);

            // Signature
            GenerateImplementation_Signature(sw, ctx, signatureParams, implementationName, returnParameterType);

            // Implementation block
            sw.WriteLine("{");
            sw.Indent();

            #region Local Variables

            sw.WriteLine("{0}[] {1} = new {0}[1];", returnParameterType, ReturnVariableName);

            #endregion

            #region Implementation Call

            sw.WriteIdentation();
            sw.Write("{0}(", GetImplementationName(ctx));

            #region Parameters

            for (int i = 0; i < commandParams.Count; i++)
            {
                CommandParameter param = commandParams[i];

                if (CommandParameterArrayLength.IsArrayLengthParameter(param, ctx, this))
                {
                    continue;
                }
                else if (CommandParameterArrayLength.IsCompatible(ctx, this, param))
                {
                    sw.Write(ReturnVariableName);
                }
                else
                {
                    param.WriteDelegateParam(sw, ctx, this);
                }

                if (i != commandParams.Count - 1)
                {
                    sw.Write(", ");
                }
            }

            #endregion

            sw.Write(");");
            sw.WriteLine();

            sw.WriteLine("return ({0}[0]);", ReturnVariableName);

            #endregion

            sw.Unindent();
            sw.WriteLine("}");
        }