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); }
@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 String toString() { StringBuilder builder = new StringBuilder(); builder.append("{"); if (!isBlank()) { int pairCount = pairs.length; for (int i = 0; i < pairCount; i++) { if (i > 0) { builder.append(", "); } builder.append(pairs[i]); } } builder.append("}"); return builder.toString(); }
@Override public void Hash(Hash hash) { List<KeyValuePair<Operand, Operand>> pairs = hash.getPairs(); Iterator<KeyValuePair<Operand, Operand>> iter = pairs.iterator(); boolean kwargs = hash.isKWArgsHash && pairs.get(0).getKey() == Symbol.KW_REST_ARG_DUMMY; jvmMethod().loadContext(); if (kwargs) { visit(pairs.get(0).getValue()); jvmAdapter().checkcast(p(RubyHash.class)); iter.next(); } for (; iter.hasNext() ;) { KeyValuePair<Operand, Operand> pair = iter.next(); visit(pair.getKey()); visit(pair.getValue()); } if (kwargs) { jvmMethod().kwargsHash(pairs.size() - 1); } else { jvmMethod().hash(pairs.size()); } }
private Operand[] adjustVariableDepth(Operand[] args, int depthFromSuper) { Operand[] newArgs = new Operand[args.length]; for (int i = 0; i < args.length; i++) { // Because of keyword args, we can have a keyword-arg hash in the call args. if (args[i] instanceof Hash) { newArgs[i] = ((Hash) args[i]).cloneForLVarDepth(depthFromSuper); } else { newArgs[i] = ((DepthCloneable) args[i]).cloneForDepth(depthFromSuper); } } return newArgs; }
case FROZEN_STRING: return FrozenString.decode(this); case GLOBAL_VARIABLE: return GlobalVariable.decode(this); case HASH: return Hash.decode(this); case IR_EXCEPTION: return IRException.decode(this); case LABEL: return Label.decode(this);
@Override public void Hash(Hash hash) { List<KeyValuePair<Operand, Operand>> pairs = hash.getPairs(); Iterator<KeyValuePair<Operand, Operand>> iter = pairs.iterator(); boolean kwargs = hash.isKWArgsHash && pairs.get(0).getKey() == Symbol.KW_REST_ARG_DUMMY; jvmMethod().loadContext(); if (kwargs) { visit(pairs.get(0).getValue()); jvmAdapter().checkcast(p(RubyHash.class)); iter.next(); } for (; iter.hasNext() ;) { KeyValuePair<Operand, Operand> pair = iter.next(); visit(pair.getKey()); visit(pair.getValue()); } if (kwargs) { jvmMethod().kwargsHash(pairs.size() - 1); } else { jvmMethod().hash(pairs.size()); } }
private Operand[] adjustVariableDepth(Operand[] args, int depthFromSuper) { Operand[] newArgs = new Operand[args.length]; for (int i = 0; i < args.length; i++) { // Because of keyword args, we can have a keyword-arg hash in the call args. if (args[i] instanceof Hash) { newArgs[i] = ((Hash) args[i]).cloneForLVarDepth(depthFromSuper); } else { newArgs[i] = ((DepthCloneable) args[i]).cloneForDepth(depthFromSuper); } } return newArgs; }
case FROZEN_STRING: return FrozenString.decode(this); case GLOBAL_VARIABLE: return GlobalVariable.decode(this); case HASH: return Hash.decode(this); case IR_EXCEPTION: return IRException.decode(this); case LABEL: return Label.decode(this);
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()]); }
@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 String toString() { StringBuilder builder = new StringBuilder(); builder.append("{"); if (!isBlank()) { int pairCount = pairs.length; for (int i = 0; i < pairCount; i++) { if (i > 0) { builder.append(", "); } builder.append(pairs[i]); } } builder.append("}"); return builder.toString(); }
public void Hash(Hash hash) { List<KeyValuePair<Operand, Operand>> pairs = hash.getPairs(); boolean comma = false; for (KeyValuePair<Operand, Operand> pair: pairs) { if (comma == true) print(','); comma = true; visit(pair.getKey()); print("=>"); visit(pair.getValue()); } if (hash.isKWArgsHash) { if (comma) print(','); print("kwargs=true"); } } public void IRException(IRException irexception) { print(irexception.getType()); }
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); }
@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 String toString() { StringBuilder builder = new StringBuilder(); builder.append("{"); if (!isBlank()) { int pairCount = pairs.size(); for (int i = 0; i < pairCount; i++) { if (i > 0) { builder.append(", "); } builder.append(pairs.get(i)); } } builder.append("}"); return builder.toString(); } }
public void Hash(Hash hash) { List<KeyValuePair<Operand, Operand>> pairs = hash.getPairs(); boolean comma = false; for (KeyValuePair<Operand, Operand> pair: pairs) { if (comma == true) print(','); comma = true; visit(pair.getKey()); print("=>"); visit(pair.getValue()); } if (hash.isKWArgsHash) { if (comma) print(','); print("kwargs=true"); } } public void IRException(IRException irexception) { print(irexception.getType()); }
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()]); }
@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 String toString() { StringBuilder builder = new StringBuilder(); builder.append("{"); if (!isBlank()) { int pairCount = pairs.size(); for (int i = 0; i < pairCount; i++) { if (i > 0) { builder.append(", "); } builder.append(pairs.get(i)); } } builder.append("}"); return builder.toString(); } }