static void WriteMessageStretSenderCode (StringWriter writer, TypeData type, bool isSuper) { var nonstret = isSuper ? "objc_msgSendSuper" : "objc_msgSend"; var stret = isSuper ? "objc_msgSendSuper_stret" : "objc_msgSend_stret"; writer.WriteLine ("#if __i386__"); writer.WriteLine ("\tIMP msgSend = (IMP) {0};", type.IsX86Stret ? stret : nonstret); writer.WriteLine ("#elif __x86_64__"); writer.WriteLine ("\tIMP msgSend = (IMP) {0};", type.IsX64Stret ? stret : nonstret); writer.WriteLine ("#elif __arm64__"); writer.WriteLine ("\tIMP msgSend = (IMP) {0};", nonstret); writer.WriteLine ("#elif __arm__"); writer.WriteLine ("\tIMP msgSend = (IMP) {0};", type.IsARMStret ? stret : nonstret); writer.WriteLine ("#else"); writer.WriteLine ("#error unknown architecture"); writer.WriteLine ("#endif"); }
static void MarshalToNative (StringWriter writer, TypeData type, string nativeVariable, string managedVariable) { switch (type.ManagedType) { case "Vector2i": case "Vector2": writer.WriteLine ("\t{0} [0] = {1}.a;", nativeVariable, managedVariable); writer.WriteLine ("\t{0} [1] = {1}.b;", nativeVariable, managedVariable); break; case "Vector3i": case "Vector3": writer.WriteLine ("\t{0} [0] = {1}.a;", nativeVariable, managedVariable); writer.WriteLine ("\t{0} [1] = {1}.b;", nativeVariable, managedVariable); writer.WriteLine ("\t{0} [2] = {1}.c;", nativeVariable, managedVariable); break; case "Vector4i": case "Vector4": if (type.NativeType == "vector_float3") { writer.WriteLine ("\t{0} [0] = {1}.a;", nativeVariable, managedVariable); writer.WriteLine ("\t{0} [1] = {1}.b;", nativeVariable, managedVariable); writer.WriteLine ("\t{0} [2] = {1}.c;", nativeVariable, managedVariable); } else if (type.NativeType == "vector_float4" || type.NativeType == "vector_int4") { writer.WriteLine ("\t{0} [0] = {1}.a;", nativeVariable, managedVariable); writer.WriteLine ("\t{0} [1] = {1}.b;", nativeVariable, managedVariable); writer.WriteLine ("\t{0} [2] = {1}.c;", nativeVariable, managedVariable); writer.WriteLine ("\t{0} [3] = {1}.d;", nativeVariable, managedVariable); } else { goto default; } break; case "Matrix4": writer.WriteLine ("\tfor (int i = 0; i < 4; i++) {"); writer.WriteLine ("\t\t{0}.columns [i][0] = {1}.columns [i].a;", nativeVariable, managedVariable); writer.WriteLine ("\t\t{0}.columns [i][1] = {1}.columns [i].b;", nativeVariable, managedVariable); writer.WriteLine ("\t\t{0}.columns [i][2] = {1}.columns [i].c;", nativeVariable, managedVariable); writer.WriteLine ("\t\t{0}.columns [i][3] = {1}.columns [i].d;", nativeVariable, managedVariable); writer.WriteLine ("\t}"); break; case "MDLAxisAlignedBoundingBox": writer.WriteLine ("\t{0}.maxBounds [0] = {1}.maxBounds.a;", nativeVariable, managedVariable); writer.WriteLine ("\t{0}.maxBounds [1] = {1}.maxBounds.b;", nativeVariable, managedVariable); writer.WriteLine ("\t{0}.maxBounds [2] = {1}.maxBounds.c;", nativeVariable, managedVariable); writer.WriteLine ("\t{0}.minBounds [0] = {1}.minBounds.a;", nativeVariable, managedVariable); writer.WriteLine ("\t{0}.minBounds [1] = {1}.minBounds.b;", nativeVariable, managedVariable); writer.WriteLine ("\t{0}.minBounds [2] = {1}.minBounds.c;", nativeVariable, managedVariable); break; default: throw new NotImplementedException (string.Format ("MarshalToNative for: NativeType: {0} ManagedType: {1}", type.NativeType, type.ManagedType)); } }