public static CallInstr createWithKwargs(IRScope scope, CallType callType, Variable result, RubySymbol name, Operand receiver, Operand[] args, Operand closure, List<KeyValuePair<Operand, Operand>> kwargs) { // FIXME: This is obviously total nonsense but this will be on an optimized path and we will not be constructing // a new hash like this unless the eventual caller needs an ordinary hash. Operand[] newArgs = new Operand[args.length + 1]; System.arraycopy(args, 0, newArgs, 0, args.length); newArgs[args.length] = new Hash(kwargs, true); return create(scope, callType, result, name, receiver, newArgs, closure); }
private static Operand[] getCallOperands(IRScope scope, List<Operand> callArgs, List<KeyValuePair<Operand, Operand>> keywordArgs) { if (scope.receivesKeywordArgs()) { int i = 0; Operand[] args = new Operand[callArgs.size() + 1]; for (Operand arg: callArgs) { args[i++] = arg; } args[i] = new Hash(keywordArgs, true); return args; } return callArgs.toArray(new Operand[callArgs.size()]); }
public static CallInstr createWithKwargs(IRScope scope, CallType callType, Variable result, RubySymbol name, Operand receiver, Operand[] args, Operand closure, List<KeyValuePair<Operand, Operand>> kwargs) { // FIXME: This is obviously total nonsense but this will be on an optimized path and we will not be constructing // a new hash like this unless the eventual caller needs an ordinary hash. Operand[] newArgs = new Operand[args.length + 1]; System.arraycopy(args, 0, newArgs, 0, args.length); newArgs[args.length] = new Hash(kwargs, true); return create(scope, callType, result, name, receiver, newArgs, closure); }
private static Operand[] getCallOperands(IRScope scope, List<Operand> callArgs, List<KeyValuePair<Operand, Operand>> keywordArgs) { if (scope.receivesKeywordArgs()) { int i = 0; Operand[] args = new Operand[callArgs.size() + 1]; for (Operand arg: callArgs) { args[i++] = arg; } args[i] = new Hash(keywordArgs, true); return args; } return callArgs.toArray(new Operand[callArgs.size()]); }
public Operand cloneForLVarDepth(int newDepth) { KeyValuePair<Operand, Operand>[] newPairs = Arrays.stream(pairs) .map(pair -> new KeyValuePair( pair.getKey(), ((DepthCloneable) pair.getValue()).cloneForDepth(newDepth))) .toArray(n -> new KeyValuePair[n]); return new Hash(newPairs, isKWArgsHash); }
public Operand cloneForLVarDepth(int newDepth) { KeyValuePair<Operand, Operand>[] newPairs = Arrays.stream(pairs) .map(pair -> new KeyValuePair( pair.getKey(), ((DepthCloneable) pair.getValue()).cloneForDepth(newDepth))) .toArray(n -> new KeyValuePair[n]); return new Hash(newPairs, isKWArgsHash); }
@Override public Operand getSimplifiedOperand(Map<Operand, Operand> valueMap, boolean force) { KeyValuePair<Operand, Operand>[] newPairs = Arrays.stream(pairs) .map(pair -> new KeyValuePair<>( pair.getKey().getSimplifiedOperand(valueMap, force), pair.getValue().getSimplifiedOperand(valueMap, force))) .toArray(n -> new KeyValuePair[n]); return new Hash(newPairs, isKWArgsHash); }
@Override public Operand getSimplifiedOperand(Map<Operand, Operand> valueMap, boolean force) { KeyValuePair<Operand, Operand>[] newPairs = Arrays.stream(pairs) .map(pair -> new KeyValuePair<>( pair.getKey().getSimplifiedOperand(valueMap, force), pair.getValue().getSimplifiedOperand(valueMap, force))) .toArray(n -> new KeyValuePair[n]); return new Hash(newPairs, isKWArgsHash); }
@Override public Operand cloneForInlining(CloneInfo ii) { if (hasKnownValue()) return this; KeyValuePair<Operand, Operand>[] newPairs = Arrays.stream(pairs) .map(pair -> new KeyValuePair( pair.getKey().cloneForInlining(ii), pair.getValue().cloneForInlining(ii))) .toArray(n -> new KeyValuePair[n]); return new Hash(newPairs, isKWArgsHash); }
@Override public Operand getSimplifiedOperand(Map<Operand, Operand> valueMap, boolean force) { List<KeyValuePair> newPairs = new java.util.ArrayList<KeyValuePair>(); for (KeyValuePair pair : pairs) { newPairs.add(new KeyValuePair(pair.getKey().getSimplifiedOperand(valueMap, force), pair .getValue().getSimplifiedOperand(valueMap, force))); } return new Hash(newPairs); }
@Override public Operand cloneForInlining(CloneInfo ii) { if (hasKnownValue()) return this; KeyValuePair<Operand, Operand>[] newPairs = Arrays.stream(pairs) .map(pair -> new KeyValuePair( pair.getKey().cloneForInlining(ii), pair.getValue().cloneForInlining(ii))) .toArray(n -> new KeyValuePair[n]); return new Hash(newPairs, isKWArgsHash); }
@Override public Operand getSimplifiedOperand(Map<Operand, Operand> valueMap, boolean force) { List<KeyValuePair> newPairs = new java.util.ArrayList<KeyValuePair>(); for (KeyValuePair pair : pairs) { newPairs.add(new KeyValuePair(pair.getKey().getSimplifiedOperand(valueMap, force), pair .getValue().getSimplifiedOperand(valueMap, force))); } return new Hash(newPairs); }
@Override public Operand cloneForInlining(InlinerInfo ii) { if (hasKnownValue()) return this; List<KeyValuePair> newPairs = new java.util.ArrayList<KeyValuePair>(); for (KeyValuePair pair : pairs) { newPairs.add(new KeyValuePair(pair.getKey().cloneForInlining(ii), pair.getValue() .cloneForInlining(ii))); } return new Hash(newPairs); }
@Override public Operand cloneForInlining(InlinerInfo ii) { if (hasKnownValue()) return this; List<KeyValuePair> newPairs = new java.util.ArrayList<KeyValuePair>(); for (KeyValuePair pair : pairs) { newPairs.add(new KeyValuePair(pair.getKey().cloneForInlining(ii), pair.getValue() .cloneForInlining(ii))); } return new Hash(newPairs); }
public Operand buildHash(HashNode hashNode, IRScope s) { if (hashNode.getListNode() == null || hashNode.getListNode().size() == 0) { return copyAndReturnValue(s, new Hash(new ArrayList<KeyValuePair>())); } else { int i = 0; Operand key = null; Operand value = null; List<KeyValuePair> args = new ArrayList<KeyValuePair>(); for (Node nextNode : hashNode.getListNode().childNodes()) { Operand v = build(nextNode, s); if (key == null) { key = v; } else { args.add(new KeyValuePair(key, v)); key = null; } } return copyAndReturnValue(s, new Hash(args)); } }
public Operand buildHash(HashNode hashNode) { List<KeyValuePair<Operand, Operand>> args = new ArrayList<>(); boolean hasAssignments = hashNode.containsVariableAssignment(); Variable hash = null; for (KeyValuePair<Node, Node> pair: hashNode.getPairs()) { Node key = pair.getKey(); Operand keyOperand; if (key == null) { // Splat kwarg [e.g. {**splat1, a: 1, **splat2)] if (hash == null) { // No hash yet. Define so order is preserved. hash = copyAndReturnValue(new Hash(args)); args = new ArrayList<>(); // Used args but we may find more after the splat so we reset } else if (!args.isEmpty()) { addInstr(new RuntimeHelperCall(hash, MERGE_KWARGS, new Operand[] { hash, new Hash(args) })); args = new ArrayList<>(); } Operand splat = buildWithOrder(pair.getValue(), hasAssignments); addInstr(new RuntimeHelperCall(hash, MERGE_KWARGS, new Operand[] { hash, splat})); continue; } else { keyOperand = buildWithOrder(key, hasAssignments); } args.add(new KeyValuePair<>(keyOperand, buildWithOrder(pair.getValue(), hasAssignments))); } if (hash == null) { // non-**arg ordinary hash hash = copyAndReturnValue(new Hash(args)); } else if (!args.isEmpty()) { // ordinary hash values encountered after a **arg addInstr(new RuntimeHelperCall(hash, MERGE_KWARGS, new Operand[] { hash, new Hash(args) })); } return hash; }
public Operand buildHash(HashNode hashNode) { List<KeyValuePair<Operand, Operand>> args = new ArrayList<>(); boolean hasAssignments = hashNode.containsVariableAssignment(); Variable hash = null; for (KeyValuePair<Node, Node> pair: hashNode.getPairs()) { Node key = pair.getKey(); Operand keyOperand; if (key == null) { // Splat kwarg [e.g. {**splat1, a: 1, **splat2)] if (hash == null) { // No hash yet. Define so order is preserved. hash = copyAndReturnValue(new Hash(args)); args = new ArrayList<>(); // Used args but we may find more after the splat so we reset } else if (!args.isEmpty()) { addInstr(new RuntimeHelperCall(hash, MERGE_KWARGS, new Operand[] { hash, new Hash(args) })); args = new ArrayList<>(); } Operand splat = buildWithOrder(pair.getValue(), hasAssignments); addInstr(new RuntimeHelperCall(hash, MERGE_KWARGS, new Operand[] { hash, splat})); continue; } else { keyOperand = buildWithOrder(key, hasAssignments); } args.add(new KeyValuePair<>(keyOperand, buildWithOrder(pair.getValue(), hasAssignments))); } if (hash == null) { // non-**arg ordinary hash hash = copyAndReturnValue(new Hash(args)); } else if (!args.isEmpty()) { // ordinary hash values encountered after a **arg addInstr(new RuntimeHelperCall(hash, MERGE_KWARGS, new Operand[] { hash, new Hash(args) })); } return hash; }
public Operand buildHash(HashNode hashNode, IRScope s) { if (hashNode.getListNode() == null || hashNode.getListNode().size() == 0) { return copyAndReturnValue(s, new Hash(new ArrayList<KeyValuePair>())); } else { int i = 0; Operand key = null; Operand value = null; List<KeyValuePair> args = new ArrayList<KeyValuePair>(); for (Node nextNode : hashNode.getListNode().childNodes()) { Operand v = build(nextNode, s); if (key == null) { key = v; } else { args.add(new KeyValuePair(key, v)); key = null; } } return copyAndReturnValue(s, new Hash(args)); } }
public static Hash decode(IRReaderDecoder d) { int size = d.decodeInt(); KeyValuePair<Operand, Operand> pairs[] = new KeyValuePair[size]; for (int i = 0; i < size; i++) { pairs[i] = new KeyValuePair(d.decodeOperand(), d.decodeOperand()); } return new Hash(pairs, d.decodeBoolean()); }
public static Hash decode(IRReaderDecoder d) { int size = d.decodeInt(); KeyValuePair<Operand, Operand> pairs[] = new KeyValuePair[size]; for (int i = 0; i < size; i++) { pairs[i] = new KeyValuePair(d.decodeOperand(), d.decodeOperand()); } return new Hash(pairs, d.decodeBoolean()); }