1 # -*- Mode:text; tab-width:4; electric-indent-mode: nil; indent-line-function:insert-tab; -*-
4 # 'invoke' is a simple string template
5 # variables are defined by method.pm
7 # normal function invocation
9 static final MethodHandle {name}$FH = Memory.downcall("{name}", {function-descriptor});
10 public {static}{java-result} {rename}({java-arguments}) {
11 {native-output-define}
12 {native-result-define}
15 {native-result-assign}{name}$FH.invokeExact({native-call});
22 } catch (Throwable t) {
23 throw new RuntimeException(t);
29 invoke-dynamic-init {{
30 {name}$FH = Memory.downcall("{name}", {function-descriptor}, resolve, scope);
34 final MethodHandle {name}$FH;
35 public {java-result} {rename}({java-arguments}) {
36 {native-output-define}
37 {native-result-define}
40 {native-result-assign}{name}$FH.invokeExact({native-call});
47 } catch (Throwable t) {
48 throw new RuntimeException(t);
54 # callback function/types
56 public static FunctionPointer<{rename}> downcall(MemoryAddress addr$, ResourceScope scope$) {
57 NativeSymbol symbol$ = NativeSymbol.ofAddress("{rename}", addr$, scope$);
58 MethodHandle {rename}$FH = Memory.downcall(symbol$, descriptor());
59 return new FunctionPointer<{rename}>(
61 ({java-arguments}) -> {
62 {native-output-define}
63 {native-result-define}
66 {native-result-assign}{rename}$FH.invokeExact({native-call});
73 } catch (Throwable t) {
74 throw new RuntimeException(t);
81 public static FunctionPointer<{rename}> upcall({rename} target$, ResourceScope scope$) {
82 interface Trampoline {
83 {java-result} call({native-arguments});
85 Trampoline trampoline = ({native-arguments}) -> {
87 {trampoline-result-define}target$.call({java-call});
88 {trampoline-result-return}
90 return new FunctionPointer<>(
92 MethodHandles.lookup(),
104 # structs - normal structs
105 # handle - anonymous structs
106 # library - library template
111 import jdk.incubator.foreign.*;
112 import java.lang.invoke.*;
113 import au.notzed.nativez.*;
115 public class {name} {
122 func:template=code:method=invoke-dynamic
123 init:template=code:method=invoke-dynamic-init {{
125 import jdk.incubator.foreign.*;
126 import java.lang.invoke.*;
127 import java.util.function.Function;
128 import au.notzed.nativez.*;
130 public class {name} {
131 {name}(Function<String,MemoryAddress> resolve, ResourceScope scope) {
134 public static {name} create(Function<String,MemoryAddress> resolve, ResourceScope scope) {
135 return new {name}(resolve, scope);
145 public interface {name} {
152 import jdk.incubator.foreign.*;
153 import jdk.incubator.foreign.MemoryLayout.*;
154 import java.lang.invoke.*;
155 import au.notzed.nativez.*;
157 public class {rename} implements Pointer {
159 public final MemorySegment segment;
161 private {rename}(MemorySegment segment) {
162 this.segment = segment;
165 public static {rename} create(MemorySegment segment) {
166 return new {rename}(segment);
169 public static {rename} create(MemoryAddress address, ResourceScope scope) {
170 return MemoryAddress.NULL != address ? create(MemorySegment.ofAddress(address, LAYOUT.byteSize(), scope)) : null;
173 public static {rename} create(SegmentAllocator frame) {
174 return create(frame.allocate(LAYOUT));
178 public final MemoryAddress address() {
179 return segment.address();
183 public final ResourceScope scope() {
184 return segment.scope();
187 public final MemorySegment segment() {
201 import jdk.incubator.foreign.*;
202 import jdk.incubator.foreign.MemoryLayout.*;
203 import java.lang.invoke.*;
204 import au.notzed.nativez.*;
206 public class {rename} implements Pointer, Array<{rename}> {
208 public final MemorySegment segment;
210 private {rename}(MemorySegment segment) {
211 this.segment = segment;
214 public static {rename} create(MemorySegment segment) {
215 return new {rename}(segment);
218 public static {rename} create(MemoryAddress address, ResourceScope scope) {
219 return MemoryAddress.NULL != address ? create(MemorySegment.ofAddress(address, LAYOUT.byteSize(), scope)) : null;
222 public static {rename} create(SegmentAllocator frame) {
223 return create(frame.allocate(LAYOUT));
226 public static {rename} createArray(MemoryAddress address, ResourceScope scope) {
227 return MemoryAddress.NULL != address ? create(MemorySegment.ofAddress(address, Long.MAX_VALUE, scope)) : null;
231 public final MemoryAddress address() {
232 return segment.address();
236 public final ResourceScope scope() {
237 return segment.scope();
240 public final MemorySegment segment() {
245 public long length() {
246 return segment.byteSize() / LAYOUT.byteSize();
250 public {rename} getAtIndex(long index) {
252 return {rename}.create((MemorySegment){name}$SH.invokeExact(segment, index));
253 } catch (Throwable t) {
254 throw new RuntimeException(t);
263 final static MethodHandle {name}$SH = MemoryLayout.sequenceLayout(LAYOUT).sliceHandle(PathElement.sequenceElement());
269 import jdk.incubator.foreign.*;
270 import java.lang.invoke.*;
271 import au.notzed.nativez.*;
273 public class {rename} implements Pointer {
275 MemoryAddress address;
278 private {rename}(MemoryAddress address, ResourceScope scope) {
279 this.address = address;
283 public static {rename} create(MemoryAddress address, ResourceScope scope) {
284 return MemoryAddress.NULL != address ? new {rename}(address, scope) : null;
288 public MemoryAddress address() {
293 public ResourceScope scope() {
304 import jdk.incubator.foreign.*;
305 import java.lang.invoke.*;
306 import au.notzed.nativez.*;
309 public interface {rename} {
310 {java-result} call({java-arguments});
312 public static FunctionDescriptor descriptor() {
313 return {function-descriptor};
322 # do I want this to be perl code as template or just a template?
324 get set=value={getnative} {{
325 public {type} get{rename}() {
329 geti set=value={getnative} set=segment=segment {{
330 public {type} get{rename}AtIndex(long index) {
331 // option a: resolve an offset segment and asme as above with set=segment=segment
332 // option b: an indexed varhandle
333 MemorySegment segment = segment().asSlice(index * LAYOUT.byteSize(), LAYOUT.byteSize());
337 set set=value=value {{
338 public void set{rename}({type} value) {
342 seti set=value=value set=segment=segment {{
343 public void set{rename}AtIndex(long index, {type} value) {
344 MemorySegment segment = segment().asSlice(index * LAYOUT.byteSize(), LAYOUT.byteSize());
352 public {typei} get{rename}Element(long i) {
356 set set=index=i set=value=value {{
357 public void set{rename}Element(long i, {typei} value) {
363 code getsetelement2d {
364 get set=index0=i set=index1=j {{
365 public {typei} get{rename}Element(long i, long j) {
369 set set=index0=i set=index1=j set=value=value {{
370 public void set{rename}Element(long i, long j, {typei} value) {
378 public {type} get{rename}() {
381 } catch (Throwable t) {
382 throw new RuntimeException(t);