From 2e17ec6c002029e694e3f700653440e5ce55878f Mon Sep 17 00:00:00 2001 From: Simon Krajewski Date: Thu, 1 Feb 2024 11:19:35 +0100 Subject: [PATCH 1/2] [jvm] use HashMap for IntMap too --- std/jvm/_std/haxe/ds/IntMap.hx | 91 ++++++++++++ tests/unit/src/unit/issues/Issue5862.hx | 181 ++++++++++++------------ 2 files changed, 184 insertions(+), 88 deletions(-) create mode 100644 std/jvm/_std/haxe/ds/IntMap.hx diff --git a/std/jvm/_std/haxe/ds/IntMap.hx b/std/jvm/_std/haxe/ds/IntMap.hx new file mode 100644 index 00000000000..9ae196cb388 --- /dev/null +++ b/std/jvm/_std/haxe/ds/IntMap.hx @@ -0,0 +1,91 @@ +/* + * Copyright (C)2005-2019 Haxe Foundation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +package haxe.ds; + +@:coreApi +class IntMap implements haxe.Constraints.IMap { + var hashMap:java.util.HashMap; + + @:overload + public function new():Void { + hashMap = new java.util.HashMap(); + } + + @:overload + function new(hashMap:java.util.HashMap):Void { + this.hashMap = hashMap; + } + + public function set(key:Int, value:T):Void { + hashMap.put(key, value); + } + + public function get(key:Int):Null { + return hashMap.get(key); + } + + public function exists(key:Int):Bool { + return hashMap.containsKey(key); + } + + public function remove(key:Int):Bool { + var has = exists(key); + hashMap.remove(key); + return has; + } + + public inline function keys():Iterator { + return hashMap.keySet().iterator(); + } + + @:runtime public inline function keyValueIterator():KeyValueIterator { + return new haxe.iterators.MapKeyValueIterator(this); + } + + public inline function iterator():Iterator { + return hashMap.values().iterator(); + } + + public function copy():IntMap { + return new IntMap(hashMap.clone()); + } + + public function toString():String { + var s = new StringBuf(); + s.add("["); + var it = keys(); + for (i in it) { + s.add(Std.string(i)); + s.add(" => "); + s.add(Std.string(get(i))); + if (it.hasNext()) + s.add(", "); + } + s.add("]"); + return s.toString(); + } + + public function clear():Void { + hashMap.clear(); + } +} diff --git a/tests/unit/src/unit/issues/Issue5862.hx b/tests/unit/src/unit/issues/Issue5862.hx index 1ff8e731372..5638da7465f 100644 --- a/tests/unit/src/unit/issues/Issue5862.hx +++ b/tests/unit/src/unit/issues/Issue5862.hx @@ -1,4 +1,5 @@ package unit.issues; + import haxe.ds.*; #if java import java.NativeArray; @@ -7,105 +8,109 @@ import cs.NativeArray; #end class Issue5862 extends Test { -#if (java || cs) - public function test() { - var imap = new IntMap(); - imap.set(0, "val1"); - imap.set(1, "val2"); - imap.set(2, "val3"); - imap.set(2, "changed_val3"); + #if (java || cs) + public function test() { + var imap = new IntMap(); + imap.set(0, "val1"); + imap.set(1, "val2"); + imap.set(2, "val3"); + imap.set(2, "changed_val3"); - var v:Vector = cast @:privateAccess imap.vals; - for (i in 0...v.length) { - t(v[i] != "val3"); - } + #if !jvm + var v:Vector = cast @:privateAccess imap.vals; + for (i in 0...v.length) { + t(v[i] != "val3"); + } + #end - var smap = new StringMap(); - smap.set("v1", "val1"); - smap.set("v2", "val2"); - smap.set("v3", "val3"); - smap.set("v3", "changed_val3"); + var smap = new StringMap(); + smap.set("v1", "val1"); + smap.set("v2", "val2"); + smap.set("v3", "val3"); + smap.set("v3", "changed_val3"); - #if !jvm - var v:Vector = cast @:privateAccess smap.vals; - for (i in 0...v.length) { - t(v[i] != "val3"); - } - #end + #if !jvm + var v:Vector = cast @:privateAccess smap.vals; + for (i in 0...v.length) { + t(v[i] != "val3"); + } + #end - var omap = new ObjectMap<{}, String>(); - omap.set(imap, "val1"); - omap.set(smap, "val2"); - omap.set(omap, "val3"); - omap.set(omap, "changed_val3"); + var omap = new ObjectMap<{}, String>(); + omap.set(imap, "val1"); + omap.set(smap, "val2"); + omap.set(omap, "val3"); + omap.set(omap, "changed_val3"); - var v:Vector = cast @:privateAccess omap.vals; - for (i in 0...v.length) { - t(v[i] != "val3"); - } -#if java - var wmap = new WeakMap<{}, String>(); - wmap.set(imap, "val1"); - wmap.set(smap, "val2"); - wmap.set(omap, "val3"); - wmap.set(omap, "changed_val3"); + var v:Vector = cast @:privateAccess omap.vals; + for (i in 0...v.length) { + t(v[i] != "val3"); + } + #if java + var wmap = new WeakMap<{}, String>(); + wmap.set(imap, "val1"); + wmap.set(smap, "val2"); + wmap.set(omap, "val3"); + wmap.set(omap, "changed_val3"); - var v = @:privateAccess wmap.entries; - for (i in 0...v.length) { - t(v[i] == null || v[i].value != "val3"); - } -#end + var v = @:privateAccess wmap.entries; + for (i in 0...v.length) { + t(v[i] == null || v[i].value != "val3"); + } + #end - var imap = new IntMap(); - imap.set(0, "val1"); - imap.set(1, "val2"); - imap.set(2, "val3"); - imap.set(2, "changed_val3"); - imap.set(1, "changed_val2"); + var imap = new IntMap(); + imap.set(0, "val1"); + imap.set(1, "val2"); + imap.set(2, "val3"); + imap.set(2, "changed_val3"); + imap.set(1, "changed_val2"); - var v:Vector = cast @:privateAccess imap.vals; - for (i in 0...v.length) { - t(v[i] != "val2"); - } + #if !jvm + var v:Vector = cast @:privateAccess imap.vals; + for (i in 0...v.length) { + t(v[i] != "val2"); + } + #end - var smap = new StringMap(); - smap.set("v1", "val1"); - smap.set("v2", "val2"); - smap.set("v3", "val3"); - smap.set("v3", "changed_val3"); - smap.set("v2", "changed_val2"); + var smap = new StringMap(); + smap.set("v1", "val1"); + smap.set("v2", "val2"); + smap.set("v3", "val3"); + smap.set("v3", "changed_val3"); + smap.set("v2", "changed_val2"); - #if !jvm - var v:Vector = cast @:privateAccess smap.vals; - for (i in 0...v.length) { - t(v[i] != "val2"); - } - #end + #if !jvm + var v:Vector = cast @:privateAccess smap.vals; + for (i in 0...v.length) { + t(v[i] != "val2"); + } + #end - var omap = new ObjectMap<{}, String>(); - omap.set(imap, "val1"); - omap.set(smap, "val2"); - omap.set(omap, "val3"); - omap.set(omap, "changed_val3"); - omap.set(smap, "changed_val2"); + var omap = new ObjectMap<{}, String>(); + omap.set(imap, "val1"); + omap.set(smap, "val2"); + omap.set(omap, "val3"); + omap.set(omap, "changed_val3"); + omap.set(smap, "changed_val2"); - var v:Vector = cast @:privateAccess omap.vals; - for (i in 0...v.length) { - t(v[i] != "val2"); - } -#if java - var wmap = new WeakMap<{}, String>(); - wmap.set(imap, "val1"); - wmap.set(smap, "val2"); - wmap.set(omap, "val3"); - wmap.set(omap, "changed_val3"); - wmap.set(smap, "changed_val2"); + var v:Vector = cast @:privateAccess omap.vals; + for (i in 0...v.length) { + t(v[i] != "val2"); + } + #if java + var wmap = new WeakMap<{}, String>(); + wmap.set(imap, "val1"); + wmap.set(smap, "val2"); + wmap.set(omap, "val3"); + wmap.set(omap, "changed_val3"); + wmap.set(smap, "changed_val2"); - var v = @:privateAccess wmap.entries; - for (i in 0...v.length) { - t(v[i] == null || v[i].value != "val2"); - } -#end - } -#end + var v = @:privateAccess wmap.entries; + for (i in 0...v.length) { + t(v[i] == null || v[i].value != "val2"); + } + #end + } + #end } From 1939a7b211ca16f501fa3ebff620d1f47c917b47 Mon Sep 17 00:00:00 2001 From: Simon Krajewski Date: Thu, 1 Feb 2024 11:32:14 +0100 Subject: [PATCH 2/2] [typer] don't type trailing optional bind arguments so weirdly (#11533) see #11531 --- src/typing/calls.ml | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/typing/calls.ml b/src/typing/calls.ml index 2839847ec4a..3261058c30b 100644 --- a/src/typing/calls.ml +++ b/src/typing/calls.ml @@ -368,16 +368,10 @@ let type_bind ctx (e : texpr) (args,ret) params p = let rec loop args params given_args missing_args ordered_args = match args, params with | [], [] -> given_args,missing_args,ordered_args | [], _ -> raise_typing_error "Too many callback arguments" p - | (n,o,t) :: args , [] when o -> - let a = if is_pos_infos t then - let infos = mk_infos ctx p [] in - ordered_args @ [type_expr ctx infos (WithType.with_argument t n)] - else if ctx.com.config.pf_pad_nulls && ctx.allow_transform then - (ordered_args @ [(mk (TConst TNull) t_dynamic p)]) - else - ordered_args - in - loop args [] given_args missing_args a + | [n,o,t] , [] when o && is_pos_infos t -> + let infos = mk_infos ctx p [] in + let ordered_args = ordered_args @ [type_expr ctx infos (WithType.with_argument t n)] in + given_args,missing_args,ordered_args | (n,o,t) :: _ , (EConst(Ident "_"),p) :: _ when not ctx.com.config.pf_can_skip_non_nullable_argument && o && not (is_nullable t) -> raise_typing_error "Usage of _ is not supported for optional non-nullable arguments" p | (n,o,t) :: args , ([] as params)