From 3b115885f18e652ec2f361a12708a24a4cfbbc7e Mon Sep 17 00:00:00 2001 From: player-03 Date: Thu, 16 May 2024 17:40:49 -0400 Subject: [PATCH 1/3] Use `haxelib libpath` when searching for NDLLs. We could fall back to `haxelib path` for very old versions of Haxelib, but most likely even people stuck on Haxe 3 have updated Haxelib. Also, `haxelib path` gave incorrect results in the first place, so falling back wouldn't do any good. --- src/lime/system/CFFI.hx | 42 ++++++++++++++++------------------------- 1 file changed, 16 insertions(+), 26 deletions(-) diff --git a/src/lime/system/CFFI.hx b/src/lime/system/CFFI.hx index fed0f62d4..41e020074 100644 --- a/src/lime/system/CFFI.hx +++ b/src/lime/system/CFFI.hx @@ -207,39 +207,29 @@ class CFFI private static function __findHaxelib(library:String):String { #if (sys && !macro && !html5) + var proc:Process; try { - var proc = new Process("haxelib", ["path", library]); + proc = new Process("haxelib", ["libpath", library]); + if (proc == null) return ""; + } catch (e:Dynamic) {} - if (proc != null) - { - var stream = proc.stdout; + var stream = proc.stdout; + var path:String = ""; - try - { - while (true) - { - var s = stream.readLine(); + try + { + path = stream.readLine(); + __loaderTrace("Found haxelib " + path); + } catch (e:Dynamic) {} - if (s.substr(0, 1) != "-") - { - stream.close(); - proc.close(); - __loaderTrace("Found haxelib " + s); - return s; - } - } - } - catch (e:Dynamic) {} - - stream.close(); - proc.close(); - } - } - catch (e:Dynamic) {} - #end + stream.close(); + proc.close(); + return path; + #else return ""; + #end } private static function __loaderTrace(message:String) From 4ce0a8302d38f0a618bc5fbd772262f4000419b5 Mon Sep 17 00:00:00 2001 From: player-03 Date: Thu, 16 May 2024 17:46:20 -0400 Subject: [PATCH 2/3] Fix uninitialized variable. --- src/lime/system/CFFI.hx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lime/system/CFFI.hx b/src/lime/system/CFFI.hx index 41e020074..245cee6e8 100644 --- a/src/lime/system/CFFI.hx +++ b/src/lime/system/CFFI.hx @@ -207,12 +207,12 @@ class CFFI private static function __findHaxelib(library:String):String { #if (sys && !macro && !html5) - var proc:Process; + var proc:Process = null; try { proc = new Process("haxelib", ["libpath", library]); - if (proc == null) return ""; } catch (e:Dynamic) {} + if (proc == null) return ""; var stream = proc.stdout; var path:String = ""; From a850b12fa0b40ef38e7d27ca083bb581049a16d5 Mon Sep 17 00:00:00 2001 From: player-03 Date: Fri, 17 May 2024 17:26:35 -0400 Subject: [PATCH 3/3] Replace `__findHaxelib()` with a function that finds Lime's NDLL folder. This is its only use case, so there's no need for an intermediate step of getting the library root. `haxelib path` does return the NDLL folder; the problem with the old implementation of `__findHaxelib()` was it got Lime's source folder instead. --- src/lime/system/CFFI.hx | 44 ++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/src/lime/system/CFFI.hx b/src/lime/system/CFFI.hx index 245cee6e8..b40c7a807 100644 --- a/src/lime/system/CFFI.hx +++ b/src/lime/system/CFFI.hx @@ -155,15 +155,15 @@ class CFFI if (result == null) { - var haxelib = __findHaxelib("lime"); + var ndllFolder = __findNDLLFolder(); - if (haxelib != "") + if (ndllFolder != "") { - result = __tryLoad(haxelib + "/ndll/" + __sysName() + "/" + library, library, method, args); + result = __tryLoad(ndllFolder + __sysName() + "/" + library, library, method, args); if (result == null) { - result = __tryLoad(haxelib + "/ndll/" + __sysName() + "64/" + library, library, method, args); + result = __tryLoad(ndllFolder + __sysName() + "64/" + library, library, method, args); } } } @@ -204,32 +204,30 @@ class CFFI #end } - private static function __findHaxelib(library:String):String + private static function __findNDLLFolder():String { #if (sys && !macro && !html5) - var proc:Process = null; - try - { - proc = new Process("haxelib", ["libpath", library]); - } catch (e:Dynamic) {} - if (proc == null) return ""; - - var stream = proc.stdout; - var path:String = ""; + var process = new Process("haxelib", ["path", "lime"]); try { - path = stream.readLine(); - __loaderTrace("Found haxelib " + path); - } catch (e:Dynamic) {} + while (true) + { + var line = StringTools.trim(process.stdout.readLine()); - stream.close(); - proc.close(); + if (StringTools.startsWith(line, "-L ")) + { + process.close(); + return Path.addTrailingSlash(line.substr(3)); + } + } + } + catch (e:Dynamic) {} - return path; - #else - return ""; + process.close(); #end + + return ""; } private static function __loaderTrace(message:String) @@ -298,7 +296,7 @@ class CFFI } else if (!lazy) { - var ndllFolder = __findHaxelib("lime") + "/ndll/" + __sysName(); + var ndllFolder = __findNDLLFolder() + __sysName(); throw "Could not find lime.ndll. This file is provided with Lime's Haxelib releases, but not via Git. " + "Please copy it from Lime's latest Haxelib release into either " + ndllFolder + " or " + ndllFolder + "64, as appropriate for your system. "