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);
|