DefineClassInstr.java

  1. package org.jruby.ir.instructions;

  2. import org.jruby.ir.IRClassBody;
  3. import org.jruby.ir.IRVisitor;
  4. import org.jruby.ir.Operation;
  5. import org.jruby.ir.operands.Operand;
  6. import org.jruby.ir.operands.UndefinedValue;
  7. import org.jruby.ir.operands.Variable;
  8. import org.jruby.ir.runtime.IRRuntimeHelpers;
  9. import org.jruby.ir.transformations.inlining.CloneInfo;
  10. import org.jruby.parser.StaticScope;
  11. import org.jruby.runtime.DynamicScope;
  12. import org.jruby.runtime.ThreadContext;
  13. import org.jruby.runtime.builtin.IRubyObject;

  14. import java.util.Map;

  15. public class DefineClassInstr extends Instr implements ResultInstr, FixedArityInstr {
  16.     private final IRClassBody newIRClassBody;
  17.     private Operand container;
  18.     private Operand superClass;
  19.     private Variable result;

  20.     public DefineClassInstr(Variable result, IRClassBody newIRClassBody, Operand container, Operand superClass) {
  21.         super(Operation.DEF_CLASS);

  22.         assert result != null: "DefineClassInstr result is null";

  23.         this.container = container;
  24.         this.superClass = superClass == null ? UndefinedValue.UNDEFINED : superClass;
  25.         this.newIRClassBody = newIRClassBody;
  26.         this.result = result;
  27.     }

  28.     @Override
  29.     public Operand[] getOperands() {
  30.         return new Operand[]{container, superClass};
  31.     }

  32.     @Override
  33.     public Variable getResult() {
  34.         return result;
  35.     }

  36.     @Override
  37.     public void updateResult(Variable v) {
  38.         this.result = v;
  39.     }

  40.     @Override
  41.     public void simplifyOperands(Map<Operand, Operand> valueMap, boolean force) {
  42.         container = container.getSimplifiedOperand(valueMap, force);
  43.         superClass = superClass.getSimplifiedOperand(valueMap, force);
  44.     }

  45.     @Override
  46.     public String toString() {
  47.         return super.toString() + "(" + newIRClassBody.getName() + ", " + container + ", " + superClass + ", " + newIRClassBody.getFileName() + ")";
  48.     }

  49.     @Override
  50.     public Instr clone(CloneInfo ii) {
  51.         return new DefineClassInstr(ii.getRenamedVariable(result), this.newIRClassBody, container.cloneForInlining(ii), superClass.cloneForInlining(ii));
  52.     }

  53.     @Override
  54.     public Object interpret(ThreadContext context, StaticScope currScope, DynamicScope currDynScope, IRubyObject self, Object[] temp) {
  55.         Object container = this.container.retrieve(context, self, currScope, currDynScope, temp);
  56.         Object superClass = this.superClass.retrieve(context, self, currScope, currDynScope, temp);

  57.         return IRRuntimeHelpers.newInterpretedClassBody(context, newIRClassBody, container, superClass);
  58.     }

  59.     @Override
  60.     public void visit(IRVisitor visitor) {
  61.         visitor.DefineClassInstr(this);
  62.     }

  63.     public IRClassBody getNewIRClassBody() {
  64.         return newIRClassBody;
  65.     }

  66.     public Operand getContainer() {
  67.         return container;
  68.     }

  69.     public Operand getSuperClass() {
  70.         return superClass;
  71.     }
  72. }