1 28 package org.jruby.internal.runtime.methods; 29 30 import org.jruby.RubyModule; 31 import org.jruby.runtime.Arity; 32 import org.jruby.runtime.Block; 33 import org.jruby.runtime.ThreadContext; 34 import org.jruby.runtime.Visibility; 35 import org.jruby.runtime.builtin.IRubyObject; 36 37 42 public class MultiStubMethod extends DynamicMethod implements 43 Cloneable { 44 private Arity arity; 45 private MultiStub stub; 46 private int index; 47 48 public MultiStubMethod(MultiStub stub, int index, RubyModule implementationClass, Arity arity, Visibility visibility) { 49 super(implementationClass, visibility); 50 this.arity = arity; 51 this.stub = stub; 52 this.index = index; 53 54 assert arity != null; 55 } 56 57 public void preMethod(ThreadContext context, RubyModule klazz, IRubyObject self, String name, IRubyObject[] args, boolean noSuper, Block block) { 58 context.preReflectedMethodInternalCall(implementationClass, klazz, self, name, args, noSuper, block); 59 } 60 61 public void postMethod(ThreadContext context) { 62 context.postReflectedMethodInternalCall(); 63 } 64 65 public IRubyObject internalCall(ThreadContext context, RubyModule klazz, IRubyObject self, String name, IRubyObject[] args, boolean noSuper, Block block) { 66 switch (index) { 68 case 0: 69 return stub.method0(context, self, args, block); 70 case 1: 71 return stub.method1(context, self, args, block); 72 case 2: 73 return stub.method2(context, self, args, block); 74 case 3: 75 return stub.method3(context, self, args, block); 76 case 4: 77 return stub.method4(context, self, args, block); 78 case 5: 79 return stub.method5(context, self, args, block); 80 case 6: 81 return stub.method6(context, self, args, block); 82 case 7: 83 return stub.method7(context, self, args, block); 84 case 8: 85 return stub.method8(context, self, args, block); 86 case 9: 87 return stub.method9(context, self, args, block); 88 } 89 90 assert false; 91 return null; 92 } 93 94 public Arity getArity() { 96 return arity; 97 } 98 99 public DynamicMethod dup() { 100 try { 101 return (MultiStubMethod) clone(); 102 } catch (CloneNotSupportedException e) { 103 return null; 104 } 105 } 106 } 107 | Popular Tags |