ソースを参照

[netlib] ArrayAccess for [] overloads

Caue Waneck 12 年 前
コミット
1980d2178e
2 ファイル変更38 行追加7 行削除
  1. 37 6
      gencs.ml
  2. 1 1
      libs

+ 37 - 6
gencs.ml

@@ -2556,6 +2556,14 @@ let mk_type_path ctx path params =
     tsub = sub;
   }
 
+let raw_type_path ctx path params =
+	{
+		tpackage = fst path;
+		Ast.tname = snd path;
+		tparams = params;
+		tsub = None;
+	}
+
 let rec convert_signature ctx p = function
 	| LVoid ->
 		mk_type_path ctx ([],[],"Void") []
@@ -2713,8 +2721,9 @@ let convert_ilmethod ctx p m =
 	in
 	if PMap.mem "net_loader_debug" ctx.ncom.defines then
 		Printf.printf "\tname %s : %s\n" cff_name (IlMetaDebug.ilsig_s m.msig.ssig);
+	let is_static = ref false in
 	let acc, is_final = List.fold_left (fun (acc,is_final) -> function
-		| CMStatic when cff_name <> "new" -> AStatic :: acc, is_final
+		| CMStatic when cff_name <> "new" -> is_static := true; AStatic :: acc, is_final
 		| CMVirtual when is_final = None -> acc, Some false
 		| CMFinal -> acc, Some true
 		| _ -> acc, is_final
@@ -2732,6 +2741,19 @@ let convert_ilmethod ctx p m =
 	(* 	meta *)
 	(* in *)
 
+	let rec change_sig = function
+		| LManagedPointer s -> LManagedPointer (change_sig s)
+		| LPointer s -> LPointer (change_sig s)
+		| LValueType (p,pl) -> LValueType(p, List.map change_sig pl)
+		| LClass (p,pl) -> LClass(p, List.map change_sig pl)
+		| LTypeParam i -> LObject
+		| LVector s -> LVector (change_sig s)
+		| LArray (s,a) -> LArray (change_sig s, a)
+		| LMethod (c,r,args) -> LMethod (c, change_sig r, List.map change_sig args)
+		| p -> p
+	in
+	let change_sig = if !is_static then change_sig else (fun s -> s) in
+
 	let ret =
 		if String.length cff_name > 4 && String.sub cff_name 0 4 = "set_" then
 			match m.mret.snorm, m.margs with
@@ -2748,7 +2770,7 @@ let convert_ilmethod ctx p m =
 				| LManagedPointer s ->
 					mk_type_path ctx (["cs"],[],"Ref") [ TPType (convert_signature ctx p s) ]
 				| _ ->
-					convert_signature ctx p s.snorm
+					convert_signature ctx p (change_sig s.snorm)
 			in
 			let t = if List.mem PIn flag.pf_io then
 					mk_type_path ctx (["cs"],[],"Ref") [ TPType t ]
@@ -2759,7 +2781,7 @@ let convert_ilmethod ctx p m =
 			in
 			name,false,Some t,None) m.margs
 		in
-		let ret = convert_signature ctx p ret in
+		let ret = convert_signature ctx p (change_sig ret) in
 		let types = List.map (fun t ->
 			{
 				tp_name = "M" ^ string_of_int t.tnumber;
@@ -2900,8 +2922,17 @@ let convert_ilclass ctx p ilcls = match ilcls.csuper with
 						HImplements (get_type_path ctx (convert_signature ctx p i)) :: !flags
 			) ilcls.cimplements;
 
-			let fields = ref [] in
+			(* ArrayAccess *)
+			ignore (List.exists (function
+			| { psig = { snorm = LMethod(_,ret,[v]) } } ->
+				flags := if !is_interface then
+					(HExtends( raw_type_path ctx ([],"ArrayAccess") [ TPType (convert_signature ctx p ret) ]) :: !flags)
+				else
+					(HImplements( raw_type_path ctx ([],"ArrayAccess") [ TPType (convert_signature ctx p ret) ]) :: !flags);
+				true
+			| _ -> false) ilcls.cprops);
 
+			let fields = ref [] in
 			let run_fields fn f =
 				List.iter (fun f ->
 					try
@@ -3240,8 +3271,8 @@ let before_generate com =
 	let net_ver = try
 			int_of_string (PMap.find "net_ver" com.defines)
 		with | Not_found ->
-			Common.define_value com Define.NetVer "40";
-			40
+			Common.define_value com Define.NetVer "20";
+			20
 	in
 	if net_ver < 20 then
 		failwith (

+ 1 - 1
libs

@@ -1 +1 @@
-Subproject commit 8293b99822096b8cd593a6aadb4d00383a5422eb
+Subproject commit d651e94617221279192d65c5caaa4ce29b43da93