/// <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("}"); }
/// <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("}"); }
/// <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("}"); }