Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit c67ad4f

Browse files
committedApr 28, 2025·
feat: refactor jvm_instance.h for gdextension
1 parent f5c5add commit c67ad4f

19 files changed

+581
-354
lines changed
 

‎src/api/resource_format/java_archive.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#ifndef GODOT_JVM_JAVA_ARCHIVE_H
22
#define GODOT_JVM_JAVA_ARCHIVE_H
33

4-
#include <core/io/resource.h>
4+
#include <classes/resource.hpp>
55

66
namespace godot {
77
class JavaArchive : public Resource {
Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,39 @@
11

22
#include "java_archive_resource_format_loader.h"
33

4+
#include <classes/resource_uid.hpp>
5+
#include "engine/utilities.h"
46
#include "godot_jvm.h"
57
#include "hash.h"
68
#include "java_archive.h"
7-
#include "lifecycle/paths.h"
89
#include "logging.h"
10+
#include "paths.h"
911

1012
using namespace godot;
1113

12-
void JavaArchiveFormatLoader::get_recognized_extensions(List<String>* p_extensions) const {
13-
p_extensions->push_back("jar");
14-
p_extensions->push_back("dex");
14+
PackedStringArray JavaArchiveFormatLoader::_get_recognized_extensions() const {
15+
PackedStringArray recognized_extensions;
16+
recognized_extensions.push_back("jar");
17+
recognized_extensions.push_back("dex");
18+
return recognized_extensions;
1519
}
1620

17-
String JavaArchiveFormatLoader::get_resource_type(const String& p_path) const {
21+
String JavaArchiveFormatLoader::_get_resource_type(const String& p_path) const {
1822
String ext = p_path.get_extension().to_lower();
1923
if(ext == "jar" || ext == "dex"){ return "JavaArchive";}
2024
return "";
2125
}
2226

23-
bool JavaArchiveFormatLoader::handles_type(const String& p_type) const {
24-
return p_type == "JavaArchive";
27+
bool JavaArchiveFormatLoader::_handles_type(const StringName& p_type) const {
28+
return p_type == SNAME("JavaArchive");
2529
}
2630

27-
Ref<Resource> JavaArchiveFormatLoader::load(
31+
Variant JavaArchiveFormatLoader::_load(
2832
const String& p_path,
2933
const String& p_original_path,
30-
Error* r_error,
3134
bool p_use_sub_threads,
32-
float* r_progress,
33-
ResourceFormatLoader::CacheMode p_cache_mode
34-
) {
35+
int32_t p_cache_mode
36+
) const {
3537
JVM_LOG_VERBOSE(vformat("Loading Java Archive at: %s", p_path));
3638
Ref<JavaArchive> ref;
3739
ref.instantiate();
@@ -44,16 +46,12 @@ Ref<Resource> JavaArchiveFormatLoader::load(
4446
return ref;
4547
}
4648

47-
ResourceUID::ID JavaArchiveFormatLoader::get_resource_uid(const String& p_path) const {
49+
int64_t JavaArchiveFormatLoader::_get_resource_uid(const String& p_path) const {
4850
String ext = p_path.get_extension().to_lower();
49-
ResourceUID::ID id = ResourceUID::INVALID_ID;
51+
int64_t id = ResourceUID::INVALID_ID;
5052
if(ext == "jar" || ext == "dex"){
51-
id = (p_path + UUID_HASH_SEED).hash64();
53+
id = (int64_t) hash64(p_path + UUID_HASH_SEED);
5254
id &= 0x7FFFFFFFFFFFFFFF;
5355
}
5456
return id;
55-
}
56-
57-
bool JavaArchiveFormatLoader::has_custom_uid_support() const {
58-
return true;
59-
}
57+
}
Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
#ifndef GODOT_JVM_JAVA_ARCHIVE_LOADER_H
22
#define GODOT_JVM_JAVA_ARCHIVE_LOADER_H
33

4-
#include <core/io/resource_loader.h>
4+
#include <classes/resource.hpp>
5+
#include <classes/resource_format_loader.hpp>
6+
#include <templates/list.hpp>
7+
#include <variant/string.hpp>
8+
59
namespace godot {
610
class JavaArchiveFormatLoader : public ResourceFormatLoader {
711
public:
@@ -10,12 +14,11 @@ namespace godot {
1014
JavaArchiveFormatLoader(const JavaArchiveFormatLoader&) = delete;
1115
void operator=(const JavaArchiveFormatLoader&) = delete;
1216

13-
void get_recognized_extensions(List<String>* p_extensions) const override;
14-
String get_resource_type(const String& p_path) const override;
15-
bool handles_type(const String& p_type) const override;
16-
Ref<Resource> load(const String& p_path, const String& p_original_path, Error* r_error, bool p_use_sub_threads, float* r_progress, CacheMode p_cache_mode) override;
17-
bool has_custom_uid_support() const override;
18-
ResourceUID::ID get_resource_uid(const String& p_path) const override;
17+
PackedStringArray _get_recognized_extensions() const override;
18+
String _get_resource_type(const String& p_path) const override;
19+
bool _handles_type(const StringName& p_type) const override;
20+
Variant _load(const String& p_path, const String& p_original_path, bool p_use_sub_threads, int32_t p_cache_mode) const override;
21+
int64_t _get_resource_uid(const String& p_path) const override;
1922
};
2023
}
2124
#endif// GODOT_JVM_JAVA_ARCHIVE_LOADER_H
Lines changed: 31 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,29 @@
11
#include "jvm_resource_format_loader.h"
22

3-
#include "hash.h"
43
#include "api/language/names.h"
54
#include "api/script/jvm_script.h"
65
#include "api/script/jvm_script_manager.h"
76
#include "api/script/language/gdj_script.h"
87
#include "api/script/language/java_script.h"
98
#include "api/script/language/kotlin_script.h"
109
#include "api/script/language/scala_script.h"
10+
#include <classes/file_access.hpp>
11+
#include <classes/resource_uid.hpp>
12+
#include "engine/utilities.h"
13+
#include "hash.h"
1114

1215
using namespace godot;
1316

14-
void JvmResourceFormatLoader::get_recognized_extensions(List<String>* p_extensions) const {
15-
p_extensions->push_back(GODOT_JVM_REGISTRATION_FILE_EXTENSION);
16-
p_extensions->push_back(GODOT_KOTLIN_SCRIPT_EXTENSION);
17-
p_extensions->push_back(GODOT_JAVA_SCRIPT_EXTENSION);
18-
p_extensions->push_back(GODOT_SCALA_SCRIPT_EXTENSION);
17+
PackedStringArray JvmResourceFormatLoader::_get_recognized_extensions() const {
18+
PackedStringArray extensions;
19+
extensions.push_back(GODOT_JVM_REGISTRATION_FILE_EXTENSION);
20+
extensions.push_back(GODOT_KOTLIN_SCRIPT_EXTENSION);
21+
extensions.push_back(GODOT_JAVA_SCRIPT_EXTENSION);
22+
extensions.push_back(GODOT_SCALA_SCRIPT_EXTENSION);
23+
return extensions;
1924
}
2025

21-
String JvmResourceFormatLoader::get_resource_type(const String& p_path) const {
26+
String JvmResourceFormatLoader::_get_resource_type(const String& p_path) const {
2227
String ext = p_path.get_extension().to_lower();
2328

2429
if (ext == GODOT_JVM_REGISTRATION_FILE_EXTENSION) {
@@ -33,22 +38,22 @@ String JvmResourceFormatLoader::get_resource_type(const String& p_path) const {
3338
return "";
3439
}
3540

36-
bool JvmResourceFormatLoader::handles_type(const String& p_type) const {
37-
return p_type == "Script"
38-
|| p_type == GODOT_JVM_SCRIPT_NAME
39-
|| p_type == GODOT_KOTLIN_SCRIPT_NAME
40-
|| p_type == GODOT_JAVA_SCRIPT_NAME
41-
|| p_type == GODOT_SCALA_SCRIPT_NAME;
41+
bool JvmResourceFormatLoader::_handles_type(const StringName& p_type) const {
42+
return p_type == SNAME("Script")
43+
|| p_type == SNAME(GODOT_JVM_SCRIPT_NAME)
44+
|| p_type == SNAME(GODOT_KOTLIN_SCRIPT_NAME)
45+
|| p_type == SNAME(GODOT_JAVA_SCRIPT_NAME)
46+
|| p_type == SNAME(GODOT_SCALA_SCRIPT_NAME);
4247
}
4348

4449
Error JvmResourceFormatLoader::read_all_file_utf8(const String& p_path, String& r_content) {
4550
Vector<uint8_t> source_file;
46-
Error err;
47-
Ref<FileAccess> file_access {FileAccess::open(p_path, FileAccess::READ, &err)};
51+
Ref<FileAccess> file_access {FileAccess::open(p_path, FileAccess::READ)};
52+
Error err = FileAccess::get_open_error();
4853
JVM_ERR_FAIL_COND_V_MSG(err != OK, err, "Cannot open file '" + p_path + "'.");
4954

5055
uint64_t len = file_access->get_length();
51-
source_file.resize(len + 1);
56+
source_file.resize((int64_t) len + 1);
5257
uint8_t* w = source_file.ptrw();
5358
uint64_t r = file_access->get_buffer(w, len);
5459
ERR_FAIL_COND_V(r != len, ERR_CANT_OPEN);
@@ -61,7 +66,7 @@ Error JvmResourceFormatLoader::read_all_file_utf8(const String& p_path, String&
6166
return OK;
6267
}
6368

64-
Ref<Resource> JvmResourceFormatLoader::load(const String& p_path, const String& p_original_path, Error* r_error, bool p_use_sub_threads, float* r_progress, CacheMode p_cache_mode) {
69+
Variant JvmResourceFormatLoader::_load(const String& p_path, const String& p_original_path, bool p_use_sub_threads, int32_t p_cache_mode) {
6570
Ref<JvmScript> jvm_script;
6671

6772
String extension = p_path.get_extension();
@@ -79,40 +84,30 @@ Ref<Resource> JvmResourceFormatLoader::load(const String& p_path, const String&
7984
} else if (extension == GODOT_SCALA_SCRIPT_EXTENSION) {
8085
jvm_script = JvmScriptManager::get_instance()->get_or_create_source_script<ScalaScript>(p_path, &script_is_new, r_error);
8186
} else {
82-
if (r_error) { *r_error = Error::ERR_FILE_UNRECOGNIZED; }
8387
return nullptr;
8488
}
8589

86-
if (jvm_script.is_valid()) {
8790
#ifdef TOOLS_ENABLED
88-
if (!script_is_new && is_source) {
89-
MessageQueue::get_singleton()->push_callable(
90-
callable_mp(JvmScriptManager::get_instance(), &JvmScriptManager::invalidate_source).bind(Ref<SourceScript>(jvm_script))
91-
);
92-
}
93-
#endif
94-
} else {
95-
if (r_error) { *r_error = Error::ERR_UNAVAILABLE; }
91+
if (jvm_script.is_valid() && !script_is_new && is_source) {
92+
callable_mp(JvmScriptManager::get_instance(), &JvmScriptManager::invalidate_source).bind(Ref<SourceScript>(jvm_script))
93+
.call_deferred();
9694
}
95+
#endif
9796

9897
return jvm_script;
9998
}
10099

101-
ResourceUID::ID JvmResourceFormatLoader::get_resource_uid(const String& p_path) const {
100+
int64_t JvmResourceFormatLoader::_get_resource_uid(const String& p_path) const {
102101
String extension = p_path.get_extension();
103-
ResourceUID::ID id = ResourceUID::INVALID_ID;
102+
int64_t id = ResourceUID::INVALID_ID;
104103
if (extension == GODOT_JVM_REGISTRATION_FILE_EXTENSION) {
105-
id = (JvmScript::get_script_file_name(p_path) + UUID_HASH_SEED).hash64();
104+
id = (int64_t) hash64(JvmScript::get_script_file_name(p_path) + UUID_HASH_SEED);
106105
id &= 0x7FFFFFFFFFFFFFFF;
107106
} else if (extension == GODOT_KOTLIN_SCRIPT_EXTENSION || extension == GODOT_JAVA_SCRIPT_EXTENSION || extension == GODOT_SCALA_SCRIPT_EXTENSION) {
108107
String source;
109108
Error error;
110-
id = (String(SourceScript::parse_source_to_fqdn(p_path, source, &error)) + UUID_HASH_SEED).hash64();
109+
id = (int64_t) hash64(String(SourceScript::parse_source_to_fqdn(p_path, source, &error)) + UUID_HASH_SEED);
111110
id &= 0x7FFFFFFFFFFFFFFF;
112111
}
113112
return id;
114-
}
115-
116-
bool JvmResourceFormatLoader::has_custom_uid_support() const {
117-
return true;
118-
}
113+
}

‎src/api/resource_format/jvm_resource_format_loader.h

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
#ifndef GODOT_JVM_KT_RESOURCE_LOADER_H
22
#define GODOT_JVM_KT_RESOURCE_LOADER_H
33

4-
#include <core/io/resource_loader.h>
4+
#include <classes/resource_format_loader.hpp>
5+
56
namespace godot {
67
class JvmResourceFormatLoader : public ResourceFormatLoader {
78
public:
@@ -10,12 +11,11 @@ namespace godot {
1011
JvmResourceFormatLoader(const JvmResourceFormatLoader&) = delete;
1112
void operator=(const JvmResourceFormatLoader&) = delete;
1213

13-
void get_recognized_extensions(List<String>* p_extensions) const override;
14-
String get_resource_type(const String& p_path) const override;
15-
bool handles_type(const String& p_type) const override;
16-
Ref<Resource> load(const String& p_path, const String& p_original_path, Error* r_error, bool p_use_sub_threads, float* r_progress, CacheMode p_cache_mode) override;
17-
bool has_custom_uid_support() const override;
18-
ResourceUID::ID get_resource_uid(const String& p_path) const override;
14+
PackedStringArray _get_recognized_extensions() const override;
15+
String _get_resource_type(const String& p_path) const override;
16+
bool _handles_type(const StringName& p_type) const override;
17+
Variant _load(const String& p_path, const String& p_original_path, bool p_use_sub_threads, int32_t p_cache_mode) override;
18+
int64_t _get_resource_uid(const String& p_path) const override;
1919

2020
static Error read_all_file_utf8(const String& p_path, String& r_content);
2121
};

‎src/api/resource_format/jvm_resource_format_saver.cpp

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,27 +3,28 @@
33
#include "api/language/names.h"
44
#include "api/script/jvm_script.h"
55
#include "api/script/jvm_script_manager.h"
6+
#include <classes/file_access.hpp>
67

78
using namespace godot;
89

9-
void JvmResourceFormatSaver::get_recognized_extensions(const Ref<Resource>& p_resource, List<String>* p_extensions) const {
10-
if (recognize(p_resource)) {
11-
p_extensions->push_back(GODOT_KOTLIN_SCRIPT_EXTENSION);
12-
p_extensions->push_back(GODOT_JVM_REGISTRATION_FILE_EXTENSION);
13-
p_extensions->push_back(GODOT_JAVA_SCRIPT_EXTENSION);
14-
}
10+
PackedStringArray JvmResourceFormatSaver::_get_recognized_extensions(const Ref<Resource>& p_resource) const {
11+
PackedStringArray extensions;
12+
extensions.push_back(GODOT_KOTLIN_SCRIPT_EXTENSION);
13+
extensions.push_back(GODOT_JVM_REGISTRATION_FILE_EXTENSION);
14+
extensions.push_back(GODOT_JAVA_SCRIPT_EXTENSION);
15+
return extensions;
1516
}
1617

17-
bool JvmResourceFormatSaver::recognize(const Ref<Resource>& p_resource) const {
18+
bool JvmResourceFormatSaver::_recognize(const Ref<Resource>& p_resource) const {
1819
return Object::cast_to<JvmScript>(p_resource.ptr()) != nullptr;
1920
}
2021

21-
Error JvmResourceFormatSaver::save(const Ref<Resource>& p_resource, const String& p_path, uint32_t p_flags) {
22+
Error JvmResourceFormatSaver::_save(const Ref<Resource>& p_resource, const String& p_path, uint32_t p_flags) {
2223
Ref<JvmScript> jvm_script = p_resource;
2324
ERR_FAIL_COND_V(jvm_script.is_null(), ERR_INVALID_PARAMETER);
2425

2526
String extension = p_path.get_extension();
26-
if (!FileAccess::exists(p_path) && extension == GODOT_JVM_REGISTRATION_FILE_EXTENSION) {
27+
if (!FileAccess::file_exists(p_path) && extension == GODOT_JVM_REGISTRATION_FILE_EXTENSION) {
2728
JVM_LOG_WARNING("It's not recommended to create .gdj files directly as they are generated automatically from "
2829
"jvm source files "
2930
"when building your project.\n"
@@ -32,8 +33,8 @@ Error JvmResourceFormatSaver::save(const Ref<Resource>& p_resource, const String
3233
}
3334

3435
{
35-
Error err;
36-
Ref<FileAccess> file {FileAccess::open(p_path, FileAccess::WRITE, &err)};
36+
Ref<FileAccess> file {FileAccess::open(p_path, FileAccess::WRITE)};
37+
Error err = FileAccess::get_open_error();
3738
JVM_ERR_FAIL_COND_V_MSG(err != OK, err, "Cannot save Script file '" + p_path + "'.");
3839
file->store_string(jvm_script->get_source_code());
3940

@@ -42,9 +43,8 @@ Error JvmResourceFormatSaver::save(const Ref<Resource>& p_resource, const String
4243

4344
#ifdef TOOLS_ENABLED
4445
if (extension == GODOT_KOTLIN_SCRIPT_EXTENSION || extension == GODOT_JAVA_SCRIPT_EXTENSION) {
45-
MessageQueue::get_singleton()->push_callable(
46-
callable_mp(JvmScriptManager::get_instance(), &JvmScriptManager::invalidate_source).bind(Ref<SourceScript>(jvm_script))
47-
);
46+
callable_mp(JvmScriptManager::get_instance(), &JvmScriptManager::invalidate_source).bind(Ref<SourceScript>(jvm_script))
47+
.call_deferred();
4848
}
4949
#endif
5050

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#ifndef GODOT_JVM_JVM_RESOURCE_FORMAT_SAVER_H
22
#define GODOT_JVM_JVM_RESOURCE_FORMAT_SAVER_H
33

4-
#include <core/io/resource_saver.h>
4+
#include <classes/resource_format_saver.hpp>
55

66
namespace godot {
77
class JvmResourceFormatSaver : public ResourceFormatSaver {
@@ -10,9 +10,9 @@ namespace godot {
1010
JvmResourceFormatSaver(const JvmResourceFormatSaver&) = delete;
1111
void operator=(const JvmResourceFormatSaver&) = delete;
1212

13-
void get_recognized_extensions(const Ref<Resource>& p_resource, List<String>* p_extensions) const override;
14-
bool recognize(const Ref<Resource>& p_resource) const override;
15-
Error save(const Ref<Resource>& p_resource, const String& p_path, uint32_t p_flags) override;
13+
PackedStringArray _get_recognized_extensions(const Ref<Resource>& p_resource) const override;
14+
bool _recognize(const Ref<Resource>& p_resource) const override;
15+
Error _save(const Ref<Resource>& p_resource, const String& p_path, uint32_t p_flags) override;
1616
};
1717
}
1818
#endif// GODOT_JVM_JVM_RESOURCE_FORMAT_SAVER_H

‎src/api/script/jvm_instance.cpp

Lines changed: 244 additions & 151 deletions
Large diffs are not rendered by default.

‎src/api/script/jvm_instance.h

Lines changed: 80 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,93 @@
11
#ifndef GODOT_JVM_JVM_INSTANCE_H
22
#define GODOT_JVM_JVM_INSTANCE_H
33

4-
#include "core/object/script_language.h"
5-
#include "jvm_script.h"
6-
#include "jvm/wrapper/registration/kt_class.h"
4+
#include "core/jvm_binding_manager.h"
5+
#include "engine/internal.h"
6+
#include "engine/utilities.h"
77
#include "jvm/wrapper/memory/memory_manager.h"
8+
#include "jvm/wrapper/jvm_singleton_wrapper.h"
9+
#include "jvm/wrapper/registration/kt_class.h"
10+
#include "jvm_script.h"
811

912
namespace godot {
10-
class JvmInstance : public ScriptInstance {
11-
friend class MemoryManager;
12-
friend class JvmScript;
1313

14-
private:
15-
Object* owner;
16-
KtObject* kt_object;
17-
KtClass* kt_class;
18-
Ref<JvmScript> script;
19-
SafeFlag to_demote_flag;
20-
bool delete_flag;
14+
class JvmInstance {
15+
public:
16+
struct JvmInstanceData {
17+
Object* owner;
18+
KtObject* kt_object;
19+
KtClass* kt_class;
20+
Ref<JvmScript> script;
21+
List<PropertyInfo> property_list;
22+
List<MethodInfo> method_list;
23+
SafeFlag to_demote_flag;
24+
bool delete_flag;
25+
};
2126

22-
void demote_reference();
23-
void promote_reference();
27+
static GDExtensionBool set(GDExtensionScriptInstanceDataPtr p_instance, GDExtensionConstStringNamePtr p_name, GDExtensionConstVariantPtr p_value);
28+
static GDExtensionBool get(GDExtensionScriptInstanceDataPtr p_instance, GDExtensionConstStringNamePtr p_name, GDExtensionVariantPtr r_ret);
29+
static const GDExtensionPropertyInfo* get_property_list(GDExtensionScriptInstanceDataPtr p_instance, uint32_t* r_count);
30+
static void free_property_list(GDExtensionScriptInstanceDataPtr p_instance, const GDExtensionPropertyInfo* p_list, uint32_t p_count);
31+
static GDExtensionBool get_class_category(GDExtensionScriptInstanceDataPtr p_instance, GDExtensionPropertyInfo* p_class_category);
32+
static GDExtensionBool property_can_revert(GDExtensionScriptInstanceDataPtr p_instance, GDExtensionConstStringNamePtr p_name);
33+
static GDExtensionBool property_get_revert(GDExtensionScriptInstanceDataPtr p_instance, GDExtensionConstStringNamePtr p_name, GDExtensionVariantPtr r_ret);
34+
static GDExtensionObjectPtr get_owner(GDExtensionScriptInstanceDataPtr p_instance);
35+
static void get_property_state(GDExtensionScriptInstanceDataPtr p_instance, GDExtensionScriptInstancePropertyStateAdd p_add_func, void* p_userdata);
36+
static const GDExtensionMethodInfo* get_method_list(GDExtensionScriptInstanceDataPtr p_instance, uint32_t* r_count);
37+
static void free_method_list(GDExtensionScriptInstanceDataPtr p_instance, const GDExtensionMethodInfo* p_list, uint32_t p_count);
38+
static GDExtensionVariantType get_property_type(GDExtensionScriptInstanceDataPtr p_instance, GDExtensionConstStringNamePtr p_name, GDExtensionBool* r_is_valid);
39+
static GDExtensionBool validate_property(GDExtensionScriptInstanceDataPtr p_instance, GDExtensionPropertyInfo* p_property);
40+
static GDExtensionBool has_method(GDExtensionScriptInstanceDataPtr p_instance, GDExtensionConstStringNamePtr p_name);
41+
static GDExtensionInt get_method_argument_count(GDExtensionScriptInstanceDataPtr p_instance, GDExtensionConstStringNamePtr p_name, GDExtensionBool* r_is_valid);
42+
static void call(
43+
GDExtensionScriptInstanceDataPtr p_instance,
44+
GDExtensionConstStringNamePtr p_method,
45+
const GDExtensionConstVariantPtr* p_args,
46+
GDExtensionInt p_argument_count,
47+
GDExtensionVariantPtr r_return,
48+
GDExtensionCallError* r_error
49+
);
50+
static void notification(GDExtensionScriptInstanceDataPtr p_instance, int32_t p_what, GDExtensionBool p_reversed);
51+
static void to_string(GDExtensionScriptInstanceDataPtr p_instance, GDExtensionBool *r_is_valid, GDExtensionStringPtr r_out);
52+
static void refcount_incremented(GDExtensionScriptInstanceDataPtr p_instance);
53+
static GDExtensionBool refcount_decremented(GDExtensionScriptInstanceDataPtr p_instance);
54+
static GDExtensionObjectPtr get_script(GDExtensionScriptInstanceDataPtr p_instance);
55+
static GDExtensionBool set_fallback(GDExtensionScriptInstanceDataPtr p_instance, GDExtensionConstStringNamePtr p_name, GDExtensionConstVariantPtr p_value);
56+
static GDExtensionBool get_fallback(GDExtensionScriptInstanceDataPtr p_instance, GDExtensionConstStringNamePtr p_name, GDExtensionVariantPtr r_ret);
57+
static GDExtensionScriptLanguagePtr get_language(GDExtensionScriptInstanceDataPtr p_instance);
58+
static void free(GDExtensionScriptInstanceDataPtr p_instance);
2459

25-
public:
26-
JvmInstance(jni::Env& p_env, Object* p_owner, KtObject* p_kt_object, JvmScript* p_script);
27-
~JvmInstance() override;
60+
static constexpr const GDExtensionScriptInstanceInfo3 jvm_script_instance_info = {
61+
.set_func = &JvmInstance::set,
62+
.get_func = &JvmInstance::get,
63+
.get_property_list_func = &JvmInstance::get_property_list,
64+
.free_property_list_func = &JvmInstance::free_property_list,
65+
.get_class_category_func = &JvmInstance::get_class_category,
66+
.property_can_revert_func = &JvmInstance::property_can_revert,
67+
.property_get_revert_func = &JvmInstance::property_get_revert,
68+
.get_owner_func = &JvmInstance::get_owner,
69+
.get_property_state_func = &JvmInstance::get_property_state,
70+
.get_method_list_func = &JvmInstance::get_method_list,
71+
.free_method_list_func = &JvmInstance::free_method_list,
72+
.get_property_type_func = &JvmInstance::get_property_type,
73+
.validate_property_func = &JvmInstance::validate_property,
74+
.has_method_func = &JvmInstance::has_method,
75+
.get_method_argument_count_func = &JvmInstance::get_method_argument_count,
76+
.call_func = &JvmInstance::call,
77+
.notification_func = &JvmInstance::notification,
78+
.to_string_func = &JvmInstance::to_string,
79+
.refcount_incremented_func = &JvmInstance::refcount_incremented,
80+
.refcount_decremented_func = &JvmInstance::refcount_decremented,
81+
.get_script_func = &JvmInstance::get_script,
82+
.is_placeholder_func = nullptr,
83+
.set_fallback_func = &JvmInstance::set_fallback,
84+
.get_fallback_func = &JvmInstance::get_fallback,
85+
.get_language_func = &JvmInstance::get_language,
86+
.free_func = &JvmInstance::free,
87+
};
2888

29-
bool set(const StringName& p_name, const Variant& p_value) override;
30-
bool get(const StringName& p_name, Variant& r_ret) const override;
31-
#ifdef TOOLS_ENABLED
32-
bool get_or_default(const StringName& p_name, Variant& r_ret) const;
33-
#endif
34-
void get_property_list(List<PropertyInfo>* p_properties) const override;
35-
Variant::Type get_property_type(const StringName& p_name, bool* r_is_valid) const override;
36-
Object* get_owner() override;
37-
void get_property_state(List<Pair<StringName, Variant>>& state) override;
38-
void get_method_list(List<MethodInfo>* p_list) const override;
39-
bool has_method(const StringName& p_method) const override;
40-
Variant callp(const StringName& p_method, const Variant** p_args, int p_argcount, Callable::CallError& r_error) override;
41-
void notification(int p_notification, bool p_reversed) override;
42-
virtual void validate_property(PropertyInfo& p_property) const override;
43-
String to_string(bool* r_valid) override;
44-
void refcount_incremented() override;
45-
bool refcount_decremented() override;
46-
Ref<Script> get_script() const override;
47-
bool is_placeholder() const override;
48-
void property_set_fallback(const StringName& p_name, const Variant& p_value, bool* r_valid) override;
49-
Variant property_get_fallback(const StringName& p_name, bool* r_valid) override;
50-
// Variant is of type Dictionary
51-
const Variant get_rpc_config() const override;
52-
ScriptLanguage* get_language() override;
53-
bool property_can_revert(const StringName& p_name) const override;
54-
bool property_get_revert(const StringName& p_name, Variant& r_ret) const override;
89+
static void promote_reference(JvmInstanceData* instance_data);
90+
static void demote_reference(JvmInstanceData* instance_data);
5591
};
5692
}
5793
#endif// GODOT_JVM_JVM_INSTANCE_H

‎src/api/script/jvm_placeholder_instance.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ Variant JvmPlaceHolderInstance::callp(const StringName& p_method, const Variant*
2222
packed.append("This script can't be found in your JVM project. Don't forget to build it and use a valid "
2323
"gdj/kt/java file.");
2424
return packed;
25-
} else if (script_ref->get_last_time_source_modified() > static_cast<uint64_t>(JvmScriptManager::get_instance()->get_last_reload())) {
25+
} else if (script_ref->get_last_time_source_modified() > JvmScriptManager::get_instance()->get_last_reload()) {
2626
PackedStringArray packed {};
2727
packed.append("This script has been modified since the last time you built your project.");
2828
return packed;

‎src/api/script/jvm_script.cpp

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,10 @@
11
#include "jvm_script.h"
22

3-
#include "binding/kotlin_binding_manager.h"
4-
#include <core/os/thread.hpp>
5-
#include "jvm_instance.h"
6-
#include "jvm_placeholder_instance.h"
73
#include "api/language/gdj_language.h"
84
#include "api/script/jvm_script_manager.h"
9-
#include <core/config/project_settings.hpp>
10-
#include <scene/main/node.hpp>
11-
#include <core/io/resource_loader.hpp>
5+
#include "classes/engine.hpp"
6+
#include "jvm_instance.h"
7+
#include "jvm_placeholder_instance.h"
128

139
using namespace godot;
1410

@@ -24,7 +20,7 @@ Variant JvmScript::_new() {
2420
Object* JvmScript::_object_create() {
2521
Object* owner {ClassDB::instantiate(kotlin_class->base_godot_class)};
2622

27-
ScriptInstance* instance {_instance_create<true>(owner)};
23+
JvmInstance* instance {_instance_create<true>(owner)};
2824
owner->set_script_instance(instance);
2925
if (!instance) {
3026
memdelete(owner);// no owner, sorry
@@ -34,32 +30,32 @@ Object* JvmScript::_object_create() {
3430
return owner;
3531
}
3632

37-
bool JvmScript::can_instantiate() const {
33+
bool JvmScript::_can_instantiate() const {
3834
#ifdef TOOLS_ENABLED
3935
if (Engine::get_singleton()->is_editor_hint()) {
4036
return false;
4137
} else {
42-
return is_valid();
38+
return _is_valid();
4339
}
4440
#else
4541
return is_valid();
4642
;
4743
#endif
4844
}
4945

50-
bool JvmScript::inherits_script(const Ref<Script>& p_script) const {
46+
bool JvmScript::_inherits_script(const Ref<Script>& p_script) const {
5147
Ref<JvmScript> kotlin_script {p_script};
5248
if (kotlin_script.is_null()) { return false; }
53-
if (!is_valid() || !kotlin_script->is_valid()) { return false; }
49+
if (!_is_valid() || !kotlin_script->_is_valid()) { return false; }
5450

5551
KtClass* parent_class {kotlin_script->kotlin_class};
5652
if (kotlin_class == parent_class) { return true; }
5753

5854
return kotlin_class->registered_supertypes.find(parent_class->registered_class_name);
5955
}
6056

61-
Ref<Script> JvmScript::get_base_script() const {
62-
if (!is_valid() || kotlin_class->registered_supertypes.size() == 0) { return {}; }
57+
Ref<Script> JvmScript::_get_base_script() const {
58+
if (!_is_valid() || kotlin_class->registered_supertypes.size() == 0) { return {}; }
6359
StringName parent_name = kotlin_class->registered_supertypes[0];
6460
return JvmScriptManager::get_instance()->get_script_from_name(parent_name);
6561
}
@@ -134,7 +130,7 @@ bool JvmScript::is_tool() const {
134130
return false;
135131
}
136132

137-
bool JvmScript::is_valid() const {
133+
bool JvmScript::_is_valid() const {
138134
return kotlin_class != nullptr;
139135
}
140136

‎src/api/script/jvm_script.h

Lines changed: 30 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@
22
#define GODOT_JVM_JVM_SCRIPT_H
33

44
#include "jvm/wrapper/registration/kt_class.h"
5-
#include "resource_format/hash.h"
5+
#include "jvm_placeholder_instance.h"
6+
#include "templates/hash_set.hpp"
67

7-
#include <classes/script_language_extension.hpp>
88
#include <classes/script_extension.hpp>
9+
#include <classes/script_language_extension.hpp>
910

1011
namespace godot {
1112

@@ -22,37 +23,37 @@ namespace godot {
2223
String source;
2324

2425
template<bool isCreator>
25-
ScriptInstance* _instance_create(Object* p_this);
26+
JvmInstance* _instance_create(Object* p_this);
2627
Object* _object_create();
2728

2829
public:
2930
JvmScript();
3031
~JvmScript() override;
3132

3233
Variant _new();
33-
bool can_instantiate() const override;
34-
bool inherits_script(const Ref<Script>& p_script) const override;
35-
Ref<Script> get_base_script() const override;
36-
StringName get_instance_base_type() const override;
37-
ScriptInstance* instance_create(Object* p_this) override;
38-
bool instance_has(const Object* p_this) const override;
39-
bool has_source_code() const override;
40-
String get_source_code() const override;
41-
void set_source_code(const String& p_code) override;
42-
Error reload(bool p_keep_state) override;
43-
bool has_method(const StringName& p_method) const override;
44-
MethodInfo get_method_info(const StringName& p_method) const override;
45-
bool is_tool() const override;
46-
bool is_valid() const override;
47-
bool is_placeholder_fallback_enabled() const override;
48-
bool is_abstract() const override;
49-
bool has_script_signal(const StringName& p_signal) const override;
50-
void get_script_signal_list(List<MethodInfo>* r_signals) const override;
51-
bool get_property_default_value(const StringName& p_property, Variant& r_value) const override;
52-
void get_script_method_list(List<MethodInfo>* p_list) const override;
53-
void get_script_property_list(List<PropertyInfo>* p_list) const override;
34+
bool _can_instantiate() const override;
35+
bool _inherits_script(const Ref<Script>& p_script) const override;
36+
Ref<Script> _get_base_script() const override;
37+
StringName _get_instance_base_type() const override;
38+
void* _instance_create(Object* p_this) const override;
39+
bool _instance_has(Object* p_this) const override;
40+
bool _has_source_code() const override;
41+
String _get_source_code() const override;
42+
void _set_source_code(const String& p_code) override;
43+
Error _reload(bool p_keep_state) override;
44+
bool _has_method(const StringName& p_method) const override;
45+
Dictionary _get_method_info(const StringName& p_method) const override;
46+
bool _is_tool() const override;
47+
bool _is_valid() const override;
48+
bool _is_placeholder_fallback_enabled() const override;
49+
bool _is_abstract() const override;
50+
bool _has_script_signal(const StringName& p_signal) const override;
51+
TypedArray<Dictionary> _get_script_signal_list() const override;
52+
Variant _get_property_default_value(const StringName& p_property) const override;
53+
TypedArray<Dictionary> _get_script_method_list() const override;
54+
TypedArray<Dictionary> _get_script_property_list() const override;
5455
void get_script_exported_property_list(List<PropertyInfo>* p_list) const;
55-
Variant get_rpc_config() const override;
56+
Variant _get_rpc_config() const override;
5657

5758
_FORCE_INLINE_ static String get_script_file_name(const String& path) {
5859
return path.get_file().trim_suffix(path.get_extension()).trim_suffix(".");
@@ -62,19 +63,19 @@ namespace godot {
6263
// This concerns placeholders script instances only
6364

6465
private:
65-
HashSet<PlaceHolderScriptInstance*> placeholders;
66+
HashSet<JvmPlaceHolderInstance*> placeholders;
6667
HashMap<StringName, Variant> exported_members_default_value_cache;
6768
uint64_t last_time_source_modified = 0;
6869
bool export_dirty_flag = true;
6970

70-
void _placeholder_erased(PlaceHolderScriptInstance* p_placeholder) override;
71+
void _placeholder_erased(void* p_placeholder) override;
7172

7273
public:
73-
PlaceHolderScriptInstance* placeholder_instance_create(Object* p_this) override;
74+
void* _placeholder_instance_create(Object* p_this) const override;
7475
uint64_t get_last_time_source_modified();
7576
void set_last_time_source_modified(uint64_t p_time);
7677

77-
Vector<DocData::ClassDoc> get_documentation() const override;
78+
TypedArray<Dictionary> _get_documentation() const override;
7879
PropertyInfo get_class_category() const override;
7980
String get_class_icon_path() const override;
8081
StringName get_doc_class_name() const override;

‎src/api/script/jvm_script_manager.cpp

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
1-
21
#include "jvm_script_manager.h"
3-
4-
#include "lifecycle/paths.h"
5-
6-
#include <core/io/resource_loader.hpp>
2+
#include <classes/resource_loader.hpp>
3+
#include "paths.h"
74

85
using namespace godot;
96

@@ -48,7 +45,7 @@ void JvmScriptManager::create_and_update_scripts(Vector<KtClass*>& classes) {
4845
JVM_DEV_VERBOSE("JVM Script updated: %s", script_name);
4946
} else {
5047
#endif
51-
named_script = Ref<NamedScript>(ResourceLoader::load(script_path));
48+
named_script = Ref<NamedScript>(ResourceLoader::get_singleton()->load(script_path));
5249
named_script->kotlin_class = kotlin_class;
5350

5451
JVM_DEV_VERBOSE("JVM Script created: %s", script_name);
@@ -120,7 +117,7 @@ void JvmScriptManager::create_and_update_scripts(Vector<KtClass*>& classes) {
120117
fqdn_to_kt_class = new_fqdn_to_kt_class;
121118

122119
// We have to delay the call to update_script_exports. The engine is not fully initialized and scripts can cause undefined behaviors.
123-
MessageQueue::get_singleton()->push_callable(callable_mp(this, &JvmScriptManager::update_all_scripts).bind(last_reload));
120+
callable_mp(this, &JvmScriptManager::update_all_scripts).bind(last_reload).call_deferred()
124121
#endif
125122

126123
JVM_DEV_LOG("JVM scripts are now loaded.");
@@ -185,7 +182,7 @@ void JvmScriptManager::invalidate_source(const Ref<SourceScript>& source_script)
185182
if (named_script.is_valid()) { named_script->set_last_time_source_modified(last_modified); }
186183
}
187184

188-
int64_t JvmScriptManager::get_last_reload() {
185+
uint64_t JvmScriptManager::get_last_reload() const {
189186
return last_reload;
190187
}
191188
#endif

‎src/api/script/jvm_script_manager.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
#ifndef GODOT_JVM_JVM_SCRIPT_MANAGER_H
22
#define GODOT_JVM_JVM_SCRIPT_MANAGER_H
33

4-
#include "jvm_script.h"
54
#include "api/resource_format/jvm_resource_format_loader.h"
5+
#include "classes/weak_ref.hpp"
6+
#include "jvm_script.h"
67

78
namespace godot {
89

@@ -53,7 +54,7 @@ namespace godot {
5354
static void finalize();
5455

5556
#ifdef TOOLS_ENABLED
56-
int64_t get_last_reload();
57+
uint64_t get_last_reload() const;
5758

5859
void invalidate_source(const Ref<SourceScript>& source_script);
5960
#endif

‎src/engine/internal.cpp

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
#include "internal.h"
2+
3+
using namespace godot;
4+
5+
namespace internal {
6+
void convert_property_to_c(const ::godot::PropertyInfo& p_source, GDExtensionPropertyInfo* p_dest) {
7+
p_dest->type = static_cast<GDExtensionVariantType>(p_source.type);
8+
p_dest->name = p_source.name._native_ptr();
9+
p_dest->hint = p_source.hint;
10+
p_dest->hint_string = p_source.hint_string._native_ptr();
11+
p_dest->class_name = p_source.class_name._native_ptr();
12+
p_dest->usage = p_source.usage;
13+
}
14+
15+
GDExtensionPropertyInfo* create_c_property_list(const std::vector<::godot::PropertyInfo> &plist_cpp) {
16+
const uint32_t plist_size = plist_cpp.size();
17+
auto* plist = reinterpret_cast<GDExtensionPropertyInfo*>(memalloc(sizeof(GDExtensionPropertyInfo) * plist_size));
18+
uint32_t i = 0;
19+
for (const ::godot::PropertyInfo &E : plist_cpp) {
20+
convert_property_to_c(E, &plist[i]);
21+
++i;
22+
}
23+
return plist;
24+
}
25+
26+
GDExtensionVariantPtr* create_c_default_arguments(const std::vector<godot::Variant>& p_list) {
27+
const uint32_t clist_size = p_list.size();
28+
auto* clist = reinterpret_cast<GDExtensionVariantPtr*>(memalloc(sizeof(GDExtensionVariantPtr) * clist_size));
29+
uint32_t i = 0;
30+
for (const godot::Variant& item : p_list) {
31+
clist[i] = const_cast<godot::Variant*>(&item);
32+
++i;
33+
}
34+
return clist;
35+
}
36+
37+
GDExtensionMethodInfo* create_c_method_list(const ::godot::List<::godot::MethodInfo>& p_list_cpp, uint32_t* r_size) {
38+
GDExtensionMethodInfo* c_list = nullptr;
39+
40+
const uint32_t p_list_size = p_list_cpp.size();
41+
42+
if (r_size != nullptr) {
43+
*r_size = p_list_size;
44+
}
45+
46+
c_list = reinterpret_cast<GDExtensionMethodInfo*>(memalloc(sizeof(GDExtensionMethodInfo) * p_list_size));
47+
uint32_t i = 0;
48+
for (const ::godot::MethodInfo& E : p_list_cpp) {
49+
c_list[i].name = E.name._native_ptr();
50+
c_list[i].return_value = GDExtensionPropertyInfo {
51+
.type = static_cast<GDExtensionVariantType>(E.return_val.type),
52+
.name = E.return_val.name._native_ptr(),
53+
.class_name = E.return_val.class_name._native_ptr(),
54+
.hint = E.return_val.hint,
55+
.hint_string = E.return_val.hint_string._native_ptr(),
56+
.usage = E.return_val.usage
57+
};
58+
c_list[i].flags = E.flags;
59+
c_list[i].id = E.id;
60+
c_list[i].argument_count = E.arguments.size(),
61+
c_list[i].arguments = create_c_property_list(E.arguments);
62+
c_list[i].default_argument_count = E.default_arguments.size();
63+
c_list[i].default_arguments = create_c_default_arguments(E.default_arguments);
64+
}
65+
66+
return c_list;
67+
}
68+
69+
void free_c_method_list(GDExtensionMethodInfo* p_list, uint32_t p_count) {
70+
for (int i = 0; i < p_count; ++i) {
71+
memfree(p_list[i].arguments);
72+
memfree(p_list[i].default_arguments);
73+
}
74+
75+
memfree(p_list);
76+
}
77+
}

‎src/engine/internal.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#ifndef GODOT_JVM_INTERNAL_H
2+
#define GODOT_JVM_INTERNAL_H
3+
4+
#include "core/object.hpp"
5+
6+
#include <gdextension_interface.h>
7+
8+
#include <templates/list.hpp>
9+
10+
namespace godot::internal {
11+
void convert_property_to_c(const ::godot::PropertyInfo& p_source, GDExtensionPropertyInfo* p_dest);
12+
GDExtensionMethodInfo* create_c_method_list(const ::godot::List<::godot::MethodInfo>& p_list_cpp, uint32_t* r_size);
13+
void free_c_method_list(GDExtensionMethodInfo* p_list, uint32_t p_count);
14+
} // namespace godot::internal
15+
16+
#endif // GODOT_JVM_INTERNAL_H

‎src/engine/utilities.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,19 @@ _ALWAYS_INLINE_ bool is_ref_counted(godot::Object* obj) {
1313
return (obj->get_instance_id() & (uint64_t(1) << 63)) != 0;
1414
}
1515

16+
static uint64_t hash64(const godot::String& str) {
17+
/* simple djb2 hashing */
18+
19+
const char32_t *chr = str.ptr();
20+
uint64_t hashv = 5381;
21+
uint64_t c = *chr++;
22+
23+
while (c) {
24+
hashv = ((hashv << 5) + hashv) + c; /* hash * 33 + c */
25+
c = *chr++;
26+
}
27+
28+
return hashv;
29+
}
30+
1631
#endif // GODOT_JVM_UTILITIES_H

‎src/jvm/wrapper/memory/memory_manager.cpp

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ void MemoryManager::release_binding(JNIEnv*, jobject, jlong instance_id) {
1818
godot::Object* obj = godot::ObjectDB::get_instance(static_cast<godot::ObjectID>(static_cast<uint64_t>(instance_id)));
1919
if (obj == nullptr) { return; }
2020

21-
godot::JvmBindingManager::free_binding(obj);
21+
::godot::JvmBindingManager::free_binding(obj);
2222
if (is_ref_counted(obj)) {
23-
godot::RefCounted* ref = reinterpret_cast<godot::RefCounted*>(obj);
23+
auto* ref = reinterpret_cast<godot::RefCounted*>(obj);
2424
if (ref->unreference()) { memdelete(ref); }
2525
}
2626
}
@@ -105,8 +105,8 @@ void MemoryManager::query_sync(JNIEnv* p_raw_env, jobject) {
105105
void MemoryManager::sync_memory(jni::Env& p_env) {
106106
// Read the list of references to demote, we do it at the end of a frame instead of the constant ping-pong happening each call.
107107
to_demote_mutex.lock();
108-
for (godot::JvmInstance* script_instance : to_demote_objects) {
109-
script_instance->demote_reference();
108+
for (::godot::JvmInstance::JvmInstanceData* script_instance : to_demote_objects) {
109+
::godot::JvmInstance::demote_reference(script_instance);
110110
}
111111
to_demote_objects.clear();
112112
to_demote_mutex.unlock();
@@ -130,9 +130,8 @@ void MemoryManager::sync_memory(jni::Env& p_env) {
130130
refs_to_decrement.delete_local_ref(p_env);
131131

132132
for (uint64_t id : ids) {
133-
godot::RefCounted* ref =
134-
reinterpret_cast<godot::RefCounted*>(godot::ObjectDB::get_instance(static_cast<godot::ObjectID>(id)));
135-
godot::JvmBindingManager::free_binding(ref);
133+
godot::RefCounted* ref = reinterpret_cast<godot::RefCounted*>(godot::ObjectDB::get_instance(static_cast<godot::ObjectID>(id)));
134+
::godot::JvmBindingManager::free_binding(ref);
136135
if (ref->unreference()) { memdelete(ref); }
137136
}
138137

@@ -151,21 +150,21 @@ void MemoryManager::queue_dead_object(godot::Object* obj) {
151150
dead_objects_mutex.unlock();
152151
}
153152

154-
void MemoryManager::queue_demotion(godot::JvmInstance* script_instance) {
153+
void MemoryManager::queue_demotion(::godot::JvmInstance::JvmInstanceData* script_instance) {
155154
to_demote_mutex.lock();
156155
to_demote_objects.insert(script_instance);
157156
to_demote_mutex.unlock();
158157
}
159158

160-
void MemoryManager::cancel_demotion(godot::JvmInstance* script_instance) {
159+
void MemoryManager::cancel_demotion(::godot::JvmInstance::JvmInstanceData* script_instance) {
161160
to_demote_mutex.lock();
162161
to_demote_objects.erase(script_instance);
163162
to_demote_mutex.unlock();
164163
}
165164

166-
void MemoryManager::try_promotion(godot::JvmInstance* script_instance) {
165+
void MemoryManager::try_promotion(::godot::JvmInstance::JvmInstanceData* script_instance) {
167166
to_demote_mutex.lock();
168-
script_instance->promote_reference();
167+
::godot::JvmInstance::promote_reference(script_instance);
169168
to_demote_mutex.unlock();
170169
}
171170

‎src/jvm/wrapper/memory/memory_manager.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ JVM_SINGLETON_WRAPPER(MemoryManager, "godot.internal.memory.MemoryManager") {
3434
godot::LocalVector<godot::ObjectID> dead_objects;
3535

3636
godot::Mutex to_demote_mutex;
37-
godot::HashSet<godot::JvmInstance*> to_demote_objects;
37+
godot::HashSet<::godot::JvmInstance::JvmInstanceData*> to_demote_objects;
3838

3939
static bool check_instance(JNIEnv* p_raw_env, jobject p_instance, jlong p_raw_ptr, jlong instance_id);
4040
static void unref_native_core_types(JNIEnv* p_raw_env, jobject p_instance, jobject p_ptr_array, jobject p_var_type_array);
@@ -44,9 +44,9 @@ JVM_SINGLETON_WRAPPER(MemoryManager, "godot.internal.memory.MemoryManager") {
4444
public:
4545
void direct_object_deletion(jni::Env& p_env, godot::Object* obj);
4646
void queue_dead_object(godot::Object* obj);
47-
void queue_demotion(godot::JvmInstance* script_instance);
48-
void cancel_demotion(godot::JvmInstance* script_instance);
49-
void try_promotion(godot::JvmInstance* script_instance);
47+
void queue_demotion(::godot::JvmInstance::JvmInstanceData* script_instance);
48+
void cancel_demotion(::godot::JvmInstance::JvmInstanceData* script_instance);
49+
void try_promotion(::godot::JvmInstance::JvmInstanceData* script_instance);
5050
void sync_memory(jni::Env& p_env);
5151
void clean_up(jni::Env& p_env);
5252
};

0 commit comments

Comments
 (0)
Please sign in to comment.