Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 8 additions & 12 deletions source/MetadataProcessor.Console/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -127,25 +127,20 @@ public void GenerateSkeleton(
string file,
string name,
string project,
bool withoutInteropCode)
bool withoutInteropCode,
bool isCoreLibrary)
{
try
{
if (!withoutInteropCode)
{
System.Console.Error.WriteLine("Generator for Interop stubs is not supported yet.");

Environment.Exit(1);
}

if (Verbose) System.Console.WriteLine("Generating skeleton files...");

var skeletonGenerator = new nanoSkeletonGenerator(
_assemblyBuilder.TablesContext,
file,
name,
project,
withoutInteropCode);
withoutInteropCode,
isCoreLibrary);

skeletonGenerator.GenerateSkeleton();
}
Expand Down Expand Up @@ -185,6 +180,8 @@ public static void Main(string[] args)
{
FileVersionInfo fileVersion = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location);

bool isCoreLibrary = false;

// output header to console
System.Console.WriteLine($"nanoFramework MetadataProcessor Utility v{fileVersion.ToString()}");
System.Console.WriteLine("Copyright (c) 2019 nanoFramework project contributors");
Expand Down Expand Up @@ -222,8 +219,6 @@ public static void Main(string[] args)
}
else if (arg == "-compile" && i + 2 < args.Length)
{
bool isCoreLibrary = false;

if (!bool.TryParse(args[i + 2], out isCoreLibrary))
{
System.Console.Error.WriteLine("Bad parameter for compile. IsCoreLib options has to be 'true' or 'false'.");
Expand Down Expand Up @@ -273,7 +268,8 @@ public static void Main(string[] args)
file,
name,
project,
withoutInteropCode);
withoutInteropCode,
isCoreLibrary);

i += 4;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
//
// Copyright (c) 2019 The nanoFramework project contributors
// See LICENSE file in the project root for full license information.
//

using Mono.Cecil;
using System.Text;
using System.Linq;

namespace nanoFramework.Tools.MetadataProcessor.Core.Extensions
{
internal static class ParameterDefintionExtensions
{
public static string TypeToString(this ParameterDefinition parameter)
{
if(parameter.ParameterType is ByReferenceType byReference)
{
// pointer to native type
return " *" + byReference.TypeSignatureAsString();
}
else if (parameter.ParameterType is ArrayType arrayType)
{
return "CLR_RT_TypedArray_" + arrayType.ElementType.TypeSignatureAsString();
}
else if (parameter.ParameterType.IsValueType)
{
return parameter.ParameterType.Resolve().TypeSignatureAsString();
}
else
{
return parameter.ParameterType.TypeSignatureAsString();
}
}
}
}
214 changes: 214 additions & 0 deletions source/MetadataProcessor.Core/Extensions/TypeReferenceExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
//

using Mono.Cecil;
using System.Text;

namespace nanoFramework.Tools.MetadataProcessor.Core.Extensions
{
Expand All @@ -13,5 +14,218 @@ public static bool IsToInclude(this TypeReference value)
{
return !nanoTablesContext.IgnoringAttributes.Contains(value.FullName);
}

public static string TypeSignatureAsString(this TypeReference type)
{
if (type.MetadataType == MetadataType.IntPtr)
{
return "I";
}

if (type.MetadataType == MetadataType.UIntPtr)
{
return "U";
}

nanoCLR_DataType dataType;
if (nanoSignaturesTable.PrimitiveTypes.TryGetValue(type.FullName, out dataType))
{
switch (dataType)
{
case nanoCLR_DataType.DATATYPE_VOID:
case nanoCLR_DataType.DATATYPE_BOOLEAN:
case nanoCLR_DataType.DATATYPE_CHAR:
case nanoCLR_DataType.DATATYPE_I1:
case nanoCLR_DataType.DATATYPE_U1:
case nanoCLR_DataType.DATATYPE_I2:
case nanoCLR_DataType.DATATYPE_U2:
case nanoCLR_DataType.DATATYPE_I4:
case nanoCLR_DataType.DATATYPE_U4:
case nanoCLR_DataType.DATATYPE_I8:
case nanoCLR_DataType.DATATYPE_U8:
case nanoCLR_DataType.DATATYPE_R4:
case nanoCLR_DataType.DATATYPE_BYREF:
case nanoCLR_DataType.DATATYPE_OBJECT:
return dataType.ToString().Replace("DATATYPE_", "");

case nanoCLR_DataType.DATATYPE_LAST_PRIMITIVE:
return "STRING";

case nanoCLR_DataType.DATATYPE_LAST_PRIMITIVE_TO_PRESERVE:
return "R8";

case nanoCLR_DataType.DATATYPE_LAST_PRIMITIVE_TO_MARSHAL:
return "TIMESPAN";

case nanoCLR_DataType.DATATYPE_REFLECTION:
return type.FullName.Replace(".", "");
}
}

if (type.MetadataType == MetadataType.Class)
{
StringBuilder classSig = new StringBuilder("CLASS [");
classSig.Append(type.MetadataToken.ToInt32().ToString("x8"));
classSig.Append("]");

return classSig.ToString();
}

if (type.MetadataType == MetadataType.ValueType)
{
StringBuilder valueTypeSig = new StringBuilder("VALUETYPE [");
valueTypeSig.Append(type.MetadataToken.ToInt32().ToString("x8"));
valueTypeSig.Append("]");

return valueTypeSig.ToString();
}

if (type.IsArray)
{
StringBuilder arraySig = new StringBuilder("SZARRAY ");
arraySig.Append(type.GetElementType().TypeSignatureAsString());

return arraySig.ToString();
}

return "";
}

public static string ToNativeTypeAsString(this TypeReference type)
{
nanoCLR_DataType dataType;
if (nanoSignaturesTable.PrimitiveTypes.TryGetValue(type.FullName, out dataType))
{
switch (dataType)
{
case nanoCLR_DataType.DATATYPE_VOID:
return "void";
case nanoCLR_DataType.DATATYPE_BOOLEAN:
return "bool";
case nanoCLR_DataType.DATATYPE_CHAR:
return "char";
case nanoCLR_DataType.DATATYPE_I1:
return "int8_t";
case nanoCLR_DataType.DATATYPE_U1:
return "uint8_t";
case nanoCLR_DataType.DATATYPE_I2:
return "int16_t";
case nanoCLR_DataType.DATATYPE_U2:
return "uint16_t";
case nanoCLR_DataType.DATATYPE_I4:
return "int32_t";
case nanoCLR_DataType.DATATYPE_U4:
return "uint32_t";
case nanoCLR_DataType.DATATYPE_I8:
return "int64_t";
case nanoCLR_DataType.DATATYPE_U8:
return "uint64_t";
case nanoCLR_DataType.DATATYPE_R4:
return "float";
case nanoCLR_DataType.DATATYPE_BYREF:
return "";

// system.String
case nanoCLR_DataType.DATATYPE_LAST_PRIMITIVE:
return "const char*";

// System.Double
case nanoCLR_DataType.DATATYPE_LAST_PRIMITIVE_TO_PRESERVE:
return "double";

default:
return "UNSUPPORTED";
}
}

if (type.MetadataType == MetadataType.Class)
{
return "UNSUPPORTED";
}

if (type.MetadataType == MetadataType.ValueType)
{
return "UNSUPPORTED";
}

if (type.IsArray)
{
StringBuilder arraySig = new StringBuilder("CLR_RT_TypedArray_");
arraySig.Append(type.GetElementType().ToCLRTypeAsString());

return arraySig.ToString();
}

return "";
}

public static string ToCLRTypeAsString(this TypeReference type)
{
nanoCLR_DataType dataType;
if (nanoSignaturesTable.PrimitiveTypes.TryGetValue(type.FullName, out dataType))
{
switch (dataType)
{
case nanoCLR_DataType.DATATYPE_VOID:
return "void";
case nanoCLR_DataType.DATATYPE_BOOLEAN:
return "bool";
case nanoCLR_DataType.DATATYPE_CHAR:
return "CHAR";
case nanoCLR_DataType.DATATYPE_I1:
return "INT8";
case nanoCLR_DataType.DATATYPE_U1:
return "UINT8";
case nanoCLR_DataType.DATATYPE_I2:
return "INT16";
case nanoCLR_DataType.DATATYPE_U2:
return "UINT16";
case nanoCLR_DataType.DATATYPE_I4:
return "INT32";
case nanoCLR_DataType.DATATYPE_U4:
return "UINT32";
case nanoCLR_DataType.DATATYPE_I8:
return "INT64";
case nanoCLR_DataType.DATATYPE_U8:
return "UINT64";
case nanoCLR_DataType.DATATYPE_R4:
return "float";
case nanoCLR_DataType.DATATYPE_BYREF:
return "NONE";

// system.String
case nanoCLR_DataType.DATATYPE_LAST_PRIMITIVE:
return "LPCSTR";

// System.Double
case nanoCLR_DataType.DATATYPE_LAST_PRIMITIVE_TO_PRESERVE:
return "double";

default:
return "UNSUPPORTED";
}
}

if (type.MetadataType == MetadataType.Class)
{
return "UNSUPPORTED";
}

if (type.MetadataType == MetadataType.ValueType)
{
return "UNSUPPORTED";
}

if (type.IsArray)
{
StringBuilder arraySig = new StringBuilder();
arraySig.Append(type.GetElementType().ToCLRTypeAsString());
arraySig.Append("_ARRAY");

return arraySig.ToString();
}

return "";
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@
<Compile Include="DumpGenerator\DumpAllTable.cs" />
<Compile Include="DumpGenerator\DumpTemplates.cs" />
<Compile Include="Endianness\nanoBinaryWriter.cs" />
<Compile Include="Extensions\ParameterDefintionExtensions.cs" />
<Compile Include="Extensions\ByteArrayExtensions.cs" />
<Compile Include="Extensions\TypeReferenceExtensions.cs" />
<Compile Include="Extensions\TypeDefinitionExtensions.cs" />
Expand Down
24 changes: 22 additions & 2 deletions source/MetadataProcessor.Core/SkeletonGenerator/AssemblyClass.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,17 +13,20 @@ public class AssemblyDeclaration
public string ShortName;
public string ShortNameUpper;

public bool IsCoreLib = false;

public List<Class> Classes = new List<Class>();
}

public class Class
{
public string Name;
public string AssemblyName;
public string ShortNameUpper;

public List<StaticField> StaticFields = new List<StaticField>();
public List<InstanceField> InstanceFields = new List<InstanceField>();
public List<Method> Methods = new List<Method>();
public List<MethodStub> Methods = new List<MethodStub>();
}

public class StaticField
Expand All @@ -40,8 +43,25 @@ public class InstanceField
public string FieldWarning;
}

public class Method
public class MethodStub
{
public string Declaration;
public string DeclarationForUserCode;
public string CallFromMarshalling;
public string ReturnType;
public string MarshallingReturnType;
public bool HasReturnType;
public bool IsStatic = false;

public List<ParameterDeclaration> ParameterDeclaration = new List<ParameterDeclaration>();
}

public class ParameterDeclaration
{
public string Index;
public string Type;
public string Name;
public string MarshallingDeclaration;
public string Declaration;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,16 @@ public class AssemblyClassStubs
{
public string HeaderFileName;

public List<Method> Functions = new List<Method>();
public string ClassHeaderFileName;

public string ClassName;

public string ShortNameUpper;

public string RootNamespace;

public string ProjectName;

public List<MethodStub> Functions = new List<MethodStub>();
}
}
Loading