@Override
 public GExpr memberOf(
     MethodGenerator mv,
     RecordValue instance,
     int offset,
     int size,
     TypeStrategy fieldTypeStrategy) {
   return layout.memberOf(mv, instance, offset, size, fieldTypeStrategy);
 }
  @Override
  public RecordValue variable(GimpleVarDecl decl, VarAllocator allocator) {

    JLValue instance =
        allocator.reserve(decl.getName(), layout.getType(), new RecordConstructor(this));

    if (isUnitPointer()) {
      // If we are using the RecordUnitPtr strategy, then the record value is also it's address
      return new RecordValue(instance, new RecordUnitPtr(instance));

    } else if (decl.isAddressable()) {
      JLValue unitArray =
          allocator.reserveUnitArray(
              decl.getName(), layout.getType(), Optional.of((JExpr) instance));
      FatPtrPair address = new FatPtrPair(new RecordClassValueFunction(this), unitArray);
      JExpr value = Expressions.elementAt(address.getArray(), 0);
      return new RecordValue(value, address);

    } else {

      return new RecordValue(instance);
    }
  }
 public Type getJvmType() {
   return layout.getType();
 }
 public RecordValue clone(MethodGenerator mv, RecordValue recordValue) {
   return layout.clone(mv, recordValue);
 }