From 86531354a004f0c80352ee53e9f67dabeab5af65 Mon Sep 17 00:00:00 2001 From: Joshua Granick Date: Mon, 31 Aug 2015 10:00:16 -0700 Subject: [PATCH] Support default parameters in CFFI meta --- lime/_backend/native/NativeApplication.hx | 28 ++++++------ lime/system/CFFI.hx | 52 ++++++++++++++++------- 2 files changed, 50 insertions(+), 30 deletions(-) diff --git a/lime/_backend/native/NativeApplication.hx b/lime/_backend/native/NativeApplication.hx index 24e307389..ad5f23d35 100644 --- a/lime/_backend/native/NativeApplication.hx +++ b/lime/_backend/native/NativeApplication.hx @@ -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; } diff --git a/lime/system/CFFI.hx b/lime/system/CFFI.hx index ceaf009c0..0b517bb42 100644 --- a/lime/system/CFFI.hx +++ b/lime/system/CFFI.hx @@ -20,7 +20,7 @@ using haxe.macro.Tools; #if macro - public static function build ():Array { + public static function build (defaultLibrary:String = "lime"):Array { 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); }