1 28 package org.jruby.internal.runtime.methods; 29 30 import org.jruby.Ruby; 31 import org.jruby.RubyModule; 32 import org.jruby.lexer.yacc.ISourcePosition; 33 import org.jruby.runtime.Arity; 34 import org.jruby.runtime.Block; 35 import org.jruby.runtime.ThreadContext; 36 import org.jruby.runtime.Visibility; 37 import org.jruby.runtime.builtin.IRubyObject; 38 import org.jruby.exceptions.RaiseException; 39 import org.jruby.exceptions.JumpException; 40 import org.jruby.exceptions.ThreadKill; 41 import org.jruby.exceptions.MainExitException; 42 43 46 public abstract class FullInvocationMethod extends DynamicMethod implements Cloneable { 47 private Arity arity; 48 public FullInvocationMethod(RubyModule implementationClass, Arity arity, Visibility visibility) { 49 super(implementationClass, visibility); 50 this.arity = arity; 51 } 52 53 public void preMethod(ThreadContext context, RubyModule klazz, IRubyObject self, String name, IRubyObject[] args, boolean noSuper, Block block) { 54 context.preReflectedMethodInternalCall(implementationClass, klazz, self, name, args, noSuper, block); 55 } 56 57 public void postMethod(ThreadContext context) { 58 context.postReflectedMethodInternalCall(); 59 } 60 61 private IRubyObject wrap(Ruby runtime, IRubyObject self, IRubyObject[] args, Block block) { 62 try { 63 return call(self,args,block); 64 } catch(RaiseException e) { 65 throw e; 66 } catch(JumpException e) { 67 throw e; 68 } catch(ThreadKill e) { 69 throw e; 70 } catch(MainExitException e) { 71 throw e; 72 } catch(Exception e) { 73 runtime.getJavaSupport().handleNativeException(e); 74 return runtime.getNil(); 75 } 76 } 77 78 public IRubyObject internalCall(ThreadContext context, RubyModule klazz, IRubyObject self, String name, IRubyObject[] args, boolean noSuper, Block block) { 79 Ruby runtime = context.getRuntime(); 80 arity.checkArity(runtime, args); 81 82 if(runtime.getTraceFunction() != null) { 83 ISourcePosition position = context.getPosition(); 84 85 runtime.callTraceFunction(context, "c-call", position, self, name, getImplementationClass()); 86 try { 87 return wrap(runtime,self,args,block); 88 } finally { 89 runtime.callTraceFunction(context, "c-return", position, self, name, getImplementationClass()); 90 } 91 } 92 return wrap(runtime,self,args,block); 93 } 94 95 public abstract IRubyObject call(IRubyObject self, IRubyObject[] args, Block block); 96 97 public DynamicMethod dup() { 98 try { 99 return (FullInvocationMethod) clone(); 100 } catch (CloneNotSupportedException e) { 101 return null; 102 } 103 } 104 105 public Arity getArity() { 106 return arity; 107 } 108 } 109 | Popular Tags |