// Path: src/main/java/com/pantor/blink/DynClass.java
// public static String getDescriptor (java.lang.reflect.Method m)
// {
//    StringBuilder descr = new StringBuilder ();
//    descr.append ('(');
//    for (Class<?> prm : m.getParameterTypes ())
//       descr.append (getDescriptor (prm));
//    descr.append (')');
//    descr.append (getDescriptor (m.getReturnType ()));
//    return descr.toString (); 
// }
// 
// Path: src/main/java/com/pantor/blink/CodegenUtil.java
// public static Class<?> mapType (Schema.TypeCode code)
// {
//    switch (code)
//    {
//     case I8:              return Byte.TYPE;
//     case U8:              return Byte.TYPE;
//     case I16:             return Short.TYPE;
//     case U16:             return Short.TYPE;
//     case I32:             return Integer.TYPE;
//     case U32:             return Integer.TYPE;
//     case I64:             return Long.TYPE;
//     case U64:             return Long.TYPE;
//     case F64:             return Double.TYPE;
//     case Decimal:         return Decimal.class;
//     case FixedDec:        return Long.TYPE;
//     case Date:            return Integer.TYPE;
//     case TimeOfDayMilli:  return Integer.TYPE;
//     case TimeOfDayNano:   return Long.TYPE;
//     case Nanotime:        return Long.TYPE;
//     case Millitime:       return Long.TYPE;
//     case Bool:            return Boolean.TYPE;
//     case String:          return String.class;
//     case Binary:          return byte [].class;
//     case Fixed:           return byte [].class;
//     case Object:          return Object.class;
//     case Ref:             return Integer.TYPE;
//     case Enum:            return Integer.TYPE;
//     default:              return Integer.TYPE;
//    }
// }
// 
// Path: src/main/java/com/pantor/blink/CodegenUtil.java
// public static Class<?> mapArrayType (Schema.TypeCode code)
// {
//    return DynClass.getArrayClass (mapType (code));
// }


import java.util.HashMap;
import java.util.HashSet;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import static com.pantor.blink.DynClass.getDescriptor;
import static com.pantor.blink.CodegenUtil.mapType;
import static com.pantor.blink.CodegenUtil.mapArrayType;
      
      if (t.isDynamic () || t.isObject ())
      {
         dc.aload2 (); // Reader, #depth: 2
         dc.aload0 (); // src, #depth: 3
         dc.invokeVirtual ("com.pantor.blink.CompactReader", "readObject",
                           "(Lcom/pantor/blink/ByteSource;)Ljava/lang/Object;");
         if (argType != null && argType != Object.class)
            dc.checkCast (argType);
      }
      else
      {
         ObjectModel.GroupBinding comp = f.getComponent ().toGroup ();
         NsName compName = comp.getGroup ().getName ();
         prime (compName);
         if (sf.isOptional ())
         {
            dc.aload0 (); // src, #depth: 2
            invokeReader (dc, "skipByte", "V"); // Skip presence byte
         }
         String sig = getReadSignature (comp.getTargetType ().getName ());
         dc.aload0 (); // src, #depth: 2
         dc.aload2 (); // Reader, #depth: 3
         dc.invokeStatic (getDecoderClassName (compName), "read", sig);
      }
   }

   private void compileGroupArrayField (ObjectModel.Field f, DynClass dc)
      throws BlinkException
   {
// Path: src/main/java/com/pantor/blink/DynClass.java
// public static String getDescriptor (java.lang.reflect.Method m)
// {
//    StringBuilder descr = new StringBuilder ();
//    descr.append ('(');
//    for (Class<?> prm : m.getParameterTypes ())
//       descr.append (getDescriptor (prm));
//    descr.append (')');
//    descr.append (getDescriptor (m.getReturnType ()));
//    return descr.toString (); 
// }
// 
// Path: src/main/java/com/pantor/blink/CodegenUtil.java
// public static Class<?> mapType (Schema.TypeCode code)
// {
//    switch (code)
//    {
//     case I8:              return Byte.TYPE;
//     case U8:              return Byte.TYPE;
//     case I16:             return Short.TYPE;
//     case U16:             return Short.TYPE;
//     case I32:             return Integer.TYPE;
//     case U32:             return Integer.TYPE;
//     case I64:             return Long.TYPE;
//     case U64:             return Long.TYPE;
//     case F64:             return Double.TYPE;
//     case Decimal:         return Decimal.class;
//     case FixedDec:        return Long.TYPE;
//     case Date:            return Integer.TYPE;
//     case TimeOfDayMilli:  return Integer.TYPE;
//     case TimeOfDayNano:   return Long.TYPE;
//     case Nanotime:        return Long.TYPE;
//     case Millitime:       return Long.TYPE;
//     case Bool:            return Boolean.TYPE;
//     case String:          return String.class;
//     case Binary:          return byte [].class;
//     case Fixed:           return byte [].class;
//     case Object:          return Object.class;
//     case Ref:             return Integer.TYPE;
//     case Enum:            return Integer.TYPE;
//     default:              return Integer.TYPE;
//    }
// }
// 
// Path: src/main/java/com/pantor/blink/CodegenUtil.java
// public static Class<?> mapArrayType (Schema.TypeCode code)
// {
//    return DynClass.getArrayClass (mapType (code));
// }


// Path: src/main/java/com/pantor/blink/CompactReaderCompiler.java
import java.util.HashMap;
import java.util.HashSet;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import static com.pantor.blink.DynClass.getDescriptor;
import static com.pantor.blink.CodegenUtil.mapType;
import static com.pantor.blink.CodegenUtil.mapArrayType;

      
      if (t.isDynamic () || t.isObject ())
      {
         dc.aload2 (); // Reader, #depth: 2
         dc.aload0 (); // src, #depth: 3
         dc.invokeVirtual ("com.pantor.blink.CompactReader", "readObject",
                           "(Lcom/pantor/blink/ByteSource;)Ljava/lang/Object;");
         if (argType != null && argType != Object.class)
            dc.checkCast (argType);
      }
      else
      {
         ObjectModel.GroupBinding comp = f.getComponent ().toGroup ();
         NsName compName = comp.getGroup ().getName ();
         prime (compName);
         if (sf.isOptional ())
         {
            dc.aload0 (); // src, #depth: 2
            invokeReader (dc, "skipByte", "V"); // Skip presence byte
         }
         String sig = getReadSignature (comp.getTargetType ().getName ());
         dc.aload0 (); // src, #depth: 2
         dc.aload2 (); // Reader, #depth: 3
         dc.invokeStatic (getDecoderClassName (compName), "read", sig);
      }
   }

   private void compileGroupArrayField (ObjectModel.Field f, DynClass dc)
      throws BlinkException
   {
      Schema.TypeInfo t = f.getFieldType ();