1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-05 12:10:55 +00:00

Mono: Cleanup

This commit is contained in:
Ignacio Etcheverry
2019-01-29 00:02:35 +01:00
parent eb1e3ee232
commit d3c51a5dfb
24 changed files with 129 additions and 143 deletions

View File

@@ -578,7 +578,7 @@ void CSharpLanguage::frame() {
if (exc) { if (exc) {
GDMonoUtils::debug_unhandled_exception(exc); GDMonoUtils::debug_unhandled_exception(exc);
_UNREACHABLE_(); GD_UNREACHABLE();
} }
} }
} }
@@ -1608,7 +1608,7 @@ bool CSharpInstance::refcount_decremented() {
return ref_dying; return ref_dying;
} }
MultiplayerAPI::RPCMode CSharpInstance::_member_get_rpc_mode(GDMonoClassMember *p_member) const { MultiplayerAPI::RPCMode CSharpInstance::_member_get_rpc_mode(IMonoClassMember *p_member) const {
if (p_member->has_attribute(CACHED_CLASS(RemoteAttribute))) if (p_member->has_attribute(CACHED_CLASS(RemoteAttribute)))
return MultiplayerAPI::RPC_MODE_REMOTE; return MultiplayerAPI::RPC_MODE_REMOTE;
@@ -2019,7 +2019,7 @@ bool CSharpScript::_get_signal(GDMonoClass *p_class, GDMonoClass *p_delegate, Ve
* Returns false if there was an error, otherwise true. * Returns false if there was an error, otherwise true.
* If there was an error, r_prop_info and r_exported are not assigned any value. * If there was an error, r_prop_info and r_exported are not assigned any value.
*/ */
bool CSharpScript::_get_member_export(GDMonoClass *p_class, GDMonoClassMember *p_member, PropertyInfo &r_prop_info, bool &r_exported) { bool CSharpScript::_get_member_export(GDMonoClass *p_class, IMonoClassMember *p_member, PropertyInfo &r_prop_info, bool &r_exported) {
StringName name = p_member->get_name(); StringName name = p_member->get_name();
@@ -2034,9 +2034,9 @@ bool CSharpScript::_get_member_export(GDMonoClass *p_class, GDMonoClassMember *p
ManagedType type; ManagedType type;
if (p_member->get_member_type() == GDMonoClassMember::MEMBER_TYPE_FIELD) { if (p_member->get_member_type() == IMonoClassMember::MEMBER_TYPE_FIELD) {
type = static_cast<GDMonoField *>(p_member)->get_type(); type = static_cast<GDMonoField *>(p_member)->get_type();
} else if (p_member->get_member_type() == GDMonoClassMember::MEMBER_TYPE_PROPERTY) { } else if (p_member->get_member_type() == IMonoClassMember::MEMBER_TYPE_PROPERTY) {
type = static_cast<GDMonoProperty *>(p_member)->get_type(); type = static_cast<GDMonoProperty *>(p_member)->get_type();
} else { } else {
CRASH_NOW(); CRASH_NOW();
@@ -2050,7 +2050,7 @@ bool CSharpScript::_get_member_export(GDMonoClass *p_class, GDMonoClassMember *p
return true; return true;
} }
if (p_member->get_member_type() == GDMonoClassMember::MEMBER_TYPE_PROPERTY) { if (p_member->get_member_type() == IMonoClassMember::MEMBER_TYPE_PROPERTY) {
GDMonoProperty *property = static_cast<GDMonoProperty *>(p_member); GDMonoProperty *property = static_cast<GDMonoProperty *>(p_member);
if (!property->has_getter() || !property->has_setter()) { if (!property->has_getter() || !property->has_setter()) {
ERR_PRINTS("Cannot export property because it does not provide a getter or a setter: " + p_class->get_full_name() + "." + name.operator String()); ERR_PRINTS("Cannot export property because it does not provide a getter or a setter: " + p_class->get_full_name() + "." + name.operator String());

View File

@@ -127,7 +127,7 @@ class CSharpScript : public Script {
bool _update_exports(); bool _update_exports();
#ifdef TOOLS_ENABLED #ifdef TOOLS_ENABLED
bool _get_member_export(GDMonoClass *p_class, GDMonoClassMember *p_member, PropertyInfo &r_prop_info, bool &r_exported); bool _get_member_export(GDMonoClass *p_class, IMonoClassMember *p_member, PropertyInfo &r_prop_info, bool &r_exported);
#endif #endif
CSharpInstance *_create_instance(const Variant **p_args, int p_argcount, Object *p_owner, bool p_isref, Variant::CallError &r_error); CSharpInstance *_create_instance(const Variant **p_args, int p_argcount, Object *p_owner, bool p_isref, Variant::CallError &r_error);
@@ -216,7 +216,7 @@ class CSharpInstance : public ScriptInstance {
void _call_multilevel(MonoObject *p_mono_object, const StringName &p_method, const Variant **p_args, int p_argcount); void _call_multilevel(MonoObject *p_mono_object, const StringName &p_method, const Variant **p_args, int p_argcount);
MultiplayerAPI::RPCMode _member_get_rpc_mode(GDMonoClassMember *p_member) const; MultiplayerAPI::RPCMode _member_get_rpc_mode(IMonoClassMember *p_member) const;
public: public:
MonoObject *get_mono_object() const; MonoObject *get_mono_object() const;

View File

@@ -517,7 +517,7 @@ void GodotSharpBuilds::BuildProcess::start(bool p_blocking) {
// Remove old issues file // Remove old issues file
String issues_file = "msbuild_issues.csv"; String issues_file = get_msbuild_issues_filename();
DirAccessRef d = DirAccess::create_for_path(log_dirpath); DirAccessRef d = DirAccess::create_for_path(log_dirpath);
if (d->file_exists(issues_file)) { if (d->file_exists(issues_file)) {
Error err = d->remove(issues_file); Error err = d->remove(issues_file);
@@ -584,7 +584,8 @@ void GodotSharpBuilds::BuildProcess::start(bool p_blocking) {
exit_code = klass->get_field("exitCode")->get_int_value(mono_object); exit_code = klass->get_field("exitCode")->get_int_value(mono_object);
if (exit_code != 0) { if (exit_code != 0) {
print_verbose("MSBuild finished with exit code " + itos(exit_code)); String log_filepath = build_info.get_log_dirpath().plus_file(get_msbuild_log_filename());
print_verbose("MSBuild exited with code: " + itos(exit_code) + ". Log file: " + log_filepath);
} }
build_tab->on_build_exit(exit_code == 0 ? MonoBuildTab::RESULT_SUCCESS : MonoBuildTab::RESULT_ERROR); build_tab->on_build_exit(exit_code == 0 ? MonoBuildTab::RESULT_SUCCESS : MonoBuildTab::RESULT_ERROR);

View File

@@ -76,6 +76,9 @@ public:
static void show_build_error_dialog(const String &p_message); static void show_build_error_dialog(const String &p_message);
static const char *get_msbuild_issues_filename() { return "msbuild_issues.csv"; }
static const char *get_msbuild_log_filename() { return "msbuild_log.txt"; }
void build_exit_callback(const MonoBuildInfo &p_build_info, int p_exit_code); void build_exit_callback(const MonoBuildInfo &p_build_info, int p_exit_code);
void restart_build(MonoBuildTab *p_build_tab); void restart_build(MonoBuildTab *p_build_tab);

View File

@@ -452,7 +452,7 @@ GodotSharpEditor::GodotSharpEditor(EditorNode *p_editor) {
EditorSettings *ed_settings = EditorSettings::get_singleton(); EditorSettings *ed_settings = EditorSettings::get_singleton();
EDITOR_DEF("mono/editor/external_editor", EDITOR_NONE); EDITOR_DEF("mono/editor/external_editor", EDITOR_NONE);
String settings_hint_str = "None"; String settings_hint_str = "Disabled";
#ifdef WINDOWS_ENABLED #ifdef WINDOWS_ENABLED
settings_hint_str += ",MonoDevelop,Visual Studio Code"; settings_hint_str += ",MonoDevelop,Visual Studio Code";

View File

@@ -187,7 +187,7 @@ void MonoBottomPanel::_view_log_pressed() {
String log_dirpath = build_tab->get_build_info().get_log_dirpath(); String log_dirpath = build_tab->get_build_info().get_log_dirpath();
OS::get_singleton()->shell_open(log_dirpath.plus_file("msbuild_log.txt")); OS::get_singleton()->shell_open(log_dirpath.plus_file(GodotSharpBuilds::get_msbuild_log_filename()));
} }
} }
@@ -421,7 +421,7 @@ void MonoBuildTab::on_build_exit(BuildResult result) {
build_exited = true; build_exited = true;
build_result = result; build_result = result;
_load_issues_from_file(logs_dir.plus_file("msbuild_issues.csv")); _load_issues_from_file(logs_dir.plus_file(GodotSharpBuilds::get_msbuild_issues_filename()));
_update_issues_list(); _update_issues_list();
MonoBottomPanel::get_singleton()->raise_build_tab(this); MonoBottomPanel::get_singleton()->raise_build_tab(this);

View File

@@ -54,17 +54,6 @@
#include "main/main.h" #include "main/main.h"
#endif #endif
#ifdef MONO_PRINT_HANDLER_ENABLED
void gdmono_MonoPrintCallback(const char *string, mono_bool is_stdout) {
if (is_stdout) {
OS::get_singleton()->print(string);
} else {
OS::get_singleton()->printerr(string);
}
}
#endif
GDMono *GDMono::singleton = NULL; GDMono *GDMono::singleton = NULL;
namespace { namespace {
@@ -162,11 +151,6 @@ void GDMono::initialize() {
GDMonoLog::get_singleton()->initialize(); GDMonoLog::get_singleton()->initialize();
#ifdef MONO_PRINT_HANDLER_ENABLED
mono_trace_set_print_handler(gdmono_MonoPrintCallback);
mono_trace_set_printerr_handler(gdmono_MonoPrintCallback);
#endif
String assembly_rootdir; String assembly_rootdir;
String config_dir; String config_dir;
@@ -327,7 +311,7 @@ namespace GodotSharpBindings {
uint64_t get_core_api_hash(); uint64_t get_core_api_hash();
#ifdef TOOLS_ENABLED #ifdef TOOLS_ENABLED
uint64_t get_editor_api_hash(); uint64_t get_editor_api_hash();
#endif // TOOLS_ENABLED #endif
uint32_t get_bindings_version(); uint32_t get_bindings_version();
void register_generated_icalls(); void register_generated_icalls();
@@ -344,29 +328,20 @@ void GDMono::_register_internal_calls() {
#endif #endif
} }
#ifdef DEBUG_METHODS_ENABLED
void GDMono::_initialize_and_check_api_hashes() { void GDMono::_initialize_and_check_api_hashes() {
api_core_hash = ClassDB::get_api_hash(ClassDB::API_CORE);
#ifdef MONO_GLUE_ENABLED #ifdef MONO_GLUE_ENABLED
if (api_core_hash != GodotSharpBindings::get_core_api_hash()) { if (get_api_core_hash() != GodotSharpBindings::get_core_api_hash()) {
ERR_PRINT("Mono: Core API hash mismatch!"); ERR_PRINT("Mono: Core API hash mismatch!");
} }
#endif
#ifdef TOOLS_ENABLED #ifdef TOOLS_ENABLED
api_editor_hash = ClassDB::get_api_hash(ClassDB::API_EDITOR); if (get_api_editor_hash() != GodotSharpBindings::get_editor_api_hash()) {
#ifdef MONO_GLUE_ENABLED
if (api_editor_hash != GodotSharpBindings::get_editor_api_hash()) {
ERR_PRINT("Mono: Editor API hash mismatch!"); ERR_PRINT("Mono: Editor API hash mismatch!");
} }
#endif
#endif // TOOLS_ENABLED #endif // TOOLS_ENABLED
#endif // MONO_GLUE_ENABLED
} }
#endif // DEBUG_METHODS_ENABLED
void GDMono::add_assembly(uint32_t p_domain_id, GDMonoAssembly *p_assembly) { void GDMono::add_assembly(uint32_t p_domain_id, GDMonoAssembly *p_assembly) {
@@ -915,7 +890,7 @@ void GDMono::unhandled_exception_hook(MonoObject *p_exc, void *) {
ScriptDebugger::get_singleton()->idle_poll(); ScriptDebugger::get_singleton()->idle_poll();
#endif #endif
abort(); abort();
_UNREACHABLE_(); GD_UNREACHABLE();
} }
GDMono::GDMono() { GDMono::GDMono() {
@@ -946,12 +921,10 @@ GDMono::GDMono() {
editor_tools_assembly = NULL; editor_tools_assembly = NULL;
#endif #endif
#ifdef DEBUG_METHODS_ENABLED
api_core_hash = 0; api_core_hash = 0;
#ifdef TOOLS_ENABLED #ifdef TOOLS_ENABLED
api_editor_hash = 0; api_editor_hash = 0;
#endif #endif
#endif
} }
GDMono::~GDMono() { GDMono::~GDMono() {
@@ -1074,17 +1047,9 @@ void _GodotSharp::_bind_methods() {
_GodotSharp::_GodotSharp() { _GodotSharp::_GodotSharp() {
singleton = this; singleton = this;
queue_empty = true;
#ifndef NO_THREADS
queue_mutex = Mutex::create();
#endif
} }
_GodotSharp::~_GodotSharp() { _GodotSharp::~_GodotSharp() {
singleton = NULL; singleton = NULL;
if (queue_mutex) {
memdelete(queue_mutex);
}
} }

View File

@@ -134,13 +134,11 @@ class GDMono {
Error _load_tools_domain(); Error _load_tools_domain();
#endif #endif
#ifdef DEBUG_METHODS_ENABLED
uint64_t api_core_hash; uint64_t api_core_hash;
#ifdef TOOLS_ENABLED #ifdef TOOLS_ENABLED
uint64_t api_editor_hash; uint64_t api_editor_hash;
#endif #endif
void _initialize_and_check_api_hashes(); void _initialize_and_check_api_hashes();
#endif
GDMonoLog *gdmono_log; GDMonoLog *gdmono_log;
@@ -152,11 +150,17 @@ protected:
static GDMono *singleton; static GDMono *singleton;
public: public:
#ifdef DEBUG_METHODS_ENABLED uint64_t get_api_core_hash() {
uint64_t get_api_core_hash() { return api_core_hash; } if (api_core_hash == 0)
api_core_hash = ClassDB::get_api_hash(ClassDB::API_CORE);
return api_core_hash;
}
#ifdef TOOLS_ENABLED #ifdef TOOLS_ENABLED
uint64_t get_api_editor_hash() { return api_editor_hash; } uint64_t get_api_editor_hash() {
#endif if (api_editor_hash == 0)
api_editor_hash = ClassDB::get_api_hash(ClassDB::API_EDITOR);
return api_editor_hash;
}
#endif #endif
#ifdef TOOLS_ENABLED #ifdef TOOLS_ENABLED
@@ -268,12 +272,6 @@ class _GodotSharp : public Object {
List<NodePath *> np_delete_queue; List<NodePath *> np_delete_queue;
List<RID *> rid_delete_queue; List<RID *> rid_delete_queue;
bool queue_empty;
#ifndef NO_THREADS
Mutex *queue_mutex;
#endif
protected: protected:
static _GodotSharp *singleton; static _GodotSharp *singleton;
static void _bind_methods(); static void _bind_methods();

View File

@@ -35,7 +35,7 @@
#include <mono/metadata/object.h> #include <mono/metadata/object.h>
class GDMonoClassMember { class IMonoClassMember {
public: public:
enum Visibility { enum Visibility {
PRIVATE, PRIVATE,
@@ -51,7 +51,7 @@ public:
MEMBER_TYPE_METHOD MEMBER_TYPE_METHOD
}; };
virtual ~GDMonoClassMember() {} virtual ~IMonoClassMember() {}
virtual MemberType get_member_type() = 0; virtual MemberType get_member_type() = 0;

View File

@@ -505,20 +505,20 @@ bool GDMonoField::is_static() {
return mono_field_get_flags(mono_field) & MONO_FIELD_ATTR_STATIC; return mono_field_get_flags(mono_field) & MONO_FIELD_ATTR_STATIC;
} }
GDMonoClassMember::Visibility GDMonoField::get_visibility() { IMonoClassMember::Visibility GDMonoField::get_visibility() {
switch (mono_field_get_flags(mono_field) & MONO_FIELD_ATTR_FIELD_ACCESS_MASK) { switch (mono_field_get_flags(mono_field) & MONO_FIELD_ATTR_FIELD_ACCESS_MASK) {
case MONO_FIELD_ATTR_PRIVATE: case MONO_FIELD_ATTR_PRIVATE:
return GDMonoClassMember::PRIVATE; return IMonoClassMember::PRIVATE;
case MONO_FIELD_ATTR_FAM_AND_ASSEM: case MONO_FIELD_ATTR_FAM_AND_ASSEM:
return GDMonoClassMember::PROTECTED_AND_INTERNAL; return IMonoClassMember::PROTECTED_AND_INTERNAL;
case MONO_FIELD_ATTR_ASSEMBLY: case MONO_FIELD_ATTR_ASSEMBLY:
return GDMonoClassMember::INTERNAL; return IMonoClassMember::INTERNAL;
case MONO_FIELD_ATTR_FAMILY: case MONO_FIELD_ATTR_FAMILY:
return GDMonoClassMember::PROTECTED; return IMonoClassMember::PROTECTED;
case MONO_FIELD_ATTR_PUBLIC: case MONO_FIELD_ATTR_PUBLIC:
return GDMonoClassMember::PUBLIC; return IMonoClassMember::PUBLIC;
default: default:
ERR_FAIL_V(GDMonoClassMember::PRIVATE); ERR_FAIL_V(IMonoClassMember::PRIVATE);
} }
} }

View File

@@ -35,7 +35,7 @@
#include "gd_mono_class_member.h" #include "gd_mono_class_member.h"
#include "gd_mono_header.h" #include "gd_mono_header.h"
class GDMonoField : public GDMonoClassMember { class GDMonoField : public IMonoClassMember {
GDMonoClass *owner; GDMonoClass *owner;
MonoClassField *mono_field; MonoClassField *mono_field;
@@ -47,15 +47,15 @@ class GDMonoField : public GDMonoClassMember {
MonoCustomAttrInfo *attributes; MonoCustomAttrInfo *attributes;
public: public:
virtual MemberType get_member_type() { return MEMBER_TYPE_FIELD; } virtual MemberType get_member_type() GD_FINAL { return MEMBER_TYPE_FIELD; }
virtual StringName get_name() { return name; } virtual StringName get_name() GD_FINAL { return name; }
virtual bool is_static(); virtual bool is_static() GD_FINAL;
virtual Visibility get_visibility(); virtual Visibility get_visibility() GD_FINAL;
virtual bool has_attribute(GDMonoClass *p_attr_class); virtual bool has_attribute(GDMonoClass *p_attr_class) GD_FINAL;
virtual MonoObject *get_attribute(GDMonoClass *p_attr_class); virtual MonoObject *get_attribute(GDMonoClass *p_attr_class) GD_FINAL;
void fetch_attributes(); void fetch_attributes();
_FORCE_INLINE_ ManagedType get_type() const { return type; } _FORCE_INLINE_ ManagedType get_type() const { return type; }

View File

@@ -35,7 +35,7 @@
class GDMonoAssembly; class GDMonoAssembly;
class GDMonoClass; class GDMonoClass;
class GDMonoClassMember; class IMonoClassMember;
class GDMonoField; class GDMonoField;
class GDMonoProperty; class GDMonoProperty;
class GDMonoMethod; class GDMonoMethod;

View File

@@ -72,7 +72,7 @@ void tie_managed_to_unmanaged(MonoObject *managed, Object *unmanaged) {
void unhandled_exception(MonoException *p_exc) { void unhandled_exception(MonoException *p_exc) {
mono_unhandled_exception((MonoObject *)p_exc); // prints the exception as well mono_unhandled_exception((MonoObject *)p_exc); // prints the exception as well
abort(); abort();
_UNREACHABLE_(); GD_UNREACHABLE();
} }
} // namespace GDMonoInternals } // namespace GDMonoInternals

View File

@@ -45,7 +45,7 @@ void tie_managed_to_unmanaged(MonoObject *managed, Object *unmanaged);
* Do not call this function directly. * Do not call this function directly.
* Use GDMonoUtils::debug_unhandled_exception(MonoException *) instead. * Use GDMonoUtils::debug_unhandled_exception(MonoException *) instead.
*/ */
_NO_RETURN_ void unhandled_exception(MonoException *p_exc); GD_NORETURN void unhandled_exception(MonoException *p_exc);
} // namespace GDMonoInternals } // namespace GDMonoInternals

View File

@@ -52,7 +52,7 @@ static int log_level_get_id(const char *p_log_level) {
return -1; return -1;
} }
void gdmono_MonoLogCallback(const char *log_domain, const char *log_level, const char *message, mono_bool fatal, void *user_data) { static void mono_log_callback(const char *log_domain, const char *log_level, const char *message, mono_bool fatal, void *user_data) {
FileAccess *f = GDMonoLog::get_singleton()->get_log_file(); FileAccess *f = GDMonoLog::get_singleton()->get_log_file();
@@ -153,7 +153,7 @@ void GDMonoLog::initialize() {
if (log_file) { if (log_file) {
print_verbose("Mono: Logfile is " + log_file_path); print_verbose("Mono: Logfile is " + log_file_path);
mono_trace_set_log_handler(gdmono_MonoLogCallback, this); mono_trace_set_log_handler(mono_log_callback, this);
} else { } else {
OS::get_singleton()->printerr("Mono: No log file, using default log handler\n"); OS::get_singleton()->printerr("Mono: No log file, using default log handler\n");
} }

View File

@@ -206,9 +206,10 @@ enum {
// In the future we may force this if we want to ref return these structs // In the future we may force this if we want to ref return these structs
#ifdef GD_MONO_FORCE_INTEROP_STRUCT_COPY #ifdef GD_MONO_FORCE_INTEROP_STRUCT_COPY
// Sometimes clang-format can be an ass /* clang-format off */
GD_STATIC_ASSERT(MATCHES_Vector2 &&MATCHES_Rect2 &&MATCHES_Transform2D &&MATCHES_Vector3 && GD_STATIC_ASSERT(MATCHES_Vector2 && MATCHES_Rect2 && MATCHES_Transform2D && MATCHES_Vector3 &&
MATCHES_Basis &&MATCHES_Quat &&MATCHES_Transform &&MATCHES_AABB &&MATCHES_Color &&MATCHES_Plane); MATCHES_Basis && MATCHES_Quat && MATCHES_Transform && MATCHES_AABB && MATCHES_Color &&MATCHES_Plane);
/* clang-format on */
#endif #endif
} // namespace InteropLayout } // namespace InteropLayout

View File

@@ -78,20 +78,20 @@ bool GDMonoMethod::is_static() {
return mono_method_get_flags(mono_method, NULL) & MONO_METHOD_ATTR_STATIC; return mono_method_get_flags(mono_method, NULL) & MONO_METHOD_ATTR_STATIC;
} }
GDMonoClassMember::Visibility GDMonoMethod::get_visibility() { IMonoClassMember::Visibility GDMonoMethod::get_visibility() {
switch (mono_method_get_flags(mono_method, NULL) & MONO_METHOD_ATTR_ACCESS_MASK) { switch (mono_method_get_flags(mono_method, NULL) & MONO_METHOD_ATTR_ACCESS_MASK) {
case MONO_METHOD_ATTR_PRIVATE: case MONO_METHOD_ATTR_PRIVATE:
return GDMonoClassMember::PRIVATE; return IMonoClassMember::PRIVATE;
case MONO_METHOD_ATTR_FAM_AND_ASSEM: case MONO_METHOD_ATTR_FAM_AND_ASSEM:
return GDMonoClassMember::PROTECTED_AND_INTERNAL; return IMonoClassMember::PROTECTED_AND_INTERNAL;
case MONO_METHOD_ATTR_ASSEM: case MONO_METHOD_ATTR_ASSEM:
return GDMonoClassMember::INTERNAL; return IMonoClassMember::INTERNAL;
case MONO_METHOD_ATTR_FAMILY: case MONO_METHOD_ATTR_FAMILY:
return GDMonoClassMember::PROTECTED; return IMonoClassMember::PROTECTED;
case MONO_METHOD_ATTR_PUBLIC: case MONO_METHOD_ATTR_PUBLIC:
return GDMonoClassMember::PUBLIC; return IMonoClassMember::PUBLIC;
default: default:
ERR_FAIL_V(GDMonoClassMember::PRIVATE); ERR_FAIL_V(IMonoClassMember::PRIVATE);
} }
} }

View File

@@ -35,7 +35,7 @@
#include "gd_mono_class_member.h" #include "gd_mono_class_member.h"
#include "gd_mono_header.h" #include "gd_mono_header.h"
class GDMonoMethod : public GDMonoClassMember { class GDMonoMethod : public IMonoClassMember {
StringName name; StringName name;
@@ -57,17 +57,17 @@ class GDMonoMethod : public GDMonoClassMember {
MonoMethod *mono_method; MonoMethod *mono_method;
public: public:
virtual MemberType get_member_type() { return MEMBER_TYPE_METHOD; } virtual MemberType get_member_type() GD_FINAL { return MEMBER_TYPE_METHOD; }
virtual StringName get_name() { return name; } virtual StringName get_name() GD_FINAL { return name; }
virtual bool is_static(); virtual bool is_static() GD_FINAL;
virtual Visibility get_visibility(); virtual Visibility get_visibility() GD_FINAL;
virtual bool has_attribute(GDMonoClass *p_attr_class); virtual bool has_attribute(GDMonoClass *p_attr_class) GD_FINAL;
virtual MonoObject *get_attribute(GDMonoClass *p_attr_class); virtual MonoObject *get_attribute(GDMonoClass *p_attr_class) GD_FINAL;
virtual void fetch_attributes(); void fetch_attributes();
_FORCE_INLINE_ int get_parameters_count() { return params_count; } _FORCE_INLINE_ int get_parameters_count() { return params_count; }
_FORCE_INLINE_ ManagedType get_return_type() { return return_type; } _FORCE_INLINE_ ManagedType get_return_type() { return return_type; }

View File

@@ -80,24 +80,24 @@ bool GDMonoProperty::is_static() {
return mono_method_get_flags(prop_method, NULL) & MONO_METHOD_ATTR_STATIC; return mono_method_get_flags(prop_method, NULL) & MONO_METHOD_ATTR_STATIC;
} }
GDMonoClassMember::Visibility GDMonoProperty::get_visibility() { IMonoClassMember::Visibility GDMonoProperty::get_visibility() {
MonoMethod *prop_method = mono_property_get_get_method(mono_property); MonoMethod *prop_method = mono_property_get_get_method(mono_property);
if (prop_method == NULL) if (prop_method == NULL)
prop_method = mono_property_get_set_method(mono_property); prop_method = mono_property_get_set_method(mono_property);
switch (mono_method_get_flags(prop_method, NULL) & MONO_METHOD_ATTR_ACCESS_MASK) { switch (mono_method_get_flags(prop_method, NULL) & MONO_METHOD_ATTR_ACCESS_MASK) {
case MONO_METHOD_ATTR_PRIVATE: case MONO_METHOD_ATTR_PRIVATE:
return GDMonoClassMember::PRIVATE; return IMonoClassMember::PRIVATE;
case MONO_METHOD_ATTR_FAM_AND_ASSEM: case MONO_METHOD_ATTR_FAM_AND_ASSEM:
return GDMonoClassMember::PROTECTED_AND_INTERNAL; return IMonoClassMember::PROTECTED_AND_INTERNAL;
case MONO_METHOD_ATTR_ASSEM: case MONO_METHOD_ATTR_ASSEM:
return GDMonoClassMember::INTERNAL; return IMonoClassMember::INTERNAL;
case MONO_METHOD_ATTR_FAMILY: case MONO_METHOD_ATTR_FAMILY:
return GDMonoClassMember::PROTECTED; return IMonoClassMember::PROTECTED;
case MONO_METHOD_ATTR_PUBLIC: case MONO_METHOD_ATTR_PUBLIC:
return GDMonoClassMember::PUBLIC; return IMonoClassMember::PUBLIC;
default: default:
ERR_FAIL_V(GDMonoClassMember::PRIVATE); ERR_FAIL_V(IMonoClassMember::PRIVATE);
} }
} }

View File

@@ -35,7 +35,7 @@
#include "gd_mono_class_member.h" #include "gd_mono_class_member.h"
#include "gd_mono_header.h" #include "gd_mono_header.h"
class GDMonoProperty : public GDMonoClassMember { class GDMonoProperty : public IMonoClassMember {
GDMonoClass *owner; GDMonoClass *owner;
MonoProperty *mono_property; MonoProperty *mono_property;
@@ -47,15 +47,15 @@ class GDMonoProperty : public GDMonoClassMember {
MonoCustomAttrInfo *attributes; MonoCustomAttrInfo *attributes;
public: public:
virtual MemberType get_member_type() { return MEMBER_TYPE_PROPERTY; } virtual MemberType get_member_type() GD_FINAL { return MEMBER_TYPE_PROPERTY; }
virtual StringName get_name() { return name; } virtual StringName get_name() GD_FINAL { return name; }
virtual bool is_static(); virtual bool is_static() GD_FINAL;
virtual Visibility get_visibility(); virtual Visibility get_visibility() GD_FINAL;
virtual bool has_attribute(GDMonoClass *p_attr_class); virtual bool has_attribute(GDMonoClass *p_attr_class) GD_FINAL;
virtual MonoObject *get_attribute(GDMonoClass *p_attr_class); virtual MonoObject *get_attribute(GDMonoClass *p_attr_class) GD_FINAL;
void fetch_attributes(); void fetch_attributes();
bool has_getter(); bool has_getter();

View File

@@ -565,7 +565,7 @@ void debug_send_unhandled_exception_error(MonoException *p_exc) {
if (unexpected_exc) { if (unexpected_exc) {
GDMonoInternals::unhandled_exception(unexpected_exc); GDMonoInternals::unhandled_exception(unexpected_exc);
_UNREACHABLE_(); GD_UNREACHABLE();
} }
Vector<ScriptLanguage::StackInfo> _si; Vector<ScriptLanguage::StackInfo> _si;
@@ -604,7 +604,7 @@ void debug_unhandled_exception(MonoException *p_exc) {
ScriptDebugger::get_singleton()->idle_poll(); ScriptDebugger::get_singleton()->idle_poll();
#endif #endif
GDMonoInternals::unhandled_exception(p_exc); // prints the exception as well GDMonoInternals::unhandled_exception(p_exc); // prints the exception as well
_UNREACHABLE_(); GD_UNREACHABLE();
} }
void print_unhandled_exception(MonoException *p_exc) { void print_unhandled_exception(MonoException *p_exc) {
@@ -615,7 +615,7 @@ void set_pending_exception(MonoException *p_exc) {
#ifdef HAS_PENDING_EXCEPTIONS #ifdef HAS_PENDING_EXCEPTIONS
if (get_runtime_invoke_count() == 0) { if (get_runtime_invoke_count() == 0) {
debug_unhandled_exception(p_exc); debug_unhandled_exception(p_exc);
_UNREACHABLE_(); GD_UNREACHABLE();
} }
if (!mono_runtime_set_pending_exception(p_exc, false)) { if (!mono_runtime_set_pending_exception(p_exc, false)) {
@@ -624,7 +624,7 @@ void set_pending_exception(MonoException *p_exc) {
} }
#else #else
debug_unhandled_exception(p_exc); debug_unhandled_exception(p_exc);
_UNREACHABLE_(); GD_UNREACHABLE();
#endif #endif
} }

View File

@@ -44,7 +44,7 @@
#define UNLIKELY_UNHANDLED_EXCEPTION(m_exc) \ #define UNLIKELY_UNHANDLED_EXCEPTION(m_exc) \
if (unlikely(m_exc != NULL)) { \ if (unlikely(m_exc != NULL)) { \
GDMonoUtils::debug_unhandled_exception(m_exc); \ GDMonoUtils::debug_unhandled_exception(m_exc); \
_UNREACHABLE_(); \ GD_UNREACHABLE(); \
} }
namespace GDMonoUtils { namespace GDMonoUtils {
@@ -214,7 +214,7 @@ void set_exception_message(MonoException *p_exc, String message);
void debug_print_unhandled_exception(MonoException *p_exc); void debug_print_unhandled_exception(MonoException *p_exc);
void debug_send_unhandled_exception_error(MonoException *p_exc); void debug_send_unhandled_exception_error(MonoException *p_exc);
_NO_RETURN_ void debug_unhandled_exception(MonoException *p_exc); GD_NORETURN void debug_unhandled_exception(MonoException *p_exc);
void print_unhandled_exception(MonoException *p_exc); void print_unhandled_exception(MonoException *p_exc);
/** /**

View File

@@ -31,39 +31,57 @@
#ifndef UTIL_MACROS_H #ifndef UTIL_MACROS_H
#define UTIL_MACROS_H #define UTIL_MACROS_H
#define _GD_VARNAME_CONCAT_B(m_ignore, m_name) m_name #ifndef __has_cpp_attribute
#define _GD_VARNAME_CONCAT_A(m_a, m_b, m_c) _GD_VARNAME_CONCAT_B(hello there, m_a##m_b##m_c) #define __has_cpp_attribute(attr_token) 0
#define _GD_VARNAME_CONCAT(m_a, m_b, m_c) _GD_VARNAME_CONCAT_A(m_a, m_b, m_c) #endif
#define GD_UNIQUE_NAME(m_name) _GD_VARNAME_CONCAT(m_name, _, __COUNTER__)
// noreturn #define _GD_VARNAME_CONCAT_B_(m_ignore, m_name) m_name
#define _GD_VARNAME_CONCAT_A_(m_a, m_b, m_c) _GD_VARNAME_CONCAT_B_(hello there, m_a##m_b##m_c)
#define _GD_VARNAME_CONCAT_(m_a, m_b, m_c) _GD_VARNAME_CONCAT_A_(m_a, m_b, m_c)
#define GD_UNIQUE_NAME(m_name) _GD_VARNAME_CONCAT_(m_name, _, __COUNTER__)
#if __cpp_static_assert // static assert
// TODO: Get rid of this macro once we upgrade to C++11
#ifdef __cpp_static_assert
#define GD_STATIC_ASSERT(m_cond) static_assert((m_cond), "Condition '" #m_cond "' failed") #define GD_STATIC_ASSERT(m_cond) static_assert((m_cond), "Condition '" #m_cond "' failed")
#else #else
#define GD_STATIC_ASSERT(m_cond) typedef int GD_UNIQUE_NAME(godot_static_assert)[((m_cond) ? 1 : -1)] #define GD_STATIC_ASSERT(m_cond) typedef int GD_UNIQUE_NAME(godot_static_assert)[((m_cond) ? 1 : -1)]
#endif #endif
#undef _NO_RETURN_ // final
// TODO: Get rid of this macro once we upgrade to C++11
#ifdef __GNUC__ #if (__cplusplus >= 201103L)
#define _NO_RETURN_ __attribute__((noreturn)) #define GD_FINAL final
#elif _MSC_VER
#define _NO_RETURN_ __declspec(noreturn)
#else #else
#error Platform or compiler not supported #define GD_FINAL
#endif
// noreturn
// TODO: Get rid of this macro once we upgrade to C++11
#if __has_cpp_attribute(deprecated)
#define GD_NORETURN [[noreturn]]
#elif defined(__GNUC__)
#define GD_NORETURN __attribute__((noreturn))
#elif defined(_MSC_VER)
#define GD_NORETURN __declspec(noreturn)
#else
#define GD_NORETURN
#pragma message "Macro GD_NORETURN will have no effect"
#endif #endif
// unreachable // unreachable
#if defined(_MSC_VER) #if defined(_MSC_VER)
#define _UNREACHABLE_() __assume(0) #define GD_UNREACHABLE() __assume(0)
#elif defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 #elif defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 405
#define _UNREACHABLE_() __builtin_unreachable() #define GD_UNREACHABLE() __builtin_unreachable()
#else #else
#define _UNREACHABLE_() \ #define GD_UNREACHABLE() \
CRASH_NOW(); \ CRASH_NOW(); \
do { \ do { \
} while (true); } while (true);
#endif #endif

View File

@@ -30,10 +30,10 @@
#include "osx_utils.h" #include "osx_utils.h"
#include "core/print_string.h"
#ifdef OSX_ENABLED #ifdef OSX_ENABLED
#include "core/print_string.h"
#include <CoreFoundation/CoreFoundation.h> #include <CoreFoundation/CoreFoundation.h>
#include <CoreServices/CoreServices.h> #include <CoreServices/CoreServices.h>