Browse Source

new macros for entry points, virtual method fix

Karroffel 8 years ago
parent
commit
63c2b9d474
2 changed files with 62 additions and 31 deletions
  1. 48 31
      binding_generator/src/main.rs
  2. 14 0
      include/godot_cpp/Godot.hpp

+ 48 - 31
binding_generator/src/main.rs

@@ -270,7 +270,7 @@ fn generate_class_header(used_classes: &HashSet<&String>, class: &GodotClass) ->
 	}
 
 	for method in &class.methods {
-		contents = contents + "\t" + (if class.singleton { "static " } else if method.is_virtual { "virtual " } else { "" }) + strip_name(&method.return_type) + (if !is_core_type(&method.return_type) && !is_primitive(&method.return_type) { " *" } else { " " }) + escape_cpp(&method.name) + "(";
+		contents = contents + "\t" + (if class.singleton { "static " } else { "" }) + strip_name(&method.return_type) + (if !is_core_type(&method.return_type) && !is_primitive(&method.return_type) { " *" } else { " " }) + escape_cpp(&method.name) + "(";
 
 		let mut has_default = false;
 
@@ -425,51 +425,68 @@ fn generate_class_implementation(icalls: &mut HashSet<(String, Vec<String>)>, us
 			contents = contents + "\t}\n\n";
 		}
 
-		contents = contents + "\tstatic godot_method_bind *mb = NULL;\n"
-			+ "\tif (mb == NULL) {\n"
-			+ "\t\tmb = godot_method_bind_get_method(\"" + class.name.as_str() + "\", \"" + method.name.as_str() + "\");\n"
-			+ "\t}\n\t";
+		if method.is_virtual {
 
+			contents = contents + "\tArray __args;\n";
 
-		if method.return_type != "void" {
-			contents = contents + "return ";
-			if !is_primitive(&method.return_type) && !is_core_type(&method.return_type) {
-				contents = contents + "(" + strip_name(&method.return_type) + " *) ";
+			// fill in the args
+			for arg in &method.arguments {
+				contents = contents + "\t__args.append(" + escape_cpp(&arg.name) + ");\n";
 			}
-		}
 
-		let mut args = Vec::new();
+			contents = contents + "\t";
 
-		fn get_icall_type_name(t: &String) -> String {
-			if is_core_type(t) || is_primitive(t) {
-				t.clone()
-			} else {
-				"Object".to_string()
+			if method.return_type != "void" {
+				contents = contents + "return ";
 			}
-		}
 
-		for arg in &method.arguments {
-			args.push(get_icall_type_name(&arg._type));
-		}
+			contents = contents + "((Object *) " + core_obj_name.as_str() + ")->callv(\"" + method.name.as_str() + "\", __args);\n";
+		} else {
+			contents = contents + "\tstatic godot_method_bind *mb = NULL;\n"
+				+ "\tif (mb == NULL) {\n"
+				+ "\t\tmb = godot_method_bind_get_method(\"" + class.name.as_str() + "\", \"" + method.name.as_str() + "\");\n"
+				+ "\t}\n\t";
+
+
+			if method.return_type != "void" {
+				contents = contents + "return ";
+				if !is_primitive(&method.return_type) && !is_core_type(&method.return_type) {
+					contents = contents + "(" + strip_name(&method.return_type) + " *) ";
+				}
+			}
+
+			let mut args = Vec::new();
 
-		let icallsig = (get_icall_type_name(&method.return_type), args);
+			fn get_icall_type_name(t: &String) -> String {
+				if is_core_type(t) || is_primitive(t) {
+					t.clone()
+				} else {
+					"Object".to_string()
+				}
+			}
 
-		let name = get_icall_name(&icallsig);
+			for arg in &method.arguments {
+				args.push(get_icall_type_name(&arg._type));
+			}
 
-		icalls.insert(icallsig);
+			let icallsig = (get_icall_type_name(&method.return_type), args);
 
+			let name = get_icall_name(&icallsig);
 
+			icalls.insert(icallsig);
 
-		contents = contents + name.as_str() + "(mb, (godot_object *) " + core_obj_name.as_str();
 
-		for arg in &method.arguments {
-			contents = contents + ", " + escape_cpp(&arg.name);
-		}
+			contents = contents + name.as_str() + "(mb, (godot_object *) " + core_obj_name.as_str();
 
-		// if !is_primitive(&method.return_type) && !is_core_type(&method.return_type) {
-		// 	contents = contents + ")";
-		// }
-		contents = contents + ");\n";
+			for arg in &method.arguments {
+				contents = contents + ", " + escape_cpp(&arg.name);
+			}
+
+			// if !is_primitive(&method.return_type) && !is_core_type(&method.return_type) {
+			// 	contents = contents + ")";
+			// }
+			contents = contents + ");\n";
+		}
 
 		contents = contents + "}\n\n";
 	}

+ 14 - 0
include/godot_cpp/Godot.hpp

@@ -12,6 +12,20 @@
 namespace godot {
 
 
+
+
+#if !defined(_WIN32)
+#define GD_EXPORT
+#else
+#define GD_EXPORT __declspec(dllexport)
+#endif
+
+
+#define GODOT_DLSCRIPT_INIT(arg) extern "C" void GD_EXPORT godot_dlscript_init(arg)
+#define GODOT_DLSCRIPT_TERMINATE(arg) extern "C" void GD_EXPORT godot_dlscript_terminate(arg)
+
+
+
 #define GODOT_CLASS(Name, Base) \
 	public: inline static char *___get_type_name() { return (char *) #Name; } \
 	inline static char *___get_base_type_name() { return (char *) #Base; } \