Index: toolsrc/org/mozilla/javascript/tools/debugger/GuiCallback.java
===================================================================
--- toolsrc/org/mozilla/javascript/tools/debugger/GuiCallback.java	(revision 1)
+++ misc/build/rhino1_7R3/toolsrc/org/mozilla/javascript/tools/debugger/GuiCallback.java	(working copy)
@@ -56,6 +56,11 @@
                         String threadTitle,
                         String alertMessage);
 
+	/**
+	 * Called when the interrupt loop has been exited.
+	 */
+	void exitInterrupt();
+
     /**
      * Returns whether the current thread is the GUI's event thread.
      * This information is required to avoid blocking the event thread
Index: toolsrc/org/mozilla/javascript/tools/debugger/Main.java
===================================================================
--- toolsrc/org/mozilla/javascript/tools/debugger/Main.java	(revision 1)
+++ misc/build/rhino1_7R3/toolsrc/org/mozilla/javascript/tools/debugger/Main.java	(working copy)
@@ -44,6 +44,8 @@
 import java.io.InputStream;
 import java.io.PrintStream;
 
+import java.net.URL;
+
 import javax.swing.JFrame;
 
 import org.mozilla.javascript.*;
@@ -161,7 +163,7 @@
      * Console window.
      */
     public InputStream getIn() {
-        return debugGui.getConsole().getIn();
+        return null;//return debugGui.getConsole().getIn();
     }
 
     /**
@@ -169,7 +171,7 @@
      * Console window.
      */
     public PrintStream getOut() {
-        return debugGui.getConsole().getOut();
+        return null;//return debugGui.getConsole().getOut();
     }
 
     /**
@@ -177,7 +179,7 @@
      * Console window.
      */
     public PrintStream getErr() {
-        return debugGui.getConsole().getErr();
+        return null;//return debugGui.getConsole().getErr();
     }
 
     /**
@@ -437,4 +439,39 @@
             return scope;
         }
     }
+    
+    // shortcut methods
+
+    public void addWindowListener(java.awt.event.WindowListener l) {
+        debugGui.addWindowListener(l);
+    }
+
+    public void highlighLineInScriptWindow(URL url, int lineNum) {
+		debugGui.highlighLineInScriptWindow(url, lineNum);
+	}
+    
+    public Object runScriptWindow(URL scriptUrl) throws Exception
+    {
+		return debugGui.runScriptWindow(scriptUrl);
+	}
+    
+    public void openFile(URL scriptUrl, Scriptable scope, Runnable closeCallback) {
+		debugGui.openFile(scriptUrl, scope, closeCallback);
+	}
+    
+    public void toFront() {
+		debugGui.toFront();
+	}
+    
+    public void showScriptWindow(URL url) {
+		debugGui.showScriptWindow(url);
+	}
+
+    public boolean isModified(URL url) {
+		return debugGui.isModified(url);
+	}
+
+	public String getText(URL url) {
+		return debugGui.getText(url);
+	}
 }
Index: toolsrc/org/mozilla/javascript/tools/debugger/Dim.java
===================================================================
--- toolsrc/org/mozilla/javascript/tools/debugger/Dim.java	(revision 1)
+++ misc/build/rhino1_7R3/toolsrc/org/mozilla/javascript/tools/debugger/Dim.java	(working copy)
@@ -69,6 +69,7 @@
     private static final int IPROXY_OBJECT_TO_STRING = 5;
     private static final int IPROXY_OBJECT_PROPERTY = 6;
     private static final int IPROXY_OBJECT_IDS = 7;
+    private static final int IPROXY_EVAL_SCRIPT_WITH_RETURN = 8;
 
     /**
      * Interface to the debugger GUI.
@@ -433,7 +434,7 @@
      */
     private String getNormalizedUrl(DebuggableScript fnOrScript) {
         String url = fnOrScript.getSourceName();
-        if (url == null) { url = "<stdin>"; }
+        if (url == null) { url = "document"; }
         else {
             // Not to produce window for eval from different lines,
             // strip line numbers, i.e. replace all #[0-9]+\(eval\) by
@@ -622,6 +623,17 @@
     }
 
     /**
+     * Evaluates the given script with scope and return value.
+     */
+    public Object evalScriptWithReturn(final String url, final String text, Scriptable scope) {
+        DimIProxy action = new DimIProxy(this, IPROXY_EVAL_SCRIPT_WITH_RETURN);
+        action.url = url;
+        action.text = text;
+        action.scope = scope;
+        return contextFactory.call(action);
+    }
+
+    /**
      * Converts the given script object to a string.
      */
     public String objectToString(Object object) {
@@ -869,6 +881,7 @@
                 interruptedContextData = null;
                 eventThreadMonitor.notifyAll();
             }
+            callback.exitInterrupt();
         }
 
     }
@@ -966,6 +979,11 @@
         private Object[] objectArrayResult;
 
         /**
+         * The Scriptable as arguments.
+         */
+        private Scriptable scope;
+
+        /**
          * Creates a new DimIProxy.
          */
         private DimIProxy(Dim dim, int type) {
@@ -1021,6 +1039,9 @@
                 objectArrayResult = dim.getObjectIdsImpl(cx, object);
                 break;
 
+              case IPROXY_EVAL_SCRIPT_WITH_RETURN:
+                return cx.evaluateString(this.scope, text, url, 1, null);
+
               default:
                 throw Kit.codeBug();
             }
Index: toolsrc/org/mozilla/javascript/tools/debugger/SwingGui.java
===================================================================
--- toolsrc/org/mozilla/javascript/tools/debugger/SwingGui.java	(revision 1)
+++ misc/build/rhino1_7R3/toolsrc/org/mozilla/javascript/tools/debugger/SwingGui.java	(working copy)
@@ -68,6 +68,8 @@
 import java.awt.Toolkit;
 import java.awt.event.*;
 
+import java.net.URL;
+
 import java.util.List;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -84,6 +86,7 @@
 import java.lang.reflect.Method;
 
 import org.mozilla.javascript.Kit;
+import org.mozilla.javascript.Scriptable;
 import org.mozilla.javascript.SecurityUtilities;
 
 import org.mozilla.javascript.tools.shell.ConsoleTextArea;
@@ -178,6 +181,16 @@
      */
     private EventQueue awtEventQueue;
 
+    private boolean sourceEditingEnabled = true;
+
+    public boolean isSourceEditingEnabled() {
+        return sourceEditingEnabled;
+    }
+
+    public void setSourceEditingEnabled(boolean b) {
+        sourceEditingEnabled = b;
+    }
+
     /**
      * Creates a new SwingGui.
      */
@@ -218,13 +231,13 @@
         super.setVisible(b);
         if (b) {
             // this needs to be done after the window is visible
-            console.consoleTextArea.requestFocus();
+            // console.consoleTextArea.requestFocus();
             context.split.setDividerLocation(0.5);
             try {
-                console.setMaximum(true);
-                console.setSelected(true);
-                console.show();
-                console.consoleTextArea.requestFocus();
+                // console.setMaximum(true);
+                // console.setSelected(true);
+                // console.show();
+                // console.consoleTextArea.requestFocus();
             } catch (Exception exc) {
             }
         }
@@ -320,7 +333,7 @@
         desk = new JDesktopPane();
         desk.setPreferredSize(new Dimension(600, 300));
         desk.setMinimumSize(new Dimension(150, 50));
-        desk.add(console = new JSInternalConsole("JavaScript Console"));
+        // desk.add(console = new JSInternalConsole("JavaScript Console"));
         context = new ContextWindow(this);
         context.setPreferredSize(new Dimension(600, 120));
         context.setMinimumSize(new Dimension(50, 50));
@@ -540,7 +553,7 @@
         if (line != -1) {
             currentWindow = w;
         }
-        menubar.addFile(url);
+        // menubar.addFile(url);
         w.setVisible(true);
 
         if (activate) {
@@ -800,9 +813,17 @@
             proxy.alertMessage = alertMessage;
             SwingUtilities.invokeLater(proxy);
         }
+        setSourceEditingEnabled(false);
     }
 
     /**
+     * Called when the interrupt loop has been exited.
+     */
+    public void exitInterrupt() {
+        setSourceEditingEnabled(true);
+    }
+
+    /**
      * Returns whether the current thread is the GUI event thread.
      */
     public boolean isGuiEventThread() {
@@ -879,6 +900,14 @@
                     new Thread(proxy).start();
                 }
             }
+        } else if (cmd.equals("Run")) {
+            FileWindow w = (FileWindow)getSelectedFrame();
+            if (w != null)
+                w.load();
+        } else if (cmd.equals("Save")) {
+            FileWindow w = (FileWindow)getSelectedFrame();
+            if (w != null)
+                w.save();
         } else if (cmd.equals("More Windows...")) {
             MoreWindows dlg = new MoreWindows(this, fileWindows,
                                               "Window", "Files");
@@ -972,6 +1001,120 @@
             dim.setReturnValue(returnValue);
         }
     }
+
+    private String getFileName(URL url) {
+        if (url.getProtocol().startsWith("vnd.sun.star."))
+            return url.toString();
+        return url.getPath();
+    }
+
+    public void openFile(URL scriptUrl, Scriptable scope, Runnable closeCallback) {
+        if (scope == null) {
+            MessageDialogWrapper.showMessageDialog(this,
+                "Can't compile scripts: no scope available",
+                "Open", JOptionPane.ERROR_MESSAGE);
+        } else {
+            if (scriptUrl != null) {
+                try
+                {
+                    InputStreamReader reader = new InputStreamReader(scriptUrl.openStream()); 
+                    String fileName = getFileName(scriptUrl);
+                    officeScripts.addScript( fileName, scriptUrl, scope, closeCallback  );
+                    RunProxy proxy = new RunProxy(this, RunProxy.OPEN_FILE);
+                    proxy.fileName = fileName;
+                    proxy.text = Kit.readReader(reader);
+                    new Thread(proxy).start();
+                }
+                catch ( IOException e )
+                {
+                    MessageDialogWrapper.showMessageDialog(this,
+                        "Can't open stream for script: " + e.toString(),
+                        "Open", JOptionPane.ERROR_MESSAGE);
+                }
+            }
+        }
+        split1.setDividerLocation(1.0);
+    }
+
+    // patched Office specific interface
+    OfficeScriptInfo officeScripts = new OfficeScriptInfo();
+
+    void removeScript(String url) {
+        officeScripts.deleteScript(url);
+    }
+
+    public void showScriptWindow(URL url) {
+        String key = getFileName(url);
+        FileWindow w = (FileWindow)getFileWindow(key);
+        if (w != null)
+        {
+            desk.getDesktopManager().deiconifyFrame(w);
+            desk.getDesktopManager().activateFrame(w);
+            w.show();
+            w.toFront();
+        }
+    }
+
+    public void highlighLineInScriptWindow(URL url, int lineNum) {
+        String key = getFileName(url);
+        FileWindow w = (FileWindow)getFileWindow(key);
+        if (w != null)
+        {
+            showFileWindow(key, lineNum);
+        }
+    }
+
+    public Object runScriptWindow(URL scriptUrl) throws Exception
+    {
+        String key = getFileName(scriptUrl);
+        FileWindow w = (FileWindow)getFileWindow(key);
+        Object result = null;
+        w.toFront();
+        if (w != null)
+        {
+            Scriptable scope = officeScripts.getScriptScope(key);
+            if (scope == null)
+            {
+                MessageDialogWrapper.showMessageDialog(this, "Can't load scripts: no scope available", "Run", JOptionPane.ERROR_MESSAGE);
+            }
+            else
+            {
+                String url = w.getUrl();
+                if (url != null) 
+                {
+                    if (officeScripts.isScriptRunning(key))
+                    {
+                        return result;
+                    }
+                    officeScripts.setScriptRunning(key, true);
+                    try {
+                        result = dim.evalScriptWithReturn(url, w.textArea.getText(), scope);
+                    } catch (Exception exc) {
+                        exc.printStackTrace();
+                        throw exc;
+                    } finally {
+                        officeScripts.setScriptRunning(key, false);
+                    }
+                }
+            }
+        }
+        return result;
+    }
+
+    public boolean isModified(URL url) 
+    {
+        String key = getFileName(url);
+        FileWindow w = (FileWindow)getFileWindow(key);
+        return w.isModified();
+    }
+
+    public String getText(URL url)
+    {
+        String key = getFileName(url);
+        FileWindow w = (FileWindow)getFileWindow(key);
+        return w.getText();
+    }
+
 }
 
 /**
@@ -1590,7 +1733,9 @@
         case KeyEvent.VK_ENTER:
         case KeyEvent.VK_DELETE:
         case KeyEvent.VK_TAB:
-            e.consume();
+            if (! w.isEditable()) {
+                e.consume();
+            }
             break;
         }
     }
@@ -1599,14 +1744,18 @@
      * Called when a key is typed.
      */
     public void keyTyped(KeyEvent e) {
-        e.consume();
+        if (! w.isEditable()) {
+            e.consume();
+        }
     }
 
     /**
      * Called when a key is released.
      */
     public void keyReleased(KeyEvent e) {
-        e.consume();
+        if (! w.isEditable()) {
+            e.consume();
+        }
     }
 }
 
@@ -2089,7 +2238,7 @@
 /**
  * An internal frame for script files.
  */
-class FileWindow extends JInternalFrame implements ActionListener {
+class FileWindow extends JInternalFrame implements ActionListener, DocumentListener {
 
     /**
      * Serializable magic number.
@@ -2126,6 +2275,7 @@
      */
     int currentPos;
 
+    boolean isModified = false;
     /**
      * Loads the file.
      */
@@ -2134,11 +2284,62 @@
         if (url != null) {
             RunProxy proxy = new RunProxy(debugGui, RunProxy.LOAD_FILE);
             proxy.fileName = url;
-            proxy.text = sourceInfo.source();
+            proxy.text = textArea.getText();
+            proxy.scope = debugGui.officeScripts.getScriptScope(url);
             new Thread(proxy).start();
         }
     }
 
+    void save() {
+        String url = getUrl();
+        if (url != null) {
+            OutputStream os = null;
+            try {
+                if (url.startsWith("vnd.sun.star"))
+                {
+                    URL scriptUrl = debugGui.officeScripts.getScriptUrl(url);
+                    if ( scriptUrl == null )
+                    {
+                        throw new IOException("Can't optain stream for " + url);
+                    }
+                    os = scriptUrl.openConnection().getOutputStream();
+                }
+                else
+                {
+                   os = new FileOutputStream(url);
+                }
+                String s = textArea.getText();
+                os.write(s.getBytes(), 0, s.length());
+
+                this.isModified = false;
+            } catch (IOException ioe) {
+                MessageDialogWrapper.showMessageDialog(this,
+                    "Error saving file: " + ioe.getMessage(),
+                    "Error", JOptionPane.ERROR_MESSAGE);
+            }
+            finally
+            {
+                if ( os != null )
+                {
+                    try
+                    {
+                        os.close();
+                        os = null;
+                    }
+                    catch( IOException ioe )
+                    {
+                        System.err.println("Error closing stream: " + ioe.getMessage() );
+                        ioe.printStackTrace();
+                    }
+                }
+            }
+        }
+    }
+
+    public boolean isEditable() {
+        return debugGui.isSourceEditingEnabled();
+    }
+
     /**
      * Returns the offset position for the given line.
      */
@@ -2214,7 +2415,16 @@
         pack();
         updateText(sourceInfo);
         textArea.select(0);
+        addInternalFrameListener( new InternalFrameAdapter() {
+            public void internalFrameClosed(InternalFrameEvent e) {
+                getDebugGui().removeScript( getUrl() );
+            }
+        } );
     }
+    
+    public SwingGui getDebugGui() {
+        return debugGui;
+    }
 
     /**
      * Updates the tool tip contents.
@@ -2249,7 +2459,10 @@
         this.sourceInfo = sourceInfo;
         String newText = sourceInfo.source();
         if (!textArea.getText().equals(newText)) {
+            textArea.getDocument().removeDocumentListener(this);
             textArea.setText(newText);
+            this.isModified = false;
+            textArea.getDocument().addDocumentListener(this);
             int pos = 0;
             if (currentPos != -1) {
                 pos = currentPos;
@@ -2260,6 +2473,31 @@
         fileHeader.repaint();
     }
 
+    /* Implementation of DocumentListener interface */
+    public void insertUpdate(DocumentEvent e) {
+        doChanged(e);
+    }
+
+    public void removeUpdate(DocumentEvent e) {
+        doChanged(e);
+    }
+
+    public void changedUpdate(DocumentEvent e) {
+        doChanged(e);
+    }
+
+    public void doChanged(DocumentEvent e) {
+        this.isModified = true;
+    }
+
+    public boolean isModified() {
+        return this.isModified;
+    }
+
+    public String getText() {
+        return textArea.getText();
+    }
+
     /**
      * Sets the cursor position.
      */
@@ -2295,11 +2533,11 @@
     public void actionPerformed(ActionEvent e) {
         String cmd = e.getActionCommand();
         if (cmd.equals("Cut")) {
-            // textArea.cut();
+             textArea.cut();
         } else if (cmd.equals("Copy")) {
             textArea.copy();
         } else if (cmd.equals("Paste")) {
-            // textArea.paste();
+             textArea.paste();
         }
     }
 }
@@ -2920,7 +3158,7 @@
      */
     public ContextWindow(final SwingGui debugGui) {
         this.debugGui = debugGui;
-        enabled = false;
+        enabled = true;
         JPanel left = new JPanel();
         JToolBar t1 = new JToolBar();
         t1.setName("Variables");
@@ -3161,6 +3399,10 @@
     public void enableUpdate() {
         enabled = true;
     }
+    
+    public boolean isEnabled() {
+        return enabled;
+    }
 
     // ActionListener
 
@@ -3249,8 +3491,10 @@
     Menubar(SwingGui debugGui) {
         super();
         this.debugGui = debugGui;
-        String[] fileItems  = {"Open...", "Run...", "", "Exit"};
-        String[] fileCmds  = {"Open", "Load", "", "Exit"};
+        // String[] fileItems  = {"Open...", "Run...", "", "Exit"};
+        // String[] fileCmds  = {"Open", "Load", "", "Exit"};
+        String[] fileItems  = {"Run", "Save", "", "Exit"};
+        String[] fileCmds  = {"Run", "Save", "", "Exit"};
         char[] fileShortCuts = {'0', 'N', 0, 'X'};
         int[] fileAccelerators = {KeyEvent.VK_O,
                                   KeyEvent.VK_N,
@@ -3299,6 +3543,8 @@
                                            editShortCuts[i]);
             item.addActionListener(this);
             editMenu.add(item);
+            if (i < 3)
+                runOnlyItems.add(item);
         }
         for (int i = 0; i < plafItems.length; ++i) {
             JMenuItem item = new JMenuItem(plafItems[i],
@@ -3348,9 +3594,9 @@
         item.addActionListener(this);
         windowMenu.add(item = new JMenuItem("Tile", 'T'));
         item.addActionListener(this);
-        windowMenu.addSeparator();
-        windowMenu.add(item = new JMenuItem("Console", 'C'));
-        item.addActionListener(this);
+        // windowMenu.addSeparator();
+        // windowMenu.add(item = new JMenuItem("Console", 'C'));
+        // item.addActionListener(this);
         add(windowMenu);
 
         updateEnabled(false);
@@ -3530,6 +3776,11 @@
      * interruption, if any.
      */
     String alertMessage;
+    
+    /**
+     * The arguments for evaluation.
+     */
+    Scriptable scope;
 
     /**
      * Creates a new RunProxy.
@@ -3556,7 +3807,10 @@
 
           case LOAD_FILE:
             try {
-                debugGui.dim.evalScript(fileName, text);
+                if (scope != null)
+                    debugGui.dim.evalScriptWithReturn(fileName, text, scope);
+                else
+                    debugGui.dim.evalScript(fileName, text);
             } catch (RuntimeException ex) {
                 MessageDialogWrapper.showMessageDialog(
                     debugGui, ex.getMessage(), "Run error for "+fileName,
Index: toolsrc/org/mozilla/javascript/tools/debugger/OfficeScriptInfo.java
===================================================================
--- toolsrc/org/mozilla/javascript/tools/debugger/OfficeScriptInfo.java	(revision 2)
+++ misc/build/rhino1_7R3/toolsrc/org/mozilla/javascript/tools/debugger/OfficeScriptInfo.java	(working copy)
@@ -1 +1,124 @@
-dummy
+/**************************************************************
+ * 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * 
+ *************************************************************/
+
+
+package org.mozilla.javascript.tools.debugger;
+import java.net.URL;
+import java.util.Hashtable;
+import org.mozilla.javascript.Scriptable;
+
+public class OfficeScriptInfo
+{
+    private Hashtable<String, SFScriptInfo> loadedSFScripts = new Hashtable<String, SFScriptInfo>();
+   
+    public void addScript( URL url, Scriptable scope, Runnable closeCallback )
+    {
+        addScript( url.toString(), url, scope, closeCallback );
+    }
+
+    public void addScript( String key, URL url, Scriptable scope, Runnable closeCallback )
+    {
+        SFScriptInfo si = (SFScriptInfo)loadedSFScripts.get( key );
+        if ( si == null )
+        {
+            si = new SFScriptInfo();
+            si.url = url;
+            si.scope = scope; 
+            si.closeCallback = closeCallback; 
+            loadedSFScripts.put( key, si );
+        }  
+    }   
+
+    public void deleteScript( String key )
+    {
+        SFScriptInfo info = (SFScriptInfo)loadedSFScripts.remove( key );
+        if ( info != null )
+        {
+            if ( info.closeCallback != null )
+            {
+                System.out.println("** In removeSFScriptInfo  have callback for " + key );
+                info.closeCallback.run(); // really need to do this in separate thread????
+            }
+        }
+    }
+
+    public Scriptable getScriptScope( String key )
+    {
+        Scriptable result = null;
+        SFScriptInfo info = (SFScriptInfo)loadedSFScripts.get( key );
+        if ( info != null )
+        {
+            result = info.scope;
+        }
+        return result;
+    } 
+  
+    public URL getScriptUrl( String key )
+    {
+        URL result = null;
+        SFScriptInfo info = (SFScriptInfo)loadedSFScripts.get( key );
+        if ( info != null )
+        {
+            result = info.url;
+        }
+        return result;
+    } 
+    public boolean hasScript( String key )
+    {
+        boolean result = true;
+        SFScriptInfo info = (SFScriptInfo)loadedSFScripts.get( key );
+        if ( info == null )
+        {
+            result = false;
+        }      
+        return result;
+    } 
+
+    public void setScriptRunning( String key, boolean running )
+    {
+        SFScriptInfo info = (SFScriptInfo)loadedSFScripts.get( key );
+        if ( info != null )
+        {
+            info.isExecuting = running;
+        }
+    }
+
+    public boolean isScriptRunning( String key )
+    {
+        boolean result = false;
+        SFScriptInfo info = (SFScriptInfo)loadedSFScripts.get( key );
+        if ( info != null )
+        {
+            result = info.isExecuting;
+        }
+        return result;
+    }
+
+    
+  
+    class SFScriptInfo
+    {
+        Scriptable scope;
+        boolean isExecuting;
+        URL url;
+        Runnable closeCallback;
+    }
+}
Index: toolsrc/build.xml
===================================================================
--- toolsrc/build.xml	(revision 1)
+++ misc/build/rhino1_7R3/toolsrc/build.xml	(working copy)
@@ -40,6 +40,24 @@
 -->
 <project name="toolsrc" default="compile" basedir="..">
 
+  <condition property="boot_refID" value="macPath" else="nonMacPath">
+    <and>
+      <os family="mac"/>
+      <os family="unix"/>
+    </and>
+  </condition>
+  <path id="macPath" location="${java.home}/../Classes/classes.jar"/>
+  <!-- rhino.jar from OpenJDK breaks build -->
+  <path id="nonMacPath">
+    <fileset dir="${java.home}/">
+       <include name="jre/lib/*.jar"/>
+       <include name="lib/*.jar"/>
+       <exclude name="jre/lib/rhino.jar"/>
+       <exclude name="lib/rhino.jar"/>
+     </fileset>
+  </path>
+  <path id="my.bootstrap.classpath" refID="${boot_refID}"/>
+
   <target name="properties">
     <property file="build.properties"/>
   </target>
Index: src/org/mozilla/javascript/DefiningClassLoader.java
===================================================================
--- src/org/mozilla/javascript/DefiningClassLoader.java	(revision 1)
+++ misc/build/rhino1_7R3/src/org/mozilla/javascript/DefiningClassLoader.java	(working copy)
@@ -39,6 +39,8 @@
 
 package org.mozilla.javascript;
 
+import java.lang.reflect.Method;
+import java.lang.reflect.InvocationTargetException;
 /**
  * Load generated classes.
  *
@@ -48,13 +50,33 @@
     implements GeneratedClassLoader
 {
     public DefiningClassLoader() {
-        this.parentLoader = getClass().getClassLoader();
+		this.parentLoader = getClass().getClassLoader();
+        init();
     }
 
     public DefiningClassLoader(ClassLoader parentLoader) {
-        this.parentLoader = parentLoader;
+		this.parentLoader = parentLoader;
+        init();
     }
 
+    private void init() {
+        this.contextLoader = null;
+        if (method_getContextClassLoader != null) {
+            try {
+                this.contextLoader = (ClassLoader)
+                    method_getContextClassLoader.invoke(
+                        Thread.currentThread(),
+                        ScriptRuntime.emptyArgs);
+            } catch (IllegalAccessException ex) {
+            } catch (InvocationTargetException ex) {
+            } catch (SecurityException ex) {
+            }
+            if (this.contextLoader == this.parentLoader) {
+                this.contextLoader = null;
+            }
+        }
+    }
+
     public Class<?> defineClass(String name, byte[] data) {
         // Use our own protection domain for the generated classes.
         // TODO: we might want to use a separate protection domain for classes
@@ -73,10 +95,14 @@
     {
         Class<?> cl = findLoadedClass(name);
         if (cl == null) {
-            if (parentLoader != null) {
-                cl = parentLoader.loadClass(name);
+            if (contextLoader == null) {
+                cl = loadFromParent(name);
             } else {
-                cl = findSystemClass(name);
+                try {
+                    cl = loadFromParent(name);
+                } catch (ClassNotFoundException ex) {
+                    cl = contextLoader.loadClass(name);
+                }
             }
         }
         if (resolve) {
@@ -85,5 +111,36 @@
         return cl;
     }
 
+    private Class loadFromParent(String name)
+        throws ClassNotFoundException
+    {
+        if (parentLoader != null) {
+            return parentLoader.loadClass(name);
+        } else {
+            return findSystemClass(name);
+        }
+    }
+
     private final ClassLoader parentLoader;
+
+    private ClassLoader contextLoader;
+
+    // We'd like to use "Thread.getContextClassLoader", but
+    // that's only available on Java2.
+    private static Method method_getContextClassLoader;
+
+    static {
+        try {
+            // Don't use "Thread.class": that performs the lookup
+            // in the class initializer, which doesn't allow us to
+            // catch possible security exceptions.
+            Class threadClass = Class.forName("java.lang.Thread");
+            method_getContextClassLoader =
+                threadClass.getDeclaredMethod("getContextClassLoader",
+                                               new Class[0]);
+        } catch (ClassNotFoundException e) {
+        } catch (NoSuchMethodException e) {
+        } catch (SecurityException e) {
+        }
+    }
 }
