소스 검색

[GDNative] explicit calling convention

Karroffel 8 년 전
부모
커밋
d4f4f14c68
2개의 변경된 파일29개의 추가작업 그리고 15개의 파일을 삭제
  1. 0 1
      modules/gdnative/gdnative.cpp
  2. 29 14
      modules/gdnative/godot.h

+ 0 - 1
modules/gdnative/gdnative.cpp

@@ -424,7 +424,6 @@ Variant GDNativeScript::_new(const Variant **p_args, int p_argcount, Variant::Ca
 	// @Todo support varargs for constructors.
 	GDNativeInstance *instance = (GDNativeInstance *)instance_create(owner);
 
-	owner->set_script(Ref<GDNativeScript>(this).get_ref_ptr());
 	owner->set_script_instance(instance);
 	if (!instance) {
 		if (ref.is_null()) {

+ 29 - 14
modules/gdnative/godot.h

@@ -38,12 +38,26 @@ extern "C" {
 #define GDAPI_EXPORT
 #endif
 
-#if !defined(_WIN32) && !defined(_MSC_VER)
+#ifdef _WIN32
+#if defined(GDAPI_EXPORT)
+#define GDCALLINGCONV __cdecl
+#define GDAPI __declspec(dllexport) GDCALLINGCONV
+#else
+#define GDCALLINGCONV __cdecl
+#define GDAPI __declspec(dllimport) GDCALLINGCONV
+#endif
+#elif defined(__APPLE__)
+#include "TargetConditionals.h"
+#if TARGET_OS_IPHONE
+#define GDCALLINGCONV
 #define GDAPI
-#elif defined(GDAPI_EXPORT)
-#define GDAPI __declspec(dllexport)
+#elif TARGET_OS_MAC
+#define GDCALLINGCONV __attribute__((sysv_abi))
+#define GDAPI GDCALLINGCONV
+#endif
 #else
-#define GDAPI __declspec(dllimport)
+#define GDCALLINGCONV __attribute__((sysv_abi))
+#define GDAPI GDCALLINGCONV
 #endif
 
 #include <stdbool.h>
@@ -314,16 +328,16 @@ typedef struct godot_property_attributes {
 
 typedef struct godot_instance_create_func {
 	// instance pointer, method_data - return user data
-	void *(*create_func)(godot_object *, void *);
+	GDCALLINGCONV void *(*create_func)(godot_object *, void *);
 	void *method_data;
-	void (*free_func)(void *);
+	GDCALLINGCONV void (*free_func)(void *);
 } godot_instance_create_func;
 
 typedef struct godot_instance_destroy_func {
 	// instance pointer, method data, user data
-	void (*destroy_func)(godot_object *, void *, void *);
+	GDCALLINGCONV void (*destroy_func)(godot_object *, void *, void *);
 	void *method_data;
-	void (*free_func)(void *);
+	GDCALLINGCONV void (*free_func)(void *);
 } godot_instance_destroy_func;
 
 void GDAPI godot_script_register_class(const char *p_name, const char *p_base, godot_instance_create_func p_create_func, godot_instance_destroy_func p_destroy_func);
@@ -332,25 +346,25 @@ void GDAPI godot_script_register_tool_class(const char *p_name, const char *p_ba
 
 typedef struct godot_instance_method {
 	// instance pointer, method data, user data, num args, args - return result as varaint
-	godot_variant (*method)(godot_object *, void *, void *, int, godot_variant **);
+	GDCALLINGCONV godot_variant (*method)(godot_object *, void *, void *, int, godot_variant **);
 	void *method_data;
-	void (*free_func)(void *);
+	GDCALLINGCONV void (*free_func)(void *);
 } godot_instance_method;
 
 void GDAPI godot_script_register_method(const char *p_name, const char *p_function_name, godot_method_attributes p_attr, godot_instance_method p_method);
 
 typedef struct godot_property_set_func {
 	// instance pointer, method data, user data, value
-	void (*set_func)(godot_object *, void *, void *, godot_variant);
+	GDCALLINGCONV void (*set_func)(godot_object *, void *, void *, godot_variant);
 	void *method_data;
-	void (*free_func)(void *);
+	GDCALLINGCONV void (*free_func)(void *);
 } godot_property_set_func;
 
 typedef struct godot_property_get_func {
 	// instance pointer, method data, user data, value
-	godot_variant (*get_func)(godot_object *, void *, void *);
+	GDCALLINGCONV godot_variant (*get_func)(godot_object *, void *, void *);
 	void *method_data;
-	void (*free_func)(void *);
+	GDCALLINGCONV void (*free_func)(void *);
 } godot_property_get_func;
 
 void GDAPI godot_script_register_property(const char *p_name, const char *p_path, godot_property_attributes *p_attr, godot_property_set_func p_set_func, godot_property_get_func p_get_func);
@@ -376,6 +390,7 @@ void GDAPI godot_script_register_signal(const char *p_name, const godot_signal *
 
 void GDAPI *godot_native_get_userdata(godot_object *p_instance);
 
+// Calling convention?
 typedef godot_object *(*godot_class_constructor)();
 
 godot_class_constructor GDAPI godot_get_class_constructor(const char *p_classname);