diff --git a/src/main/java/com/laytonsmith/core/constructs/CArray.java b/src/main/java/com/laytonsmith/core/constructs/CArray.java index 27c41366e..f98de4529 100644 --- a/src/main/java/com/laytonsmith/core/constructs/CArray.java +++ b/src/main/java/com/laytonsmith/core/constructs/CArray.java @@ -289,12 +289,14 @@ public void push(Construct c, Integer index, Target t) throws IllegalArgumentExc */ @Override public Set keySet() { - Set set = !associative_mode ? new LinkedHashSet<>(array.size()) : new LinkedHashSet<>(associative_array.size()); + Set set; if(!associative_mode) { + set = new LinkedHashSet<>(array.size()); for(int i = 0; i < array.size(); i++) { set.add(new CInt(i, Target.UNKNOWN)); } } else { + set = new LinkedHashSet<>(associative_array.size()); for(String key : associative_array.keySet()) { set.add(new CString(key, Target.UNKNOWN)); } @@ -309,15 +311,15 @@ public Set keySet() { * @return */ public Set stringKeySet() { - Set set = !associative_mode ? new LinkedHashSet<>(array.size()) : new HashSet<>(associative_array.size()); if(!associative_mode) { + Set set = new LinkedHashSet<>(array.size()); for(int i = 0; i < array.size(); i++) { set.add(Integer.toString(i)); } + return set; } else { - set = associative_array.keySet(); + return associative_array.keySet(); } - return set; } private void setAssociative() { diff --git a/src/main/java/com/laytonsmith/core/functions/ArrayHandling.java b/src/main/java/com/laytonsmith/core/functions/ArrayHandling.java index 525c07497..e5304e8fb 100644 --- a/src/main/java/com/laytonsmith/core/functions/ArrayHandling.java +++ b/src/main/java/com/laytonsmith/core/functions/ArrayHandling.java @@ -437,7 +437,7 @@ public Construct exec(Target t, Environment env, Construct... args) throws Confi CArray array = (CArray) args[0]; int initialSize = (int) array.size(); for(int i = 1; i < args.length; i++) { - ((CArray) args[0]).push(args[i], t); + array.push(args[i], t); for(ArrayAccess.ArrayAccessIterator iterator : env.getEnv(GlobalEnv.class).GetArrayAccessIteratorsFor(((ArrayAccess) args[0]))) { //This is always pushing after the current index. //Given that this is the last one, we don't need to waste @@ -846,17 +846,16 @@ public Boolean runAsync() { @Override public Construct exec(Target t, Environment env, Construct... args) throws ConfigRuntimeException { if(args[0] instanceof CArray) { - if(!((CArray) args[0]).inAssociativeMode()) { + CArray ca = (CArray) args[0]; + if(!ca.inAssociativeMode()) { try { int index = Static.getInt32(args[1], t); - CArray ca = (CArray) args[0]; - return CBoolean.get(index <= ca.size() - 1); + return CBoolean.get(index < ca.size()); } catch (ConfigRuntimeException e) { - //They sent a key that is a string. Obviously it doesn't exist. + //They probably sent a key that can't be translated into an int, so it doesn't exist here. return CBoolean.FALSE; } } else { - CArray ca = (CArray) args[0]; return CBoolean.get(ca.containsKey(args[1].val())); } } else {