Sfoglia il codice sorgente

[flash] lowercase the first letter in package when loading classes from SWF (closes #8129)

Dan Korostelev 6 anni fa
parent
commit
58764386b1
1 ha cambiato i file con 29 aggiunte e 2 eliminazioni
  1. 29 2
      src/codegen/swfLoader.ml

+ 29 - 2
src/codegen/swfLoader.ml

@@ -23,6 +23,22 @@ open Common
 open Globals
 open Ast
 
+let lowercase_pack pack =
+	let rec loop acc pack =
+		match pack with
+		| [] -> List.rev acc
+		| name :: rest ->
+			let name =
+				let fchar = String.get name 0 in
+				if fchar >= 'A' && fchar <= 'Z' then
+					(String.make 1 (Char.lowercase fchar)) ^ String.sub name 1 (String.length name - 1)
+				else
+					name
+			in
+			loop (name :: acc) rest
+	in
+	loop [] pack
+
 let rec make_tpath = function
 	| HMPath (pack,name) ->
 		let pdyn = ref false in
@@ -42,7 +58,7 @@ let rec make_tpath = function
 			| [] , "Namespace" -> ["flash";"utils"], "Namespace"
 			| [] , "RegExp" -> ["flash";"utils"], "RegExp"
 			| ["__AS3__";"vec"] , "Vector" -> ["flash"], "Vector"
-			| _ -> pack, name
+			| _ -> lowercase_pack pack, name
 		in
 		{
 			tpackage = pack;
@@ -348,11 +364,22 @@ let build_class com c file =
 		(path.tpackage, [(EEnum enum_data,pos)])
 	with Exit ->
 	let flags = if c.hlc_final && List.exists (fun f -> fst f.cff_name <> "new" && not (List.mem_assoc AStatic f.cff_access)) fields then HFinal :: flags else flags in
+
+	let meta =
+		(* if the package was lowercased, add @:native("Original.Path") meta *)
+		match c.hlc_name with
+		| HMPath (pack,name) when pack <> path.tpackage ->
+			let native_path = (String.concat "." pack) ^ "." ^ name in
+			[(Meta.Native,[(EConst (String native_path), pos)],pos)]
+		| _ ->
+			[]
+	in
+
 	let class_data = {
 		d_name = path.tname,null_pos;
 		d_doc = None;
 		d_params = [];
-		d_meta = [];
+		d_meta = meta;
 		d_flags = flags;
 		d_data = fields;
 	} in