@Override public void Hash(Hash hash) { encoder.encode(hash.pairs.size()); for (KeyValuePair<Operand, Operand> pair : hash.pairs) { encoder.encode(pair.getKey()); encoder.encode(pair.getValue()); } }
@Override public void TemporaryLocalVariable(TemporaryLocalVariable variable) { encoder.encode((byte) variable.getType().ordinal()); if (variable.getType() == TemporaryVariableType.CLOSURE) { encoder.encode(((TemporaryClosureVariable) variable).getClosureId()); } encoder.encode(variable.getOffset()); }
private void encodeRuntimeHelperCall(RuntimeHelperCall instr) { e.encode(instr.getHelperMethod()); // FIXME: Probably make an Operand[] encoder Operand[] args = instr.getArgs(); e.encode(args.length); for (int i = 0; i < args.length; i++) { e.encode(args[i]); } }
private void encodeAttrAssignInstr(AttrAssignInstr instr) { e.encode(instr.getReceiver()); e.encode(instr.getMethodAddr().getName()); Operand[] args = instr.getCallArgs(); e.encode(args.length); for (int i = 0; i < args.length; i++) { e.encode(args[i]); } }
private void encodeUnresolvedSuperInstr(UnresolvedSuperInstr instr) { boolean hasClosure = instr.getClosureArg(null) != null; e.encode(instr.getCallType().ordinal()); e.encode(instr.getReceiver()); e.encode(calculateArity(instr.getCallArgs(), hasClosure)); for (Operand arg : instr.getCallArgs()) { e.encode(arg); } if (hasClosure) e.encode(instr.getClosureArg(null)); }
@Override public void Array(Array array) { Operand[] elts = array.getElts(); encoder.encode(elts.length); for (Operand elt : elts) { encode(elt); } }
private void encodeCallBaseInstr(CallBase instr) { boolean hasClosure = instr.getClosureArg(null) != null; e.encode(instr.getCallType().ordinal()); e.encode(instr.getMethodAddr().getName()); e.encode(instr.getReceiver()); e.encode(calculateArity(instr.getCallArgs(), hasClosure)); for (Operand arg : instr.getCallArgs()) { e.encode(arg); } if (hasClosure) e.encode(instr.getClosureArg(null)); }
private void encodeZSuperInstr(ZSuperInstr instr) { e.encode(instr.getReceiver()); Operand closure = instr.getClosureArg(null); boolean hasClosure = closure != null; e.encode(hasClosure); if (hasClosure) { e.encode(closure); } e.encode(instr.getCallArgs().length); for (Operand arg : instr.getCallArgs()) { e.encode(arg); } e.encode(instr.getArgCounts().length); for (Integer i : instr.getArgCounts()) { e.encode(i); } }
@Override public void CurrentScope(CurrentScope scope) { encoder.encode(scope.getScopeNestingDepth()); }
@Override public void Boolean(Boolean booleanliteral) { encoder.encode(booleanliteral.isTrue()); }
@Override public void ClosureLocalVariable(ClosureLocalVariable variable) { // We can refigure out closure scope it is in. encoder.encode(variable.getName()); encoder.encode(variable.getScopeDepth()); }
@Override public void Backref(Backref backref) { encoder.encode(backref.type); }
@Override public void Bignum(Bignum bignum) { encoder.encode(bignum.value.toString()); }
@Override public void GlobalVariable(GlobalVariable variable) { encoder.encode(variable.getName()); }
@Override public void TemporaryBooleanVariable(TemporaryBooleanVariable variable) { encoder.encode((byte) variable.getType().ordinal()); encoder.encode(variable.getOffset()); }
@Override public void Splat(Splat splat) { encode(splat.getArray()); encoder.encode(splat.unsplatArgs); }
@Override public void ScopeModule(ScopeModule scope) { encoder.encode(scope.getScopeModuleDepth()); }
@Override public void UnboxedBoolean(org.jruby.ir.operands.UnboxedBoolean booleanliteral) { encoder.encode(booleanliteral.isTrue()); }
@Override public void IRException(IRException irexception) { encoder.encode((byte) irexception.getType().ordinal()); }
// Only for CURRENT_SCOPE and CURRENT_MODULE now which is weird @Override public void TemporaryVariable(TemporaryVariable variable) { encoder.encode((byte) variable.getType().ordinal()); encoder.encode(((TemporaryLocalVariable) variable).getOffset()); }
@Override public void StringLiteral(StringLiteral stringliteral) { encoder.encode(stringliteral.string); }
// FIXME: Potentially some of these values should not need to have their type prefixed. public void encode(Operand operand) { encoder.encode(operand.getOperandType().getCoded()); operand.visit(this); }
@Override public void Fixnum(Fixnum fixnum) { encoder.encode(fixnum.value); }
@Override public void WrappedIRClosure(WrappedIRClosure scope) { encoder.encode(scope.getSelf()); encoder.encode(scope.getClosure()); }
@Override public void Float(Float flote) { encoder.encode(flote.value); }
@Override public void AsString(AsString asstring) { encoder.encode(asstring.getSource()); }
@Override public void UnboxedFixnum(UnboxedFixnum fixnum) { encoder.encode(fixnum.value); }
@Override public void Symbol(Symbol symbol) { encoder.encode(symbol.getName()); }
@Override public void Label(Label label) { encoder.encode(label.prefix); encoder.encode(label.id); }
@Override public void UnboxedFloat(UnboxedFloat flote) { encoder.encode(flote.value); }