Skip to content

Commit 3b1e48d

Browse files
committed
Fix method callable
1 parent 0e92e0a commit 3b1e48d

File tree

7 files changed

+19
-19
lines changed

7 files changed

+19
-19
lines changed

kt/godot-library/godot-core-library/src/main/kotlin/godot/core/Variant.kt

+3-2
Original file line numberDiff line numberDiff line change
@@ -285,14 +285,14 @@ enum class VariantParser(override val id: Int) : VariantConverter {
285285
}
286286
},
287287
AABB(16) {
288-
override fun toUnsafeKotlin(buffer: ByteBuffer): godot.core.AABB {
288+
override fun toUnsafeKotlin(buffer: ByteBuffer): AABB {
289289
val position = buffer.vector3
290290
val size = buffer.vector3
291291
return AABB(position, size)
292292
}
293293

294294
override fun toUnsafeGodot(buffer: ByteBuffer, any: Any?) {
295-
require(any is godot.core.AABB)
295+
require(any is AABB)
296296
buffer.vector3 = any._position
297297
buffer.vector3 = any._size
298298
}
@@ -377,6 +377,7 @@ enum class VariantParser(override val id: Int) : VariantConverter {
377377
buffer.putLong(any.ptr)
378378
} else {
379379
require(any is LambdaCallable<*> || any is MethodCallable)
380+
// Be careful that ::toNativeCallable doesn't itself use the shared buffer.
380381
val ptr = any.toNativeCallable().ptr
381382
buffer.putLong(ptr)
382383
}

kt/godot-library/godot-core-library/src/main/kotlin/godot/core/callback/Callable.kt

+5-2
Original file line numberDiff line numberDiff line change
@@ -129,13 +129,16 @@ interface Callable : CoreType {
129129

130130
@JvmStatic
131131
@JvmName("create")
132-
operator fun invoke(target: Object, methodName: StringName) = VariantCallable(target, methodName)
132+
operator fun invoke(target: Object, methodName: StringName) = MethodCallable(target, methodName)
133133
}
134134

135135
@Suppress("FunctionName")
136136
object Bridge {
137137
external fun engine_call_constructor(): VoidPtr
138-
external fun engine_call_constructor_object_string_name(): VoidPtr
138+
external fun engine_call_constructor_object_string_name(
139+
objectPtr: VoidPtr,
140+
methodNamePtr: VoidPtr
141+
): VoidPtr
139142
external fun engine_call_constructor_lambda_callable(
140143
callable: LambdaContainer<*>,
141144
variantTypeOrdinal: Int,

kt/godot-library/godot-core-library/src/main/kotlin/godot/core/callback/MethodCallable.kt

+4-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
package godot.core
44

55
import godot.api.Object
6+
import godot.core.Callable.Bridge
67
import godot.internal.memory.MemoryManager
78

89
class MethodCallable internal constructor(
@@ -30,7 +31,9 @@ class MethodCallable internal constructor(
3031
}
3132

3233
override fun toNativeCallable(): VariantCallable {
33-
val unbound = VariantCallable(target, methodName)
34+
// We pass all params using jni as we're often in a context of sending parameters to cpp, so we should not rewind buffer.
35+
val ptr = Bridge.engine_call_constructor_object_string_name(target.ptr, methodName.ptr)
36+
val unbound = VariantCallable(ptr)
3437
if (boundArgs.isNotEmpty()) {
3538
return unbound.bindUnsafe(*boundArgs)
3639
}

kt/godot-library/godot-core-library/src/main/kotlin/godot/core/callback/VariantCallable.kt

-6
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,6 @@ class VariantCallable : NativeCoreType, Callable {
1717
MemoryManager.registerNativeCoreType(this, VariantParser.CALLABLE)
1818
}
1919

20-
internal constructor(target: Object, methodName: StringName) {
21-
TransferContext.writeArguments(VariantParser.OBJECT to target, VariantParser.STRING_NAME to methodName)
22-
ptr = Bridge.engine_call_constructor_object_string_name()
23-
MemoryManager.registerNativeCoreType(this, VariantParser.CALLABLE)
24-
}
25-
2620
internal constructor(callable: VariantCallable) {
2721
TransferContext.writeArguments(VariantParser.CALLABLE to callable)
2822
ptr = Bridge.engine_call_copy_constructor()

kt/plugins/godot-gradle-plugin/src/main/resources/godot/gradle/godot-kotlin-graal-jni-config.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@
164164
"methods" : [
165165
{ "name" : "engine_call_constructor", "parameterTypes" : [] },
166166

167-
{ "name" : "engine_call_constructor_object_string_name", "parameterTypes" : [] },
167+
{ "name" : "engine_call_constructor_object_string_name", "parameterTypes" : ["long", "long"] },
168168
{ "name" : "engine_call_constructor_lambda_callable", "parameterTypes" : ["godot.core.LambdaContainer", "int", "int"] },
169169
{ "name" : "engine_call_constructor_cancellable", "parameterTypes" : ["godot.core.LambdaContainer", "int", "int"] },
170170
{ "name" : "engine_call_copy_constructor", "parameterTypes" : [] },

src/jvm_wrapper/bridge/callable_bridge.cpp

+4-5
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,10 @@ uintptr_t CallableBridge::engine_call_constructor(JNIEnv* p_raw_env, jobject p_i
1313
return reinterpret_cast<uintptr_t>(VariantAllocator::alloc(Callable()));
1414
}
1515

16-
uintptr_t CallableBridge::engine_call_constructor_object_string_name(JNIEnv* p_raw_env, jobject p_instance) {
17-
jni::Env env {p_raw_env};
18-
Variant args[2] = {};
19-
TransferContext::get_instance().read_args(env, args);
20-
return reinterpret_cast<uintptr_t>(VariantAllocator::alloc(Callable(args[0].operator Object*(), args[1].operator StringName())));
16+
uintptr_t CallableBridge::engine_call_constructor_object_string_name(JNIEnv * p_raw_env, jobject p_instance, jlong object_ptr, jlong method_name_ptr) {
17+
Object* obj = reinterpret_cast<Object*>(object_ptr);
18+
StringName* name = reinterpret_cast<StringName*>(method_name_ptr);
19+
return reinterpret_cast<uintptr_t>(VariantAllocator::alloc(Callable(obj, *name)));
2120
}
2221

2322
uintptr_t CallableBridge::engine_call_constructor_lambda_callable(JNIEnv* p_raw_env, jobject, jobject p_lambda_container, jint p_variant_type_ordinal, jint p_hash_code) {

src/jvm_wrapper/bridge/callable_bridge.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ namespace bridges {
1010
// clang-format off
1111
INIT_JNI_BINDINGS(
1212
INIT_NATIVE_METHOD("engine_call_constructor", "()J", CallableBridge::engine_call_constructor)
13-
INIT_NATIVE_METHOD("engine_call_constructor_object_string_name", "()J", CallableBridge::engine_call_constructor_object_string_name)
13+
INIT_NATIVE_METHOD("engine_call_constructor_object_string_name", "(JJ)J", CallableBridge::engine_call_constructor_object_string_name)
1414
INIT_NATIVE_METHOD("engine_call_constructor_lambda_callable", "(Lgodot/core/LambdaContainer;II)J", CallableBridge::engine_call_constructor_lambda_callable)
1515
INIT_NATIVE_METHOD("engine_call_constructor_cancellable", "(Lgodot/core/LambdaContainer;II)V", CallableBridge::engine_call_constructor_cancellable)
1616
INIT_NATIVE_METHOD("engine_call_copy_constructor", "()J", CallableBridge::engine_call_copy_constructor)
@@ -35,7 +35,7 @@ namespace bridges {
3535

3636
public:
3737
static uintptr_t engine_call_constructor(JNIEnv * p_raw_env, jobject p_instance);
38-
static uintptr_t engine_call_constructor_object_string_name(JNIEnv * p_raw_env, jobject p_instance);
38+
static uintptr_t engine_call_constructor_object_string_name(JNIEnv * p_raw_env, jobject p_instance, jlong object_ptr, jlong method_name_ptr);
3939
static uintptr_t engine_call_constructor_lambda_callable(
4040
JNIEnv * p_raw_env,
4141
jobject p_instance,

0 commit comments

Comments
 (0)