Skip to content

Commit 9cedb49

Browse files
refactor(language): use a Cleaner for cleanup
1 parent cb8652c commit 9cedb49

File tree

4 files changed

+21
-13
lines changed

4 files changed

+21
-13
lines changed

scripts/jextract.ps1

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,3 @@ $env:package = 'io.github.treesitter.jtreesitter.internal'
181181
-I "$($args[0])/core/lib/include" `
182182
-DTREE_SITTER_HIDE_SYMBOLS `
183183
"$($args[0])/core/lib/include/tree_sitter/api.h"
184-
185-
$env:package = $env:package -replace '\.', '/'
186-
$env:file = "$($args[1])/generated-sources/jextract/$env:package/TreeSitter.java"
187-
(Get-Content -path "$env:file").Replace('static final Arena', 'public $0') | Set-Content "$env:file"

scripts/jextract.sh

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
package=io.github.treesitter.jtreesitter.internal
44

5-
jextract \
5+
exec jextract \
66
--include-struct TSInput \
77
--include-struct TSInputEdit \
88
--include-struct TSLogger \
@@ -182,6 +182,3 @@ jextract \
182182
-I "$1"/core/lib/include \
183183
-DTREE_SITTER_HIDE_SYMBOLS \
184184
"$1"/core/lib/include/tree_sitter/api.h
185-
186-
sed -i'' 's/static final Arena/public &/' \
187-
"$2/generated-sources/jextract/${package//.//}/TreeSitter.java"

src/main/java/io/github/treesitter/jtreesitter/Language.java

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
import static io.github.treesitter.jtreesitter.internal.TreeSitter.*;
44

5-
import io.github.treesitter.jtreesitter.internal.TreeSitter;
65
import java.lang.foreign.*;
6+
import java.lang.ref.Cleaner;
77
import org.jspecify.annotations.NullMarked;
88
import org.jspecify.annotations.Nullable;
99

@@ -28,6 +28,8 @@ public final class Language {
2828

2929
private static final Linker LINKER = Linker.nativeLinker();
3030

31+
private static final Cleaner CLEANER = Cleaner.create();
32+
3133
private final MemorySegment self;
3234

3335
private final @Unsigned int version;
@@ -40,8 +42,9 @@ public final class Language {
4042
* @throws IllegalArgumentException If the language version is incompatible.
4143
*/
4244
public Language(MemorySegment self) throws IllegalArgumentException {
43-
this.self = self.reinterpret(LIBRARY_ARENA, TreeSitter::ts_language_delete);
45+
this.self = self.asReadOnly();
4446
version = ts_language_version(this.self);
47+
CLEANER.register(self, new Cleanup(this.self));
4548
if (version < MIN_COMPATIBLE_LANGUAGE_VERSION || version > LANGUAGE_VERSION) {
4649
throw new IllegalArgumentException(String.format(
4750
"Incompatible language version %d. Must be between %d and %d.",
@@ -196,4 +199,17 @@ public int hashCode() {
196199
public String toString() {
197200
return "Language{id=0x%x, version=%d}".formatted(self.address(), version);
198201
}
202+
203+
private static final class Cleanup implements Runnable {
204+
MemorySegment segment;
205+
206+
private Cleanup(MemorySegment segment) {
207+
this.segment = segment;
208+
}
209+
210+
@Override
211+
public void run() {
212+
ts_language_delete(segment);
213+
}
214+
}
199215
}

src/test/java/io/github/treesitter/jtreesitter/languages/TreeSitterJava.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package io.github.treesitter.jtreesitter.languages;
22

33
import java.lang.foreign.*;
4-
import java.lang.invoke.MethodHandle;
54

65
public final class TreeSitterJava {
76
private static final ValueLayout VOID_PTR =
@@ -39,8 +38,8 @@ private static UnsatisfiedLinkError unresolved(String name) {
3938
private MemorySegment call(String name) throws UnsatisfiedLinkError {
4039
var address = symbols.find(name).orElseThrow(() -> unresolved(name));
4140
try {
42-
final MethodHandle function = LINKER.downcallHandle(address, FUNC_DESC);
43-
return ((MemorySegment) function.invokeExact()).asReadOnly();
41+
var function = LINKER.downcallHandle(address, FUNC_DESC);
42+
return (MemorySegment) function.invokeExact();
4443
} catch (Throwable e) {
4544
throw new RuntimeException("Call to %s failed".formatted(name), e);
4645
}

0 commit comments

Comments
 (0)