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.ThreadContext; 35 import org.jruby.runtime.Visibility; 36 import org.jruby.runtime.builtin.IRubyObject; 37 import org.jruby.exceptions.RaiseException; 38 import org.jruby.exceptions.JumpException; 39 import org.jruby.exceptions.ThreadKill; 40 import org.jruby.exceptions.MainExitException; 41 import org.jruby.runtime.Block; 42 import org.jruby.util.collections.SinglyLinkedList; 43 44 public abstract class CompiledMethod extends DynamicMethod implements Cloneable { 45 private Arity arity; 46 private SinglyLinkedList cref; 47 48 public CompiledMethod(RubyModule implementationClass, Arity arity, Visibility visibility, SinglyLinkedList cref) { 49 super(implementationClass, visibility); 50 this.arity = arity; 51 this.cref = cref; 52 } 53 54 public void preMethod(ThreadContext context, RubyModule clazz, 55 IRubyObject self, String name, IRubyObject[] args, boolean noSuper) { 56 context.preCompiledMethod(implementationClass, cref); 58 } 59 60 public void postMethod(ThreadContext context) { 61 context.postCompiledMethod(); 62 } 63 64 public IRubyObject internalCall(ThreadContext context, RubyModule clazz, IRubyObject self, String name, IRubyObject[] args, boolean noSuper, Block block) { 65 assert false; 66 return null; 67 } 68 69 private IRubyObject wrap(ThreadContext context, Ruby runtime, IRubyObject self, IRubyObject[] args, Block block) { 70 try { 71 return call(context, self, args, block); 72 } catch(RaiseException e) { 73 throw e; 74 } catch(JumpException e) { 75 throw e; 76 } catch(ThreadKill e) { 77 throw e; 78 } catch(MainExitException e) { 79 throw e; 80 } catch(Exception e) { 81 runtime.getJavaSupport().handleNativeException(e); 82 return runtime.getNil(); 83 } 84 } 85 86 public IRubyObject call(ThreadContext context, IRubyObject self, RubyModule klazz, String name, IRubyObject[] args, boolean noSuper, Block block) { 87 Ruby runtime = context.getRuntime(); 88 arity.checkArity(runtime, args); 89 90 if(runtime.getTraceFunction() != null) { 91 ISourcePosition position = context.getPosition(); 92 93 runtime.callTraceFunction(context, "c-call", position, self, name, getImplementationClass()); 94 try { 95 return wrap(context, runtime, self, args, block); 96 } finally { 97 runtime.callTraceFunction(context, "c-return", position, self, name, getImplementationClass()); 98 } 99 } 100 return wrap(context, runtime, self, args, block); 101 } 102 103 public abstract IRubyObject call(ThreadContext context, IRubyObject self, IRubyObject[] args, Block block); 104 105 public DynamicMethod dup() { 106 try { 107 CompiledMethod msm = (CompiledMethod)clone(); 108 return msm; 109 } catch (CloneNotSupportedException cnse) { 110 return null; 111 } 112 } 113 114 public Arity getArity() { 115 return arity; 116 } 117 } | Popular Tags |