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 SimpleInvocationMethod extends DynamicMethod implements Cloneable { 47 private Arity arity; 48 public SimpleInvocationMethod(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 } 55 56 public void postMethod(ThreadContext context) { 57 } 58 59 public IRubyObject internalCall(ThreadContext context, RubyModule klazz, IRubyObject self, String name, IRubyObject[] args, boolean noSuper, Block block) { 60 assert false; 61 return null; 62 } 63 64 private IRubyObject wrap(Ruby runtime, IRubyObject self, IRubyObject[] args) { 65 try { 66 return call(self,args); 67 } catch(RaiseException e) { 68 throw e; 69 } catch(JumpException e) { 70 throw e; 71 } catch(ThreadKill e) { 72 throw e; 73 } catch(MainExitException e) { 74 throw e; 75 } catch(Exception e) { 76 runtime.getJavaSupport().handleNativeException(e); 77 return runtime.getNil(); 78 } 79 } 80 81 public IRubyObject call(ThreadContext context, IRubyObject self, RubyModule klazz, String name, IRubyObject[] args, boolean noSuper, Block block) { 82 Ruby runtime = context.getRuntime(); 83 arity.checkArity(runtime, args); 84 85 if(runtime.getTraceFunction() != null) { 86 ISourcePosition position = context.getPosition(); 87 88 runtime.callTraceFunction(context, "c-call", position, self, name, getImplementationClass()); 89 try { 90 return wrap(runtime,self,args); 91 } finally { 92 runtime.callTraceFunction(context, "c-return", position, self, name, getImplementationClass()); 93 } 94 } 95 return wrap(runtime,self,args); 96 } 97 98 public abstract IRubyObject call(IRubyObject self, IRubyObject[] args); 99 100 public DynamicMethod dup() { 101 try { 102 return (SimpleInvocationMethod) clone(); 103 } catch (CloneNotSupportedException e) { 104 return null; 105 } 106 } 107 108 public Arity getArity() { 109 return arity; 110 } 111 } 112 | Popular Tags |