DefineClassMethodInstr.java

  1. package org.jruby.ir.instructions;

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

  12. import java.util.Map;

  13. // SSS FIXME: Should we merge DefineInstanceMethod and DefineClassMethod instructions?
  14. public class DefineClassMethodInstr extends Instr implements FixedArityInstr {
  15.     private Operand container;
  16.     private final IRMethod method;

  17.     public DefineClassMethodInstr(Operand container, IRMethod method) {
  18.         super(Operation.DEF_CLASS_METH);
  19.         this.container = container;
  20.         this.method = method;
  21.     }

  22.     public Operand getContainer() {
  23.         return container;
  24.     }

  25.     public IRMethod getMethod() {
  26.         return method;
  27.     }

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

  32.     @Override
  33.     public void simplifyOperands(Map<Operand, Operand> valueMap, boolean force) {
  34.         container = container.getSimplifiedOperand(valueMap, force);
  35.     }

  36.     @Override
  37.     public String toString() {
  38.         return getOperation() + "(" + container + ", " + method.getName() + ", " + method.getFileName() + ")";
  39.     }

  40.     @Override
  41.     public Instr clone(CloneInfo ii) {
  42.         return new DefineClassMethodInstr(container.cloneForInlining(ii), method);
  43.     }

  44.     @Override
  45.     public Object interpret(ThreadContext context, StaticScope currScope, DynamicScope currDynScope, IRubyObject self, Object[] temp) {
  46.         IRubyObject obj = (IRubyObject) container.retrieve(context, self, currScope, currDynScope, temp);

  47.         IRRuntimeHelpers.defInterpretedClassMethod(context, method, obj);
  48.         return null;
  49.     }

  50.     @Override
  51.     public void visit(IRVisitor visitor) {
  52.         visitor.DefineClassMethodInstr(this);
  53.     }
  54. }