From 63c2b9d474784447d01cb4c90aabdfd3ab5e373c Mon Sep 17 00:00:00 2001 From: Karroffel Date: Wed, 5 Apr 2017 17:16:47 +0200 Subject: [PATCH] new macros for entry points, virtual method fix --- binding_generator/src/main.rs | 95 +++++++++++++++++++++-------------- include/godot_cpp/Godot.hpp | 14 ++++++ 2 files changed, 70 insertions(+), 39 deletions(-) diff --git a/binding_generator/src/main.rs b/binding_generator/src/main.rs index 3b49a8b6..cd62c7c1 100644 --- a/binding_generator/src/main.rs +++ b/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,52 +425,69 @@ fn generate_class_implementation(icalls: &mut HashSet<(String, Vec)>, 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 "; } + + 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(); + + fn get_icall_type_name(t: &String) -> String { + if is_core_type(t) || is_primitive(t) { + t.clone() + } else { + "Object".to_string() + } + } + + for arg in &method.arguments { + args.push(get_icall_type_name(&arg._type)); + } + + 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); + } + + // if !is_primitive(&method.return_type) && !is_core_type(&method.return_type) { + // contents = contents + ")"; + // } + contents = contents + ");\n"; } - for arg in &method.arguments { - args.push(get_icall_type_name(&arg._type)); - } - - 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); - } - - // if !is_primitive(&method.return_type) && !is_core_type(&method.return_type) { - // contents = contents + ")"; - // } - contents = contents + ");\n"; - contents = contents + "}\n\n"; } diff --git a/include/godot_cpp/Godot.hpp b/include/godot_cpp/Godot.hpp index e2a9fe18..80715b8f 100644 --- a/include/godot_cpp/Godot.hpp +++ b/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; } \