Docjar: A Java Source and Docuemnt Enginecom.*    java.*    javax.*    org.*    all    new    plug-in

Quick Search    Search Deep

Source code: bsh/BSHMethodInvocation.java


1   /*****************************************************************************
2    *                                                                           *
3    *  This file is part of the BeanShell Java Scripting distribution.          *
4    *  Documentation and updates may be found at http://www.beanshell.org/      *
5    *                                                                           *
6    *  Sun Public License Notice:                                               *
7    *                                                                           *
8    *  The contents of this file are subject to the Sun Public License Version  *
9    *  1.0 (the "License"); you may not use this file except in compliance with *
10   *  the License. A copy of the License is available at http://www.sun.com    * 
11   *                                                                           *
12   *  The Original Code is BeanShell. The Initial Developer of the Original    *
13   *  Code is Pat Niemeyer. Portions created by Pat Niemeyer are Copyright     *
14   *  (C) 2000.  All Rights Reserved.                                          *
15   *                                                                           *
16   *  GNU Public License Notice:                                               *
17   *                                                                           *
18   *  Alternatively, the contents of this file may be used under the terms of  *
19   *  the GNU Lesser General Public License (the "LGPL"), in which case the    *
20   *  provisions of LGPL are applicable instead of those above. If you wish to *
21   *  allow use of your version of this file only under the  terms of the LGPL *
22   *  and not to allow others to use your version of this file under the SPL,  *
23   *  indicate your decision by deleting the provisions above and replace      *
24   *  them with the notice and other provisions required by the LGPL.  If you  *
25   *  do not delete the provisions above, a recipient may use your version of  *
26   *  this file under either the SPL or the LGPL.                              *
27   *                                                                           *
28   *  Patrick Niemeyer (pat@pat.net)                                           *
29   *  Author of Learning Java, O'Reilly & Associates                           *
30   *  http://www.pat.net/~pat/                                                 *
31   *                                                                           *
32   *****************************************************************************/
33  
34  
35  package bsh;
36  
37  class BSHMethodInvocation extends SimpleNode
38  {
39  
40    BSHMethodInvocation (int id) { super(id); }
41  
42    /**
43      Evaluate the method invocation with the specified callstack and 
44      interpreter
45    */
46    public Object eval( CallStack callstack, Interpreter interpreter )
47      throws EvalError
48    {
49      NameSpace namespace = callstack.top();
50      Name name = ((BSHAmbiguousName)jjtGetChild(0)).getName(namespace);
51      Object[] args = 
52        ((BSHArguments)jjtGetChild(1)).getArguments(callstack, interpreter);
53  
54      try {
55        return name.invokeMethod( interpreter, args, callstack, this);
56      } catch ( ReflectError e ) {
57        throw new EvalError(
58          "Error in method invocation: " + e.getMessage(), 
59          this, callstack );
60      } catch ( java.lang.reflect.InvocationTargetException e ) 
61      {
62        String msg = "Method Invocation "+name;
63        Throwable te = e.getTargetException();
64  
65        /*
66          Try to squeltch the native code stack trace if the exception
67          was caused by a reflective call back into the bsh interpreter
68          (e.g. eval() or source()
69        */
70        boolean isNative = true;
71        if ( te instanceof EvalError ) 
72          if ( te instanceof TargetError )
73            isNative = ((TargetError)te).inNativeCode();
74          else
75            isNative = false;
76        
77        throw new TargetError( msg, te, this, callstack, isNative );
78      } catch ( UtilEvalError e ) {
79        throw e.toEvalError( this, callstack );
80      }
81    }
82  }
83