new macros for entry points, virtual method fix

pull/7/head
Karroffel 2017-04-05 17:16:47 +02:00
parent 8aaef5a6a2
commit 63c2b9d474
2 changed files with 70 additions and 39 deletions

View File

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

View File

@ -12,6 +12,20 @@
namespace godot { 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) \ #define GODOT_CLASS(Name, Base) \
public: inline static char *___get_type_name() { return (char *) #Name; } \ public: inline static char *___get_type_name() { return (char *) #Name; } \
inline static char *___get_base_type_name() { return (char *) #Base; } \ inline static char *___get_base_type_name() { return (char *) #Base; } \