< prev index next >

jdk/src/java.base/share/classes/jdk/experimental/value/ValueType.java

Print this page




  51 // Rough place holder just now...
  52 public class ValueType<T> {
  53 
  54     static final Unsafe UNSAFE = Unsafe.getUnsafe();
  55 
  56     enum ValueHandleKind {
  57         BOX,
  58         UNBOX,
  59         DEFAULT,
  60         EQ,
  61         HASH,
  62         WITHER() {
  63             @Override
  64             ValueHandleKey key(Object fieldName) {
  65                return new ValueHandleKey(this, fieldName);
  66             }
  67         },
  68         NEWARRAY,
  69         VALOAD,
  70         VASTORE,

  71         MULTINEWARRAY() {
  72             @Override
  73             ValueHandleKey key(Object dims) {
  74                return new ValueHandleKey(this, dims);
  75             }
  76         },
  77         IDENTITY,
  78         GETTER() {
  79             @Override
  80             ValueHandleKey key(Object fieldName) {
  81                return new ValueHandleKey(this, fieldName);
  82             }
  83         };
  84 
  85         ValueHandleKey key() {
  86             return new ValueHandleKey(this, null);
  87         }
  88 
  89         ValueHandleKey key(Object optArg) {
  90             throw new IllegalStateException();


 326                     });
 327             handleMap.put(key, result);
 328         }
 329         return result;
 330     }
 331 
 332     public MethodHandle arrayGetter() {
 333         Class<?> arrayValueClass = arrayValueClass();
 334         ValueHandleKey key = ValueHandleKind.VALOAD.key();
 335         MethodHandle result = handleMap.get(key);
 336         if (result == null) {
 337             result = MethodHandleBuilder.loadCode(boxLookup, mhName("arrayGet"), MethodType.methodType(valueClass(), arrayValueClass, int.class),
 338                     C -> {
 339                         C.load(0).load(1).vaload().vreturn();
 340                     });
 341             handleMap.put(key, result);
 342         }
 343         return result;
 344     }
 345 














 346     public MethodHandle arraySetter() {
 347         Class<?> arrayValueClass = arrayValueClass();
 348         ValueHandleKey key = ValueHandleKind.VASTORE.key();
 349         MethodHandle result = handleMap.get(key);
 350         if (result == null) {
 351             result = MethodHandleBuilder.loadCode(boxLookup, mhName("arraySet"), MethodType.methodType(void.class, arrayValueClass, int.class, valueClass()),
 352                     C -> {
 353                         C.load(0).load(1).load(2).vastore().return_();
 354                     });
 355             handleMap.put(key, result);
 356         }
 357         return result;
 358     }
 359 
 360     public MethodHandle newMultiArray(int dims) {
 361         Class<?> arrayValueClass = arrayValueClass(dims);
 362         ValueHandleKey key = ValueHandleKind.MULTINEWARRAY.key(dims);
 363         MethodHandle result = handleMap.get(key);
 364         Class<?>[] params = new Class<?>[dims];
 365         Arrays.fill(params, int.class);




  51 // Rough place holder just now...
  52 public class ValueType<T> {
  53 
  54     static final Unsafe UNSAFE = Unsafe.getUnsafe();
  55 
  56     enum ValueHandleKind {
  57         BOX,
  58         UNBOX,
  59         DEFAULT,
  60         EQ,
  61         HASH,
  62         WITHER() {
  63             @Override
  64             ValueHandleKey key(Object fieldName) {
  65                return new ValueHandleKey(this, fieldName);
  66             }
  67         },
  68         NEWARRAY,
  69         VALOAD,
  70         VASTORE,
  71         ARRAYLENGTH,
  72         MULTINEWARRAY() {
  73             @Override
  74             ValueHandleKey key(Object dims) {
  75                return new ValueHandleKey(this, dims);
  76             }
  77         },
  78         IDENTITY,
  79         GETTER() {
  80             @Override
  81             ValueHandleKey key(Object fieldName) {
  82                return new ValueHandleKey(this, fieldName);
  83             }
  84         };
  85 
  86         ValueHandleKey key() {
  87             return new ValueHandleKey(this, null);
  88         }
  89 
  90         ValueHandleKey key(Object optArg) {
  91             throw new IllegalStateException();


 327                     });
 328             handleMap.put(key, result);
 329         }
 330         return result;
 331     }
 332 
 333     public MethodHandle arrayGetter() {
 334         Class<?> arrayValueClass = arrayValueClass();
 335         ValueHandleKey key = ValueHandleKind.VALOAD.key();
 336         MethodHandle result = handleMap.get(key);
 337         if (result == null) {
 338             result = MethodHandleBuilder.loadCode(boxLookup, mhName("arrayGet"), MethodType.methodType(valueClass(), arrayValueClass, int.class),
 339                     C -> {
 340                         C.load(0).load(1).vaload().vreturn();
 341                     });
 342             handleMap.put(key, result);
 343         }
 344         return result;
 345     }
 346 
 347     public MethodHandle arrayLength() {
 348         Class<?> arrayValueClass = arrayValueClass();
 349         ValueHandleKey key = ValueHandleKind.ARRAYLENGTH.key();
 350         MethodHandle result = handleMap.get(key);
 351         if (result == null) {
 352             result = MethodHandleBuilder.loadCode(boxLookup, mhName("arrayLength"), MethodType.methodType(int.class, arrayValueClass),
 353                     C -> {
 354                         C.load(0).arraylength().ireturn();
 355                     });
 356             handleMap.put(key, result);
 357         }
 358         return result;
 359     }
 360 
 361     public MethodHandle arraySetter() {
 362         Class<?> arrayValueClass = arrayValueClass();
 363         ValueHandleKey key = ValueHandleKind.VASTORE.key();
 364         MethodHandle result = handleMap.get(key);
 365         if (result == null) {
 366             result = MethodHandleBuilder.loadCode(boxLookup, mhName("arraySet"), MethodType.methodType(void.class, arrayValueClass, int.class, valueClass()),
 367                     C -> {
 368                         C.load(0).load(1).load(2).vastore().return_();
 369                     });
 370             handleMap.put(key, result);
 371         }
 372         return result;
 373     }
 374 
 375     public MethodHandle newMultiArray(int dims) {
 376         Class<?> arrayValueClass = arrayValueClass(dims);
 377         ValueHandleKey key = ValueHandleKind.MULTINEWARRAY.key(dims);
 378         MethodHandle result = handleMap.get(key);
 379         Class<?>[] params = new Class<?>[dims];
 380         Arrays.fill(params, int.class);


< prev index next >