Bläddra i källkod

[java] unit tests-related fixes

Caue Waneck 12 år sedan
förälder
incheckning
5087f30b8f
5 ändrade filer med 30 tillägg och 7 borttagningar
  1. 12 0
      gencommon.ml
  2. 8 1
      genjava.ml
  3. 6 2
      std/java/_std/EReg.hx
  4. 2 2
      std/java/_std/StringBuf.hx
  5. 2 2
      std/java/_std/Type.hx

+ 12 - 0
gencommon.ml

@@ -2310,6 +2310,12 @@ struct
           change_expr (mk_field_access gen obj field obj.epos) (run obj) field (Some (run evalue)) false
         | TBinop(OpAssign, ({eexpr = TField(fexpr, f)}), evalue) when is_dynamic e fexpr (field_name f) ->
           change_expr e (run fexpr) (field_name f) (Some (run evalue)) true
+        | TBinop(OpAssign, { eexpr = TField(fexpr, f) }, evalue) ->
+            (match field_access gen fexpr.etype (field_name f) with
+              | FClassField(_,_,_,cf,false,t) when (try PMap.find cf.cf_name gen.gbase_class_fields == cf with Not_found -> false) ->
+                  change_expr e (run fexpr) (field_name f) (Some (run evalue)) true
+              | _ -> Type.map_expr run e
+            )
 (* #if debug *)
         | TBinop(OpAssignOp op, ({eexpr = TField(fexpr, f)}), evalue) when is_dynamic e fexpr (field_name f) -> assert false (* this case shouldn't happen *)
         | TUnop(Increment, _, ({eexpr = TField( ( { eexpr=TLocal(local) } as fexpr ), f)}))
@@ -4694,6 +4700,8 @@ struct
             (* if it's a var, we will just try to apply the class parameters that have been changed with greal_type_param *)
             let t = apply_params cl.cl_types (gen.greal_type_param (TClassDecl cl) params) (gen.greal_type actual_t) in
             return_var (handle_cast gen { e1 with eexpr = TField(ef, f) } (gen.greal_type e1.etype) (gen.greal_type t))
+          | _ when e = None && (try PMap.find cf.cf_name gen.gbase_class_fields == cf with Not_found -> false) ->
+            return_var (handle_cast gen { e1 with eexpr = TField({ ef with etype = t_dynamic }, f) } e1.etype t_dynamic) (* force dynamic and cast back to needed type *)
           | _ ->
             let ecall = match e with | None -> trace (field_name f); trace cf.cf_name; gen.gcon.error "This field should be called immediately" ef.epos; assert false | Some ecall -> ecall in
             match cf.cf_params with
@@ -6400,6 +6408,10 @@ struct
           mk_class_field (gen.gmk_internal_name "hx" "dynamics_f") (basic.tarray basic.tfloat) false pos (Var { v_read = AccNormal; v_write = AccNormal }) [];
         ] in
 
+        (if cl.cl_path <> (["haxe"; "lang"], "DynamicObject") then
+          List.iter (fun cf -> cf.cf_expr <- Some { eexpr = TArrayDecl([]); etype = cf.cf_type; epos = cf.cf_pos }) new_fields
+        );
+
         let delete = get_delete_field ctx cl true in
         List.iter (fun cf ->
           cl.cl_fields <- PMap.add cf.cf_name cf cl.cl_fields

+ 8 - 1
genjava.ml

@@ -1363,7 +1363,14 @@ let configure gen =
       | Method (MethDynamic) ->
         if not is_interface then begin
           let access, modifiers = get_fun_modifiers cf.cf_meta "public" [] in
-          print w "%s %s%s %s %s;" access (if is_static then "static " else "") (String.concat " " modifiers) (t_s cf.cf_pos (run_follow gen cf.cf_type)) (change_field name)
+          print w "%s %s%s %s %s" access (if is_static then "static " else "") (String.concat " " modifiers) (t_s cf.cf_pos (run_follow gen cf.cf_type)) (change_field name);
+          (match cf.cf_expr with
+            | Some e ->
+                write w " = ";
+                expr_s w e;
+                write w ";"
+            | None -> write w ";"
+          )
         end (* TODO see how (get,set) variable handle when they are interfaces *)
       | Method mkind ->
         let is_virtual = is_new || (not is_final && match mkind with | MethInline -> false | _ when not is_new -> true | _ -> false) in

+ 6 - 2
std/java/_std/EReg.hx

@@ -190,8 +190,12 @@ class EReg {
 		} else {
 			var m = matcher;
 			m.reset(s);
-			m.find();
-			return untyped [s.substring(0, m.start()), s.substring(m.end(), s.length)];
+			if (m.find())
+			{
+				return untyped [s.substring(0, m.start()), s.substring(m.end(), s.length)];
+			} else {
+				return [s];
+			}
 		}
 	}
 

+ 2 - 2
std/java/_std/StringBuf.hx

@@ -38,7 +38,7 @@ class StringBuf {
 	}
 
 	public function addSub( s : String, pos : Int, ?len : Int ) : Void {
-		var l:Int = (len == null) ? s.length : len;
+		var l:Int = (len == null) ? s.length - pos : len;
 		b.append(s, pos, pos + l);
 	}
 
@@ -50,4 +50,4 @@ class StringBuf {
 		return b.toString();
 	}
 
-}
+}

+ 2 - 2
std/java/_std/Type.hx

@@ -34,7 +34,7 @@
 @:keep @:coreApi class Type {
 
 	@:functionCode('
-		if (o instanceof haxe.lang.DynamicObject || o instanceof java.lang.Class)
+		if (o == null || o instanceof haxe.lang.DynamicObject || o instanceof java.lang.Class)
 			return null;
 
 		return (java.lang.Class<T>) o.getClass();
@@ -247,7 +247,7 @@
 	}
 
 	@:functionCode('
-		if (params == null)
+		if (params == null || params.length == 0)
 		{
 			java.lang.Object ret = haxe.lang.Runtime.slowGetField(e, constr, false);
 			if (ret instanceof haxe.lang.Function)