Support default parameters in CFFI meta

This commit is contained in:
Joshua Granick
2015-08-31 10:00:16 -07:00
parent 29dcfff768
commit 86531354a0
2 changed files with 50 additions and 30 deletions

View File

@@ -497,20 +497,20 @@ class NativeApplication {
}
@:cffi("lime", "lime_application_create") private static function lime_application_create (config:Dynamic):Float;
@:cffi("lime", "lime_application_event_manager_register") private static function lime_application_event_manager_register (callback:Dynamic, eventObject:Dynamic):Void;
@:cffi("lime", "lime_application_exec") private static function lime_application_exec (handle:Float):Int;
@:cffi("lime", "lime_application_init") private static function lime_application_init (handle:Float):Void;
@:cffi("lime", "lime_application_quit") private static function lime_application_quit (handle:Float):Int;
@:cffi("lime", "lime_application_set_frame_rate") private static function lime_application_set_frame_rate (handle:Float, value:Float):Void;
@:cffi("lime", "lime_application_update") private static function lime_application_update (handle:Float):Bool;
@:cffi("lime", "lime_gamepad_event_manager_register") private static function lime_gamepad_event_manager_register (callback:Dynamic, eventObject:Dynamic):Void;
@:cffi("lime", "lime_key_event_manager_register") private static function lime_key_event_manager_register (callback:Dynamic, eventObject:Dynamic):Void;
@:cffi("lime", "lime_mouse_event_manager_register") private static function lime_mouse_event_manager_register (callback:Dynamic, eventObject:Dynamic):Void;
@:cffi("lime", "lime_render_event_manager_register") private static function lime_render_event_manager_register (callback:Dynamic, eventObject:Dynamic):Void;
@:cffi("lime", "lime_text_event_manager_register") private static function lime_text_event_manager_register (callback:Dynamic, eventObject:Dynamic):Void;
@:cffi("lime", "lime_touch_event_manager_register") private static function lime_touch_event_manager_register (callback:Dynamic, eventObject:Dynamic):Void;
@:cffi("lime", "lime_window_event_manager_register") private static function lime_window_event_manager_register (callback:Dynamic, eventObject:Dynamic):Void;
@:cffi private static function lime_application_create (config:Dynamic):Float;
@:cffi private static function lime_application_event_manager_register (callback:Dynamic, eventObject:Dynamic):Void;
@:cffi private static function lime_application_exec (handle:Float):Int;
@:cffi private static function lime_application_init (handle:Float):Void;
@:cffi private static function lime_application_quit (handle:Float):Int;
@:cffi private static function lime_application_set_frame_rate (handle:Float, value:Float):Void;
@:cffi private static function lime_application_update (handle:Float):Bool;
@:cffi private static function lime_gamepad_event_manager_register (callback:Dynamic, eventObject:Dynamic):Void;
@:cffi private static function lime_key_event_manager_register (callback:Dynamic, eventObject:Dynamic):Void;
@:cffi private static function lime_mouse_event_manager_register (callback:Dynamic, eventObject:Dynamic):Void;
@:cffi private static function lime_render_event_manager_register (callback:Dynamic, eventObject:Dynamic):Void;
@:cffi private static function lime_text_event_manager_register (callback:Dynamic, eventObject:Dynamic):Void;
@:cffi private static function lime_touch_event_manager_register (callback:Dynamic, eventObject:Dynamic):Void;
@:cffi private static function lime_window_event_manager_register (callback:Dynamic, eventObject:Dynamic):Void;
}

View File

@@ -20,7 +20,7 @@ using haxe.macro.Tools;
#if macro
public static function build ():Array<Field> {
public static function build (defaultLibrary:String = "lime"):Array<Field> {
var pos = Context.currentPos ();
var fields = Context.getBuildFields ();
@@ -34,7 +34,31 @@ using haxe.macro.Tools;
for (m in meta) {
if (m.name == ":cffi" && m.params.length >= 2) {
if (m.name == ":cffi") {
var library = null;
var method = null;
var lazy = false;
if (Reflect.hasField (m, "params")) {
if (m.params.length > 0) library = m.params[0].getValue ();
if (m.params.length > 1) method = m.params[1].getValue ();
if (m.params.length > 2) lazy = m.params[2].getValue ();
}
if (library == null || library == "") {
library = defaultLibrary;
}
if (method == null || method == "") {
method = field.name;
}
var typeArgs = [];
@@ -47,37 +71,33 @@ using haxe.macro.Tools;
var type = getFunctionType (typeArgs, fun.ret.toType ());
var typeString = type.string;
var library = m.params[0].getValue ();
var method = m.params[1].getValue ();
var lazy = (m.params.length > 2) ? m.params[2].getValue () : false;
var expr = 'new lime.system.CFFI<$typeString> ("$library", "$method", $lazy)';
var name = "cffi_" + field.name;
var cffiExpr = 'new lime.system.CFFI<$typeString> ("$library", "$method", $lazy)';
var cffiName = "cffi_" + field.name;
var cffiType = TPath ( { pack: [ "lime", "system" ], name: "CFFI", params: [ TPType (TFun (type.args, type.result).toComplexType ()) ] } );
newFields.push ( { name: name, access: [ APrivate, AStatic ], kind: FieldType.FVar (cffiType, Context.parse (expr, pos)), pos: pos } );
newFields.push ( { name: cffiName, access: [ APrivate, AStatic ], kind: FieldType.FVar (cffiType, Context.parse (cffiExpr, pos)), pos: pos } );
var expr = "";
var newExpr = "";
if (type.result.toString () != "Void" && type.result.toString () != "cpp.Void") {
expr = "return ";
newExpr = "return ";
}
expr += '$name.call (';
newExpr += '$cffiName.call (';
for (i in 0...type.args.length) {
if (i > 0) expr += ", ";
expr += type.args[i].name;
if (i > 0) newExpr += ", ";
newExpr += type.args[i].name;
}
expr += ")";
newExpr += ")";
fun.expr = Context.parse (expr, pos);
field.access.push (AInline);
fun.expr = Context.parse (newExpr, pos);
}