Jelajahi Sumber

Fix lua String with `no-inline` (#11057)

* Hide lua String inlines

* Patch string metatable

* Fix both inline modes

* Okay, real fix time
RblSb 2 tahun lalu
induk
melakukan
341371dcb6

+ 3 - 0
src/generators/genlua.ml

@@ -1197,6 +1197,9 @@ and gen_value ctx e =
         gen_expr ctx e
     | TMeta (_,e1) ->
         gen_value ctx e1
+    | TCall ({eexpr = (TField (e, (FInstance _ as s)))}, el) when (is_string_expr e) ->
+        spr ctx ("String.prototype." ^ (field_name s));
+        gen_paren_arguments ctx (e :: el)
     | TCall (e,el) ->
         gen_call ctx e el
     | TReturn _

+ 7 - 7
std/lua/_std/String.hx

@@ -62,7 +62,7 @@ class String {
 	public inline function toLowerCase():String
 		return BaseString.lower(this);
 
-	public inline function indexOf(str:String, ?startIndex:Int):Int {
+	public function indexOf(str:String, ?startIndex:Int):Int {
 		if (startIndex == null)
 			startIndex = 1;
 		else
@@ -86,7 +86,7 @@ class String {
 		return startIndex > length ? length : startIndex;
 	}
 
-	public inline function lastIndexOf(str:String, ?startIndex:Int):Int {
+	public function lastIndexOf(str:String, ?startIndex:Int):Int {
 		var ret = -1;
 		if (startIndex == null)
 			startIndex = length;
@@ -99,11 +99,11 @@ class String {
 		return ret;
 	}
 
-	public inline function split(delimiter:String):Array<String> {
-		var idx = 1;
+	public function split(delimiter:String):Array<String> {
+		var idx:Null<Int> = 1;
 		var ret = [];
 		while (idx != null) {
-			var newidx = 0;
+			var newidx:Null<Int> = 0;
 			if (delimiter.length > 0) {
 				newidx = BaseString.find(this, delimiter, idx, true).begin;
 			} else if (idx >= this.length) {
@@ -128,7 +128,7 @@ class String {
 		return this;
 	}
 
-	public inline function substring(startIndex:Int, ?endIndex:Int):String {
+	public function substring(startIndex:Int, ?endIndex:Int):String {
 		if (endIndex == null)
 			endIndex = this.length;
 		if (endIndex < 0)
@@ -151,7 +151,7 @@ class String {
 		return BaseString.byte(this, index + 1);
 	}
 
-	public inline function substr(pos:Int, ?len:Int):String {
+	public function substr(pos:Int, ?len:Int):String {
 		if (len == null || len > pos + this.length)
 			len = this.length;
 		else if (len < 0)

+ 21 - 0
tests/misc/lua/projects/Issue9530/Main.hx

@@ -0,0 +1,21 @@
+using StringTools;
+
+@:nullSafety(Strict)
+class Main {
+	static var f = "field";
+	static function main() {
+		final sclass = new String("foo");
+		final scl = sclass.toUpperCase();
+		trace(scl);
+		final f2 = f.toUpperCase();
+		trace(f2);
+		final str = "str".toUpperCase();
+		trace(str);
+		final isS = "sss".startsWith("s");
+		trace(isS);
+		// test internal static call
+		final i = "foo".indexOf("");
+		trace(i);
+		trace(("dyn" : Dynamic).toUpperCase());
+	}
+}

+ 4 - 0
tests/misc/lua/projects/Issue9530/compile.hxml

@@ -0,0 +1,4 @@
+-main Main
+-lua bin/test.lua
+--cmd lua bin/test.lua
+-D no-inline

+ 6 - 0
tests/misc/lua/projects/Issue9530/compile.hxml.stdout

@@ -0,0 +1,6 @@
+Main.hx:9: FOO
+Main.hx:11: FIELD
+Main.hx:13: STR
+Main.hx:15: true
+Main.hx:18: 0
+Main.hx:19: DYN

+ 2 - 1
tests/unit/.vscode/settings.json

@@ -4,6 +4,7 @@
 		{"label": "JavaScript", "args": ["compile-js.hxml", "-cmd", "node -e \"require('./bin/unit.js').unit.TestMain.main()\""]},
 		{"label": "JVM", "args": ["compile-jvm-only.hxml", "-cmd", "java -jar bin/unit.jar"]},
 		{"label": "Interp", "args": ["compile-macro.hxml"]},
+		{"label": "Lua", "args": ["compile-lua.hxml", "-cmd", "lua bin/unit.lua"]},
 	],
 	"[haxe]": {
 		"editor.formatOnSave": true,
@@ -16,4 +17,4 @@
 		"arguments": ["-v"]
 	},
 	"haxe.enableCompilationServer": false
-}
+}