OperandEncoderMap.java

  1. package org.jruby.ir.persistence;

  2. import org.jruby.ir.IRVisitor;
  3. import org.jruby.ir.operands.*;
  4. import org.jruby.ir.operands.Boolean;
  5. import org.jruby.ir.operands.Float;
  6. import org.jruby.util.KeyValuePair;

  7. /**
  8.  * Can cycles develop or will IR output guarantee non-cyclical nested operands?
  9.  */
  10. class OperandEncoderMap extends IRVisitor {
  11.     private final IRWriterEncoder encoder;

  12.     public OperandEncoderMap(IRWriterEncoder encoder) {
  13.         this.encoder = encoder;
  14.     }
  15.     // FIXME: Potentially some of these values should not need to have their type prefixed.
  16.     public void encode(Operand operand) {
  17.         encoder.encode(operand.getOperandType().getCoded());
  18.         operand.visit(this);
  19.     }

  20.     @Override public void Array(Array array) {
  21.         Operand[] elts = array.getElts();

  22.         encoder.encode(elts.length);
  23.         for (Operand elt: elts) {
  24.             encode(elt);
  25.         }
  26.     }

  27.     @Override public void AsString(AsString asstring) { encoder.encode(asstring.getSource()); }

  28.     @Override public void Backref(Backref backref) { encoder.encode(backref.type); }

  29.     @Override public void Bignum(Bignum bignum) { encoder.encode(bignum.value.toString()); }

  30.     @Override public void Boolean(Boolean booleanliteral) { encoder.encode(booleanliteral.isTrue()); }

  31.     @Override public void ClosureLocalVariable(ClosureLocalVariable variable) {
  32.         // We can refigure out closure scope it is in.
  33.         encoder.encode(variable.getName());
  34.         encoder.encode(variable.getScopeDepth());
  35.     }

  36.     @Override public void CurrentScope(CurrentScope scope) {
  37.         encoder.encode(scope.getScopeNestingDepth());
  38.     }

  39.     //@Override public void DynamicSymbol(DynamicSymbol dsym) { encode(dsym.getSymbolName()); }
  40.     @Override public void DynamicSymbol(DynamicSymbol dsym) {  }

  41.     @Override public void Fixnum(Fixnum fixnum) { encoder.encode(fixnum.value); }

  42.     @Override public void Float(Float flote) { encoder.encode(flote.value); }

  43.     @Override public void GlobalVariable(GlobalVariable variable) { encoder.encode(variable.getName()); }

  44.     @Override public void Hash(Hash hash) {
  45.         encoder.encode(hash.pairs.size());
  46.         for (KeyValuePair<Operand, Operand> pair: hash.pairs) {
  47.             encoder.encode(pair.getKey());
  48.             encoder.encode(pair.getValue());
  49.         }
  50.     }

  51.     @Override public void IRException(IRException irexception) { encoder.encode((byte) irexception.getType().ordinal()); }

  52.     @Override public void Label(Label label) {
  53.         encoder.encode(label.prefix);
  54.         encoder.encode(label.id);
  55.     }

  56.     @Override public void LocalVariable(LocalVariable variable) {
  57.         encoder.encode(variable.getName());
  58.         encoder.encode(variable.getScopeDepth());
  59.     }

  60.     @Override public void Nil(Nil nil) {} // No data

  61.     @Override public void NthRef(NthRef nthref) { encoder.encode(nthref.matchNumber); }

  62.     @Override public void ObjectClass(ObjectClass objectclass) {} // No data

  63.     @Override public void Regexp(Regexp regexp) {
  64.         encode(regexp.getRegexp());
  65.         encoder.encode(regexp.options.isEncodingNone());
  66.         encoder.encode(regexp.options.toEmbeddedOptions());
  67.     }

  68.     @Override public void ScopeModule(ScopeModule scope) { encoder.encode(scope.getScopeModuleDepth()); }

  69.     @Override public void Self(Self self) {} // No data

  70.     @Override public void Splat(Splat splat) { encode(splat.getArray()); encoder.encode(splat.unsplatArgs); }

  71.     @Override public void StandardError(StandardError standarderror) {} // No data

  72.     @Override public void StringLiteral(StringLiteral stringliteral) { encoder.encode(stringliteral.string); }

  73.     @Override public void SValue(SValue svalue) { encode(svalue.getArray()); }

  74.     @Override public void Symbol(Symbol symbol) { encoder.encode(symbol.getName()); }

  75.     @Override public void TemporaryBooleanVariable(TemporaryBooleanVariable variable) {
  76.         encoder.encode((byte) variable.getType().ordinal());
  77.         encoder.encode(variable.getOffset());
  78.     }

  79.     @Override public void TemporaryFixnumVariable(TemporaryFixnumVariable variable) {
  80.         encoder.encode((byte) variable.getType().ordinal());
  81.         encoder.encode(variable.getOffset());
  82.     }

  83.     @Override public void TemporaryFloatVariable(TemporaryFloatVariable variable) {
  84.         encoder.encode((byte) variable.getType().ordinal());
  85.         encoder.encode(variable.getOffset());
  86.     }

  87.     @Override public void TemporaryLocalVariable(TemporaryLocalVariable variable) {
  88.         encoder.encode((byte) variable.getType().ordinal());

  89.         if (variable.getType() == TemporaryVariableType.CLOSURE) {
  90.             encoder.encode(((TemporaryClosureVariable) variable).getClosureId());
  91.         }
  92.         encoder.encode(variable.getOffset());
  93.     }

  94.     // Only for CURRENT_SCOPE and CURRENT_MODULE now which is weird
  95.     @Override public void TemporaryVariable(TemporaryVariable variable) {
  96.         encoder.encode((byte) variable.getType().ordinal());
  97.         encoder.encode(((TemporaryLocalVariable) variable).getOffset());
  98.     }

  99.     @Override public void UnboxedBoolean(org.jruby.ir.operands.UnboxedBoolean booleanliteral) { encoder.encode(booleanliteral.isTrue()); }

  100.     @Override public void UnboxedFixnum(UnboxedFixnum fixnum) { encoder.encode(fixnum.value); }

  101.     @Override public void UnboxedFloat(UnboxedFloat flote) { encoder.encode(flote.value); }

  102.     @Override public void UndefinedValue(UndefinedValue undefinedvalue) {} // No data

  103.     @Override public void UnexecutableNil(UnexecutableNil unexecutablenil) {} // No data

  104.     @Override public void WrappedIRClosure(WrappedIRClosure scope) {
  105.         encoder.encode(scope.getSelf());
  106.         encoder.encode(scope.getClosure());
  107.     }
  108. }