< prev index next >

src/jdk.incubator.foreign/share/classes/jdk/internal/foreign/abi/SharedUtils.java

Print this page

 20  *
 21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 22  * or visit www.oracle.com if you need additional information or have any
 23  * questions.
 24  */
 25 package jdk.internal.foreign.abi;
 26 
 27 import jdk.incubator.foreign.CSupport;
 28 import jdk.incubator.foreign.ForeignLinker;
 29 import jdk.incubator.foreign.FunctionDescriptor;
 30 import jdk.incubator.foreign.GroupLayout;
 31 import jdk.incubator.foreign.MemoryAddress;
 32 import jdk.incubator.foreign.MemoryHandles;
 33 import jdk.incubator.foreign.MemoryLayout;
 34 import jdk.incubator.foreign.MemorySegment;
 35 import jdk.incubator.foreign.SequenceLayout;
 36 import jdk.incubator.foreign.ValueLayout;
 37 import jdk.internal.foreign.MemoryAddressImpl;
 38 import jdk.internal.foreign.Utils;
 39 import jdk.internal.foreign.abi.aarch64.AArch64Linker;

 40 import jdk.internal.foreign.abi.x64.sysv.SysVx64Linker;
 41 import jdk.internal.foreign.abi.x64.windows.Windowsx64Linker;
 42 
 43 import java.lang.invoke.MethodHandle;
 44 import java.lang.invoke.MethodHandles;
 45 import java.lang.invoke.MethodType;
 46 import java.lang.invoke.VarHandle;
 47 import java.util.List;
 48 import java.util.function.Consumer;
 49 import java.util.stream.IntStream;
 50 
 51 import static java.lang.invoke.MethodHandles.collectArguments;
 52 import static java.lang.invoke.MethodHandles.identity;
 53 import static java.lang.invoke.MethodHandles.insertArguments;
 54 import static java.lang.invoke.MethodHandles.permuteArguments;
 55 import static java.lang.invoke.MethodType.methodType;
 56 import static jdk.incubator.foreign.CSupport.*;
 57 
 58 public class SharedUtils {
 59 

256             default -> throw new IllegalStateException("Unknown linker name: " + name);
257         };
258     }
259 
260     public static VarHandle vhPrimitiveOrAddress(Class<?> carrier, MemoryLayout layout) {
261         return carrier == MemoryAddress.class
262             ? MemoryHandles.asAddressVarHandle(layout.varHandle(primitiveCarrierForSize(layout.byteSize())))
263             : layout.varHandle(carrier);
264     }
265 
266     public static VaList newVaListOfAddress(MemoryAddress ma) {
267         String name = CSupport.getSystemLinker().name();
268         return switch(name) {
269             case Win64.NAME -> Windowsx64Linker.newVaListOfAddress(ma);
270             case SysV.NAME -> SysVx64Linker.newVaListOfAddress(ma);
271             case AArch64.NAME -> throw new UnsupportedOperationException("Not yet implemented for this platform");
272             default -> throw new IllegalStateException("Unknown linker name: " + name);
273         };
274     }
275 






































276     public static class SimpleVaArg {
277         public final Class<?> carrier;
278         public final MemoryLayout layout;
279         public final Object value;
280 
281         public SimpleVaArg(Class<?> carrier, MemoryLayout layout, Object value) {
282             this.carrier = carrier;
283             this.layout = layout;
284             this.value = value;
285         }
286 
287         public VarHandle varHandle() {
288             return carrier == MemoryAddress.class
289                 ? MemoryHandles.asAddressVarHandle(layout.varHandle(primitiveCarrierForSize(layout.byteSize())))
290                 : layout.varHandle(carrier);
291         }
292     }































































293 }

 20  *
 21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 22  * or visit www.oracle.com if you need additional information or have any
 23  * questions.
 24  */
 25 package jdk.internal.foreign.abi;
 26 
 27 import jdk.incubator.foreign.CSupport;
 28 import jdk.incubator.foreign.ForeignLinker;
 29 import jdk.incubator.foreign.FunctionDescriptor;
 30 import jdk.incubator.foreign.GroupLayout;
 31 import jdk.incubator.foreign.MemoryAddress;
 32 import jdk.incubator.foreign.MemoryHandles;
 33 import jdk.incubator.foreign.MemoryLayout;
 34 import jdk.incubator.foreign.MemorySegment;
 35 import jdk.incubator.foreign.SequenceLayout;
 36 import jdk.incubator.foreign.ValueLayout;
 37 import jdk.internal.foreign.MemoryAddressImpl;
 38 import jdk.internal.foreign.Utils;
 39 import jdk.internal.foreign.abi.aarch64.AArch64Linker;
 40 import jdk.internal.foreign.abi.x64.sysv.SysVVaList;
 41 import jdk.internal.foreign.abi.x64.sysv.SysVx64Linker;
 42 import jdk.internal.foreign.abi.x64.windows.Windowsx64Linker;
 43 
 44 import java.lang.invoke.MethodHandle;
 45 import java.lang.invoke.MethodHandles;
 46 import java.lang.invoke.MethodType;
 47 import java.lang.invoke.VarHandle;
 48 import java.util.List;
 49 import java.util.function.Consumer;
 50 import java.util.stream.IntStream;
 51 
 52 import static java.lang.invoke.MethodHandles.collectArguments;
 53 import static java.lang.invoke.MethodHandles.identity;
 54 import static java.lang.invoke.MethodHandles.insertArguments;
 55 import static java.lang.invoke.MethodHandles.permuteArguments;
 56 import static java.lang.invoke.MethodType.methodType;
 57 import static jdk.incubator.foreign.CSupport.*;
 58 
 59 public class SharedUtils {
 60 

257             default -> throw new IllegalStateException("Unknown linker name: " + name);
258         };
259     }
260 
261     public static VarHandle vhPrimitiveOrAddress(Class<?> carrier, MemoryLayout layout) {
262         return carrier == MemoryAddress.class
263             ? MemoryHandles.asAddressVarHandle(layout.varHandle(primitiveCarrierForSize(layout.byteSize())))
264             : layout.varHandle(carrier);
265     }
266 
267     public static VaList newVaListOfAddress(MemoryAddress ma) {
268         String name = CSupport.getSystemLinker().name();
269         return switch(name) {
270             case Win64.NAME -> Windowsx64Linker.newVaListOfAddress(ma);
271             case SysV.NAME -> SysVx64Linker.newVaListOfAddress(ma);
272             case AArch64.NAME -> throw new UnsupportedOperationException("Not yet implemented for this platform");
273             default -> throw new IllegalStateException("Unknown linker name: " + name);
274         };
275     }
276 
277     public static VaList emptyVaList() {
278         String name = CSupport.getSystemLinker().name();
279         return switch(name) {
280             case Win64.NAME -> Windowsx64Linker.emptyVaList();
281             case SysV.NAME -> SysVx64Linker.emptyVaList();
282             case AArch64.NAME -> throw new UnsupportedOperationException("Not yet implemented for this platform");
283             default -> throw new IllegalStateException("Unknown linker name: " + name);
284         };
285     }
286 
287     public static MethodType convertVaListCarriers(MethodType mt, Class<?> carrier) {
288         Class<?>[] params = new Class<?>[mt.parameterCount()];
289         for (int i = 0; i < params.length; i++) {
290             Class<?> pType = mt.parameterType(i);
291             params[i] = ((pType == VaList.class) ? carrier : pType);
292         }
293         return methodType(mt.returnType(), params);
294     }
295 
296     public static MethodHandle unboxVaLists(MethodType type, MethodHandle handle, MethodHandle unboxer) {
297         for (int i = 0; i < type.parameterCount(); i++) {
298             if (type.parameterType(i) == VaList.class) {
299                handle = MethodHandles.filterArguments(handle, i, unboxer);
300             }
301         }
302         return handle;
303     }
304 
305     public static MethodHandle boxVaLists(MethodHandle handle, MethodHandle boxer) {
306         MethodType type = handle.type();
307         for (int i = 0; i < type.parameterCount(); i++) {
308             if (type.parameterType(i) == VaList.class) {
309                handle = MethodHandles.filterArguments(handle, i, boxer);
310             }
311         }
312         return handle;
313     }
314 
315     public static class SimpleVaArg {
316         public final Class<?> carrier;
317         public final MemoryLayout layout;
318         public final Object value;
319 
320         public SimpleVaArg(Class<?> carrier, MemoryLayout layout, Object value) {
321             this.carrier = carrier;
322             this.layout = layout;
323             this.value = value;
324         }
325 
326         public VarHandle varHandle() {
327             return carrier == MemoryAddress.class
328                 ? MemoryHandles.asAddressVarHandle(layout.varHandle(primitiveCarrierForSize(layout.byteSize())))
329                 : layout.varHandle(carrier);
330         }
331     }
332 
333     public static class EmptyVaList implements CSupport.VaList {
334 
335         private final MemoryAddress address;
336 
337         public EmptyVaList(MemoryAddress address) {
338             this.address = address;
339         }
340 
341         private static UnsupportedOperationException uoe() {
342             return new UnsupportedOperationException("Empty VaList");
343         }
344 
345         @Override
346         public int vargAsInt(MemoryLayout layout) {
347             throw uoe();
348         }
349 
350         @Override
351         public long vargAsLong(MemoryLayout layout) {
352             throw uoe();
353         }
354 
355         @Override
356         public double vargAsDouble(MemoryLayout layout) {
357             throw uoe();
358         }
359 
360         @Override
361         public MemoryAddress vargAsAddress(MemoryLayout layout) {
362             throw uoe();
363         }
364 
365         @Override
366         public MemorySegment vargAsSegment(MemoryLayout layout) {
367             throw uoe();
368         }
369 
370         @Override
371         public void skip(MemoryLayout... layouts) {
372             throw uoe();
373         }
374 
375         @Override
376         public boolean isAlive() {
377             return true;
378         }
379 
380         @Override
381         public void close() {
382             throw uoe();
383         }
384 
385         @Override
386         public VaList copy() {
387             return this;
388         }
389 
390         @Override
391         public MemoryAddress address() {
392             return address;
393         }
394     }
395 }
< prev index next >