Skip to content

Commit

Permalink
up
Browse files Browse the repository at this point in the history
  • Loading branch information
joshlong committed Mar 19, 2024
1 parent 46df197 commit 888b456
Show file tree
Hide file tree
Showing 2 changed files with 68 additions and 11 deletions.
8 changes: 8 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -57,13 +57,21 @@
<buildArg> --enable-native-access=ALL-UNNAMED </buildArg>
<buildArg>-H:+ForeignAPISupport</buildArg>
<buildArg>-H:+UnlockExperimentalVMOptions</buildArg>
<buildArg>--enable-preview</buildArg>
</buildArgs>
</configuration>

</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<jvmArguments>
<compilerArgs>
<arg>--enable-preview</arg>
</compilerArgs>
</jvmArguments>
</configuration>
</plugin>
</plugins>
</build>
Expand Down
71 changes: 60 additions & 11 deletions src/main/java/com/example/demo/DemoApplication.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,22 @@
import java.lang.foreign.FunctionDescriptor;
import java.lang.foreign.Linker;
import java.lang.foreign.SymbolLookup;
import java.util.Locale;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.function.BiFunction;
import java.util.function.Supplier;
import java.util.stream.Gatherer;
import java.util.stream.Stream;

import static java.lang.foreign.ValueLayout.ADDRESS;
import static java.lang.foreign.ValueLayout.JAVA_INT;

@SpringBootApplication
public class DemoApplication {

public static void main(String[] args) throws Throwable {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}

Expand Down Expand Up @@ -49,46 +55,89 @@ interface LanguageDemonstrationRunner {
void run() throws Throwable;
}

@Component
class Gatherers implements LanguageDemonstrationRunner {

// viktor klang! the legend of klang continues!
//https://docs.oracle.com/en/java/javase/22/docs/api/java.base/java/util/stream/Gatherer.html
private static <T, R> Gatherer<T, ?, R> scan(
Supplier<R> initial,
BiFunction<? super R, ? super T, ? extends R> scanner) {

class State {
R current = initial.get();
}

return Gatherer.<T, State, R>ofSequential(
State::new,
Gatherer.Integrator.ofGreedy((state, element, downstream) -> {
state.current = scanner.apply(state.current, element);
return downstream.push(state.current);
})
);
}

@Override
public void run() {

var listOfNumberStrings = Stream
.of(1, 2, 3, 4, 5, 6, 7, 8, 9)
.gather(scan(() -> "", (string, number) -> string + number)
.andThen(java.util.stream.Gatherers.mapConcurrent(10,
s -> s.toUpperCase(Locale.ROOT)))
)
.toList();

System.out.println( listOfNumberStrings);

}
}

@Component
class StringTemplates implements LanguageDemonstrationRunner {

@Override
public void run() throws Throwable {
var name = "josh";
System.out.println(STR."name: \{name.toUpperCase()}");
}
}

@Component
class JExtractFfi implements LanguageDemonstrationRunner {

@Override
public void run() throws Throwable {


}

}

@Component
class ManualFfi implements LanguageDemonstrationRunner {

public static final FunctionDescriptor PRINTF_FUNCTION_DESCRIPTOR =
static final FunctionDescriptor PRINTF_FUNCTION_DESCRIPTOR =
FunctionDescriptor.of(JAVA_INT, ADDRESS);


private final SymbolLookup symbolLookup;

ManualFfi(SymbolLookup symbolLookup) {
this.symbolLookup = symbolLookup;
}

private void manualFfi(String greetings) throws Throwable {
@Override
public void run() throws Throwable {
var symbolName = "printf";
var nativeLinker = Linker.nativeLinker();

var methodHandle = this.symbolLookup
.find(symbolName)
.map(symbolSegment -> nativeLinker
.downcallHandle(symbolSegment, PRINTF_FUNCTION_DESCRIPTOR))
.orElse(null);
try (var arena = Arena.ofConfined()) {
var cString = arena.allocateFrom(greetings);
var cString = arena.allocateFrom("hello, manual FFI!");
Objects.requireNonNull(methodHandle).invoke(cString);
}
}

@Override
public void run() throws Throwable {
manualFfi("hello, manual FFI!");
}
}

0 comments on commit 888b456

Please sign in to comment.