summaryrefslogtreecommitdiffstats
path: root/modules/mono/mono_gd
diff options
context:
space:
mode:
Diffstat (limited to 'modules/mono/mono_gd')
-rw-r--r--modules/mono/mono_gd/gd_mono.cpp4
-rw-r--r--modules/mono/mono_gd/gd_mono_utils.cpp29
-rw-r--r--modules/mono/mono_gd/gd_mono_utils.h2
3 files changed, 33 insertions, 2 deletions
diff --git a/modules/mono/mono_gd/gd_mono.cpp b/modules/mono/mono_gd/gd_mono.cpp
index b2b5a90507..03418a02ea 100644
--- a/modules/mono/mono_gd/gd_mono.cpp
+++ b/modules/mono/mono_gd/gd_mono.cpp
@@ -264,7 +264,7 @@ void GDMono::initialize() {
_load_project_assembly();
} else {
#ifdef TOOLS_ENABLED
- // The assembly was successfuly loaded, but the full api could not be cached.
+ // The assembly was successfully loaded, but the full api could not be cached.
// This is most likely an outdated assembly loaded because of an invalid version in the metadata,
// so we invalidate the version in the metadata and unload the script domain.
@@ -715,7 +715,7 @@ Error GDMono::reload_scripts_domain() {
// Everything is fine with the api assemblies, load the project assembly
_load_project_assembly();
} else {
- // The assembly was successfuly loaded, but the full api could not be cached.
+ // The assembly was successfully loaded, but the full api could not be cached.
// This is most likely an outdated assembly loaded because of an invalid version in the metadata,
// so we invalidate the version in the metadata and unload the script domain.
diff --git a/modules/mono/mono_gd/gd_mono_utils.cpp b/modules/mono/mono_gd/gd_mono_utils.cpp
index cc5b5652f8..8fbaca0992 100644
--- a/modules/mono/mono_gd/gd_mono_utils.cpp
+++ b/modules/mono/mono_gd/gd_mono_utils.cpp
@@ -663,4 +663,33 @@ MonoObject *property_get_value(MonoProperty *p_prop, void *p_obj, void **p_param
return ret;
}
+uint64_t unbox_enum_value(MonoObject *p_boxed, MonoType *p_enum_basetype, bool &r_error) {
+ r_error = false;
+ switch (mono_type_get_type(p_enum_basetype)) {
+ case MONO_TYPE_BOOLEAN:
+ return (bool)GDMonoMarshal::unbox<MonoBoolean>(p_boxed) ? 1 : 0;
+ case MONO_TYPE_CHAR:
+ return GDMonoMarshal::unbox<uint16_t>(p_boxed);
+ case MONO_TYPE_U1:
+ return GDMonoMarshal::unbox<uint8_t>(p_boxed);
+ case MONO_TYPE_U2:
+ return GDMonoMarshal::unbox<uint16_t>(p_boxed);
+ case MONO_TYPE_U4:
+ return GDMonoMarshal::unbox<uint32_t>(p_boxed);
+ case MONO_TYPE_U8:
+ return GDMonoMarshal::unbox<uint64_t>(p_boxed);
+ case MONO_TYPE_I1:
+ return GDMonoMarshal::unbox<int8_t>(p_boxed);
+ case MONO_TYPE_I2:
+ return GDMonoMarshal::unbox<int16_t>(p_boxed);
+ case MONO_TYPE_I4:
+ return GDMonoMarshal::unbox<int32_t>(p_boxed);
+ case MONO_TYPE_I8:
+ return GDMonoMarshal::unbox<int64_t>(p_boxed);
+ default:
+ r_error = true;
+ return 0;
+ }
+}
+
} // namespace GDMonoUtils
diff --git a/modules/mono/mono_gd/gd_mono_utils.h b/modules/mono/mono_gd/gd_mono_utils.h
index c8e23f071f..96ff3e8116 100644
--- a/modules/mono/mono_gd/gd_mono_utils.h
+++ b/modules/mono/mono_gd/gd_mono_utils.h
@@ -240,6 +240,8 @@ MonoString *object_to_string(MonoObject *p_obj, MonoException **p_exc);
void property_set_value(MonoProperty *p_prop, void *p_obj, void **p_params, MonoException **p_exc);
MonoObject *property_get_value(MonoProperty *p_prop, void *p_obj, void **p_params, MonoException **p_exc);
+uint64_t unbox_enum_value(MonoObject *p_boxed, MonoType *p_enum_basetype, bool &r_error);
+
} // namespace GDMonoUtils
#define NATIVE_GDMONOCLASS_NAME(m_class) (GDMonoMarshal::mono_string_to_godot((MonoString *)m_class->get_field(BINDINGS_NATIVE_NAME_FIELD)->get_value(NULL)))