diff --git a/scripts/TreeSitter_java.patch b/scripts/TreeSitter_java.patch index c1a4350..5694788 100644 --- a/scripts/TreeSitter_java.patch +++ b/scripts/TreeSitter_java.patch @@ -20,3 +20,12 @@ public static final ValueLayout.OfBoolean C_BOOL = ValueLayout.JAVA_BOOLEAN; public static final ValueLayout.OfByte C_CHAR = ValueLayout.JAVA_BYTE; +@@ -8599,4 +8606,8 @@ public class TreeSitter { + throw new AssertionError("should not reach here", ex$); + } + } ++ ++ static { ++ ts_set_allocator(malloc$address(), calloc$address(), realloc$address(), free$address()); ++ } + } diff --git a/scripts/jextract.ps1 b/scripts/jextract.ps1 index 8b4dcde..2cdb01c 100755 --- a/scripts/jextract.ps1 +++ b/scripts/jextract.ps1 @@ -15,6 +15,10 @@ $lib = "$($args[0])/core/lib" --include-struct TSRange ` --include-struct TSTreeCursor ` --include-function free ` + --include-function malloc ` + --include-function calloc ` + --include-function realloc ` + --include-function ts_set_allocator ` --include-function ts_language_copy ` --include-function ts_language_delete ` --include-function ts_language_field_count ` diff --git a/scripts/jextract.sh b/scripts/jextract.sh index b8870bd..a31a2a6 100755 --- a/scripts/jextract.sh +++ b/scripts/jextract.sh @@ -17,6 +17,10 @@ exec jextract \ --include-struct TSRange \ --include-struct TSTreeCursor \ --include-function free \ + --include-function malloc \ + --include-function calloc \ + --include-function realloc \ + --include-function ts_set_allocator \ --include-function ts_language_copy \ --include-function ts_language_delete \ --include-function ts_language_field_count \ diff --git a/src/main/java/io/github/treesitter/jtreesitter/Node.java b/src/main/java/io/github/treesitter/jtreesitter/Node.java index 7a89ba6..c5348bf 100644 --- a/src/main/java/io/github/treesitter/jtreesitter/Node.java +++ b/src/main/java/io/github/treesitter/jtreesitter/Node.java @@ -23,9 +23,6 @@ public final class Node { private final Arena arena = Arena.ofAuto(); private boolean wasEdited = false; - // FIXME: figure out why free() crashes on Windows - private static final boolean IS_UNIX = !System.getProperty("os.name").startsWith("Windows"); - Node(MemorySegment self, Tree tree) { this.self = self; this.tree = tree; @@ -446,7 +443,7 @@ public TreeCursor walk() { public String toSexp() { var string = ts_node_string(self); var result = string.getString(0); - if (IS_UNIX) free(string); + free(string); return result; } diff --git a/src/main/java/io/github/treesitter/jtreesitter/Tree.java b/src/main/java/io/github/treesitter/jtreesitter/Tree.java index 7f948f0..7040726 100644 --- a/src/main/java/io/github/treesitter/jtreesitter/Tree.java +++ b/src/main/java/io/github/treesitter/jtreesitter/Tree.java @@ -22,9 +22,6 @@ public final class Tree implements AutoCloseable, Cloneable { private final Language language; private @Nullable List includedRanges; - // FIXME: figure out why free() crashes on Windows - private static final boolean IS_UNIX = !System.getProperty("os.name").startsWith("Windows"); - Tree(MemorySegment self, Language language, @Nullable String source, @Nullable Charset charset) { arena = Arena.ofShared(); this.self = self.reinterpret(arena, TreeSitter::ts_tree_delete); @@ -95,7 +92,7 @@ public List getIncludedRanges() { var range = TSRange.asSlice(ranges, i); includedRanges.add(Range.from(range)); } - if (IS_UNIX) free(ranges); + free(ranges); } } return Collections.unmodifiableList(includedRanges); @@ -122,7 +119,7 @@ public List getChangedRanges(Tree newTree) { var range = TSRange.asSlice(ranges, i); changedRanges.add(Range.from(range)); } - if (IS_UNIX) free(ranges); + free(ranges); return changedRanges; } }