public ResolveBehavior ( SlimDX.Generator.ParameterModel model ) : MarshalBehavior | ||
model | SlimDX.Generator.ParameterModel | |
return | MarshalBehavior |
static void BuildTrampolineAssembly(ApiModel api, string outputDirectory, string outputFile) { MarshallingService marshaller = new MarshallingService(); TrampolineAssemblyBuilder trampolineBuilder = new TrampolineAssemblyBuilder(); foreach (var interfaceModel in api.Interfaces) { foreach (var methodModel in interfaceModel.Methods) { var methodType = marshaller.ResolveType(methodModel.Type); if (methodType == null) throw new InvalidOperationException(string.Format("Could not resolve return type for method '{0}.'", methodModel.Name)); var parameters = new List<TrampolineParameter>(); foreach (var parameterModel in methodModel.Parameters) { var parameterType = marshaller.ResolveType(parameterModel); if (parameterType == null) throw new InvalidOperationException(string.Format("Could not resolve type for parameter '{0}.'", parameterModel.Name)); TrampolineParameterFlags flags = TrampolineParameterFlags.Default; if (parameterModel.Flags.HasFlag(ParameterModelFlags.IsOutput) && marshaller.ResolveBehavior(parameterModel) != MarshalBehavior.Structure && marshaller.ResolveBehavior(parameterModel) != MarshalBehavior.Enumeration && marshaller.ResolveBehavior(parameterModel) != MarshalBehavior.Array) flags |= TrampolineParameterFlags.Reference; parameters.Add(parameterModel.Type == ApiModel.VoidModel ? new TrampolineParameter(typeof(IntPtr), flags) : new TrampolineParameter(parameterType, flags)); } trampolineBuilder.Add(new Trampoline(true, methodType, parameters.ToArray())); } } foreach (var functionModel in api.Functions) { var methodType = marshaller.ResolveType(functionModel.Type); if (methodType == null) throw new InvalidOperationException(string.Format("Could not resolve return type for method '{0}.'", functionModel.Name)); var parameters = new List<TrampolineParameter>(); foreach (var parameterModel in functionModel.Parameters) { var parameterType = marshaller.ResolveType(parameterModel); if (parameterType == null) throw new InvalidOperationException(string.Format("Could not resolve type for parameter '{0}.'", parameterModel.Name)); TrampolineParameterFlags flags = TrampolineParameterFlags.Default; if (parameterModel.Flags.HasFlag(ParameterModelFlags.IsOutput)) flags |= TrampolineParameterFlags.Reference; parameters.Add(parameterModel.Type == ApiModel.VoidModel ? new TrampolineParameter(typeof(IntPtr), flags) : new TrampolineParameter(parameterType, flags)); } trampolineBuilder.Add(new Trampoline(false, methodType, parameters.ToArray())); } trampolineBuilder.CreateAssembly(outputDirectory, outputFile); }
/// <summary> /// Gets the code for setup of local variables related to the specified parameter. /// </summary> /// <param name="marshaller">The marshalling service interface.</param> /// <param name="model">The model.</param> /// <returns>The code.</returns> public string GetLocalVariableSetupCode(MarshallingService marshaller, ParameterModel model) { if (model.Flags.HasFlag(ParameterModelFlags.IsOutput)) return string.Empty; var builder = new StringBuilder(); switch (marshaller.ResolveBehavior(model.Type)) { case MarshalBehavior.Structure: builder.AppendLine(string.Format("{0}Marshaller* _{1} = stackalloc {0}Marshaller[{1}.Length];", model.Type.Name, model.Name)); builder.AppendLine(string.Format("for(int i = 0; i < {0}.Length; ++i)", model.Name)); builder.AppendLine(string.Format("\t_{0}[i] = {1}.ToMarshaller({0}[i]);", model.Name, model.Type.Name)); break; case MarshalBehavior.Interface: builder.AppendLine(string.Format("System.IntPtr* _{1} = stackalloc System.IntPtr[{1}.Length];", model.Type.Name, model.Name)); builder.AppendLine(string.Format("for(int i = 0; i < {0}.Length; ++i)", model.Name)); builder.AppendLine(string.Format("\t_{0}[i] = {0}[i].NativePointer;", model.Name, model.Type.Name)); break; default: builder.AppendLine(string.Format("{0}* _{1} = stackalloc {0}[{1}.Length];", model.Type.Name, model.Name)); builder.AppendLine(string.Format("for(int i = 0; i < {0}.Length; ++i)", model.Name)); builder.AppendLine(string.Format("\t_{0}[i] = {0}[i];", model.Name, model.Type.Name)); break; } return builder.ToString(); }
/// <summary> /// Gets the code for setup of local variables related to the specified parameter. /// </summary> /// <param name="marshaller">The marshalling service interface.</param> /// <param name="model">The model.</param> /// <returns>The code.</returns> public string GetLocalVariableSetupCode(MarshallingService marshaller, ParameterModel model) { if (model.Flags.HasFlag(ParameterModelFlags.IsOutput)) { return(string.Empty); } var builder = new StringBuilder(); switch (marshaller.ResolveBehavior(model.Type)) { case MarshalBehavior.Structure: builder.AppendLine(string.Format("{0}Marshaller* _{1} = stackalloc {0}Marshaller[{1}.Length];", model.Type.Name, model.Name)); builder.AppendLine(string.Format("for(int i = 0; i < {0}.Length; ++i)", model.Name)); builder.AppendLine(string.Format("\t_{0}[i] = {1}.ToMarshaller({0}[i]);", model.Name, model.Type.Name)); break; case MarshalBehavior.Interface: builder.AppendLine(string.Format("System.IntPtr* _{1} = stackalloc System.IntPtr[{1}.Length];", model.Type.Name, model.Name)); builder.AppendLine(string.Format("for(int i = 0; i < {0}.Length; ++i)", model.Name)); builder.AppendLine(string.Format("\t_{0}[i] = {0}[i].NativePointer;", model.Name, model.Type.Name)); break; default: builder.AppendLine(string.Format("{0}* _{1} = stackalloc {0}[{1}.Length];", model.Type.Name, model.Name)); builder.AppendLine(string.Format("for(int i = 0; i < {0}.Length; ++i)", model.Name)); builder.AppendLine(string.Format("\t_{0}[i] = {0}[i];", model.Name, model.Type.Name)); break; } return(builder.ToString()); }
static void BuildTrampolineAssembly(ApiModel api, string outputDirectory, string outputFile) { MarshallingService marshaller = new MarshallingService(); TrampolineAssemblyBuilder trampolineBuilder = new TrampolineAssemblyBuilder(); foreach (var interfaceModel in api.Interfaces) { foreach (var methodModel in interfaceModel.Methods) { var methodType = marshaller.ResolveType(methodModel.Type); if (methodType == null) { throw new InvalidOperationException(string.Format("Could not resolve return type for method '{0}.'", methodModel.Name)); } var parameters = new List <TrampolineParameter>(); foreach (var parameterModel in methodModel.Parameters) { var parameterType = marshaller.ResolveType(parameterModel); if (parameterType == null) { throw new InvalidOperationException(string.Format("Could not resolve type for parameter '{0}.'", parameterModel.Name)); } TrampolineParameterFlags flags = TrampolineParameterFlags.Default; if (parameterModel.Flags.HasFlag(ParameterModelFlags.IsOutput) && marshaller.ResolveBehavior(parameterModel) != MarshalBehavior.Structure && marshaller.ResolveBehavior(parameterModel) != MarshalBehavior.Enumeration && marshaller.ResolveBehavior(parameterModel) != MarshalBehavior.Array) { flags |= TrampolineParameterFlags.Reference; } parameters.Add(parameterModel.Type == ApiModel.VoidModel ? new TrampolineParameter(typeof(IntPtr), flags) : new TrampolineParameter(parameterType, flags)); } trampolineBuilder.Add(new Trampoline(true, methodType, parameters.ToArray())); } } foreach (var functionModel in api.Functions) { var methodType = marshaller.ResolveType(functionModel.Type); if (methodType == null) { throw new InvalidOperationException(string.Format("Could not resolve return type for method '{0}.'", functionModel.Name)); } var parameters = new List <TrampolineParameter>(); foreach (var parameterModel in functionModel.Parameters) { var parameterType = marshaller.ResolveType(parameterModel); if (parameterType == null) { throw new InvalidOperationException(string.Format("Could not resolve type for parameter '{0}.'", parameterModel.Name)); } TrampolineParameterFlags flags = TrampolineParameterFlags.Default; if (parameterModel.Flags.HasFlag(ParameterModelFlags.IsOutput)) { flags |= TrampolineParameterFlags.Reference; } parameters.Add(parameterModel.Type == ApiModel.VoidModel ? new TrampolineParameter(typeof(IntPtr), flags) : new TrampolineParameter(parameterType, flags)); } trampolineBuilder.Add(new Trampoline(false, methodType, parameters.ToArray())); } trampolineBuilder.CreateAssembly(outputDirectory, outputFile); }