You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by od...@apache.org on 2009/07/16 17:57:41 UTC

svn commit: r794726 [12/15] - in /harmony/enhanced/jdktools/branches/java6/modules/jpda: ./ src/main/native/include/ src/main/native/jdwp/common/agent/commands/ src/main/native/jdwp/common/agent/core/ src/main/native/jdwp/common/generic/ src/main/nativ...

Modified: harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/RequestManager.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/RequestManager.h?rev=794726&r1=794725&r2=794726&view=diff
==============================================================================
--- harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/RequestManager.h (original)
+++ harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/RequestManager.h Thu Jul 16 15:57:37 2009
@@ -15,12 +15,6 @@
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
-
-/**
- * @author Pavel N. Vyssotski
- * @version $Revision: 1.12.2.1 $
- */
-
 /**
  * @file
  * RequestManager.h
@@ -32,19 +26,17 @@
 #ifndef _REQUEST_MANAGER_H_
 #define _REQUEST_MANAGER_H_
 
-#include <vector>
+#include "Util.h"
 
 #include "AgentBase.h"
 #include "AgentMonitor.h"
-#include "AgentAllocator.h"
 #include "AgentEventRequest.h"
 #include "PacketParser.h"
 
 namespace jdwp {
 
     /** Type for list of event requests. */
-    typedef vector<AgentEventRequest*,
-        AgentAllocator<AgentEventRequest*> > RequestList;
+    typedef JDWPVector<AgentEventRequest> RequestList;
 
     /** Type for list iterator for event requests. */
     typedef RequestList::iterator RequestListIterator;
@@ -81,43 +73,43 @@
         /**
          * A constructor.
          */
-        CombinedEventsInfo() throw ();
+        CombinedEventsInfo();
 
         /**
          * A destructor.
          */
-        ~CombinedEventsInfo() throw ();
+        ~CombinedEventsInfo();
         
         /**
          * Stores information about location of initial combined event.
          */
-        void Init(JNIEnv *jni, EventInfo &eInfo) throw (OutOfMemoryException);
+        int Init(JNIEnv *jni, EventInfo &eInfo);
 
         /**
          * Clears information about stored events.
          */
-        void Clean(JNIEnv *jni) throw ();
+        void Clean(JNIEnv *jni);
 
         /**
          * Returns number of all combined events.
          */
-        int GetEventsCount() const throw ();
+        int GetEventsCount() const;
 
         /**
          * Returns number of all ignored callbacks.
          */
-        int GetIgnoredCallbacksCount() const throw ();
+        int GetIgnoredCallbacksCount() const;
 
         /**
          * Counts occured event callback and decreaces number of ignored callbacks
          * for this kind of combined event.
          */
-        void CountOccuredCallback(CombinedEventsKind combinedKind) throw ();
+        void CountOccuredCallback(CombinedEventsKind combinedKind);
 
     }; //CombinedEventsInfo
 
     /** Type for list of stored combined events info in all threads. */
-    typedef vector<CombinedEventsInfo*, AgentAllocator<CombinedEventsInfo*> > CombinedEventsInfoList;
+    typedef JDWPVector<CombinedEventsInfo> CombinedEventsInfoList;
 
     /**
      * The class manages events generated by the target VM and passes them to
@@ -130,12 +122,12 @@
         /**
          * A constructor.
          */
-        RequestManager() throw();
+        RequestManager();
 
         /**
          * A destructor.
          */
-        ~RequestManager() throw();
+        ~RequestManager();
 
         /**
          * Initializes the instance of <code>RequestManager</code>.
@@ -144,7 +136,7 @@
          *
          * @throws AgentException.
          */
-        void Init(JNIEnv* jni) throw(AgentException);
+        void Init(JNIEnv* jni);
 
         /**
          * Cleanups the instance of <code>RequestManager</code>.
@@ -153,7 +145,7 @@
          *
          * @throws AgentException.
          */
-        void Clean(JNIEnv* jni) throw(AgentException);
+        void Clean(JNIEnv* jni);
 
         /**
          * Resets the instance of <code>RequestManager</code>.
@@ -162,7 +154,7 @@
          *
          * @throws AgentException.
          */
-        void Reset(JNIEnv* jni) throw(AgentException);
+        void Reset(JNIEnv* jni);
 
         /**
          * Adds the given internal request to the list of requests of corresponding types.
@@ -172,8 +164,7 @@
          *
          * @throws AgentException.
          */
-        void AddInternalRequest(JNIEnv* jni, AgentEventRequest* request)
-            throw(AgentException);
+        int AddInternalRequest(JNIEnv* jni, AgentEventRequest* request);
 
         /**
          * Adds the given request to the list of requests of corresponding types 
@@ -184,8 +175,7 @@
          *
          * @throws AgentException.
          */
-        RequestID AddRequest(JNIEnv* jni, AgentEventRequest* request)
-            throw(AgentException);
+        RequestID AddRequest(JNIEnv* jni, AgentEventRequest* request);
 
         /**
          * Removes a request of the given kind with the given request ID.
@@ -196,8 +186,7 @@
          *
          * @throws AgentException.
          */
-        void DeleteRequest(JNIEnv* jni, jdwpEventKind kind, RequestID id)
-            throw(AgentException);
+        int DeleteRequest(JNIEnv* jni, jdwpEventKind kind, RequestID id);
 
         /**
          * Removes the given request from the corresponding request list.
@@ -207,8 +196,7 @@
          *
          * @throws AgentException.
          */
-        void DeleteRequest(JNIEnv* jni, AgentEventRequest* request)
-            throw(AgentException);
+        int DeleteRequest(JNIEnv* jni, AgentEventRequest* request);
 
         /**
          * Removes all requests with the given kind from the corresponding request list.
@@ -218,8 +206,7 @@
          *
          * @throws AgentException.
          */
-        void DeleteAllRequests(JNIEnv* jni, jdwpEventKind eventKind)
-            throw(AgentException);
+        void DeleteAllRequests(JNIEnv* jni, jdwpEventKind eventKind);
 
         /**
          * Removes all requests with <code>JDWP_EVENT_BREAKPOINT</code> 
@@ -229,14 +216,14 @@
          *
          * @throws AgentException.
          */
-        void DeleteAllBreakpoints(JNIEnv* jni) throw(AgentException);
+        void DeleteAllBreakpoints(JNIEnv* jni);
 
         /**
          * Returns the name of the given JDWP event kind.
          *
          * @param kind - the JDWP event kind
          */
-        const char* GetEventKindName(jdwpEventKind kind) const throw();
+        const char* GetEventKindName(jdwpEventKind kind) const;
 
         /**
          * Enables an internal step request for the <code>PopFrame</code> command.
@@ -246,7 +233,7 @@
          *
          * @exception <code>AgentException</code> is thrown, if any error occurs.
          */
-        void EnableInternalStepRequest(JNIEnv* jni, jthread thread) throw(AgentException);
+        int EnableInternalStepRequest(JNIEnv* jni, jthread thread);
 
         /**
          * Disables an internal step request after the <code>PopFrame</code> command.
@@ -256,7 +243,13 @@
          *
          * @exception <code>AgentException</code> is thrown, if any error occurs.
          */
-        void DisableInternalStepRequest(JNIEnv* jni, jthread thread) throw(AgentException);
+        int DisableInternalStepRequest(JNIEnv* jni, jthread thread);
+
+		 /**
+         * Returns the monitor for exception handling.
+         *
+         */
+		AgentMonitor* GetExceptionMonitor();
 
         // event callbacks
 
@@ -506,14 +499,14 @@
         /**
          * Enables/disables all appropriate events for given Breakpoint event request. 
          */
-        void ControlBreakpoint(JNIEnv* jni, AgentEventRequest* request,
-            bool enable) throw(AgentException);
+        int ControlBreakpoint(JNIEnv* jni, AgentEventRequest* request,
+            bool enable);
 
         /**
          * Enables/disables all appropriate events for given Watchpoint event request. 
          */
-        void ControlWatchpoint(JNIEnv* jni, AgentEventRequest* request,
-            bool enable) throw(AgentException);
+        int ControlWatchpoint(JNIEnv* jni, AgentEventRequest* request,
+            bool enable);
 
         /**
          * Enables/disables all appropriate events for given ClassUnload event request.
@@ -521,84 +514,80 @@
          * @return index of corresponding JVMTI extension event or 0 if not supported
          */
         jint ControlClassUnload(JNIEnv* jni, AgentEventRequest* request, 
-            bool enable) throw(AgentException);
+            bool enable);
 
         /**
          * Enables/disables all appropriate events for given event request. 
          */
-        void ControlEvent(JNIEnv* jni, AgentEventRequest* request, bool enable)
-            throw(AgentException);
+        int ControlEvent(JNIEnv* jni, AgentEventRequest* request, bool enable);
 
         /**
          * Returns all registered event requests for given event kind. 
          */
-        RequestList& GetRequestList(jdwpEventKind kind)
-            throw(AgentException);
+        RequestList& GetRequestList(jdwpEventKind kind);
 
         /**
          * Deletes step request for given thread if any. 
          */
-        void DeleteStepRequest(JNIEnv* jni, jthread thread)
-            throw(AgentException);
+        void DeleteStepRequest(JNIEnv* jni, jthread thread);
 
         /**
          * Finds step request for given thread if any. 
          */
-        StepRequest* FindStepRequest(JNIEnv* jni, jthread thread)
-            throw(AgentException);
+        StepRequest* FindStepRequest(JNIEnv* jni, jthread thread);
 
         /**
          * Write data for all combined events to event packet. 
          */
-        EventComposer* CombineEvents(JNIEnv* jni, CombinedEventsInfo* combEventsInfo, jdwpSuspendPolicy sp) 
-            throw(AgentException);
+        EventComposer* CombineEvents(JNIEnv* jni, CombinedEventsInfo* combEventsInfo, jdwpSuspendPolicy sp);
 
         /**
          * Find existing info about combined events for given thread. 
          */
-        CombinedEventsInfoList::iterator FindCombinedEventsInfo(JNIEnv *jni, jthread thread) throw(AgentException);
+        CombinedEventsInfoList::iterator FindCombinedEventsInfo(JNIEnv *jni, jthread thread);
 
         /**
          * Strore new info about combined events.
          */
-        void AddCombinedEventsInfo(JNIEnv *jni, CombinedEventsInfo* info) throw(AgentException);
+        void AddCombinedEventsInfo(JNIEnv *jni, CombinedEventsInfo* info);
 
         /**
          * Remove given info about combined events. 
          */
-        void DeleteCombinedEventsInfo(JNIEnv *jni, CombinedEventsInfoList::iterator p) throw(AgentException);
+        void DeleteCombinedEventsInfo(JNIEnv *jni, CombinedEventsInfoList::iterator p);
 
         /**
          * Checks if this combined event was predicted and should be ignored.
          * It also removes combined events info after all predicted events occured.
          */
         bool IsPredictedCombinedEvent(JNIEnv *jni, EventInfo& eInfo, 
-                    CombinedEventsInfo::CombinedEventsKind combinedKind) throw(AgentException);
+                    CombinedEventsInfo::CombinedEventsKind combinedKind);
 
         /**
          * Cleans all stored info about combined events.
          */
-        void DeleteAllCombinedEventsInfo(JNIEnv *jni) throw(AgentException);
+        void DeleteAllCombinedEventsInfo(JNIEnv *jni);
 
         /**
          * Checks if given location is first location of a method.
          */
-        bool IsMethodEntryLocation(JNIEnv* jni, EventInfo& eInfo) throw(AgentException);
+        //bool IsMethodEntryLocation(JNIEnv* jni, EventInfo& eInfo);
 
         /**
          * Checks if given location is last location of a method.
          */
-        bool IsMethodExitLocation(JNIEnv* jni, EventInfo& eInfo) throw(AgentException);
+        bool IsMethodExitLocation(JNIEnv* jni, EventInfo& eInfo);
 
         /**
          * Creates list of event request IDs matched to fired event.
          */
         void GenerateEvents(JNIEnv* jni, EventInfo &event, jint &eventCount, 
-                    RequestID* &eventList, jdwpSuspendPolicy &sp) throw(AgentException);
+                    RequestID* &eventList, jdwpSuspendPolicy &sp);
 
         RequestID m_requestIdCount;
         AgentMonitor* m_requestMonitor;
         AgentMonitor* m_combinedEventsMonitor;
+		AgentMonitor* m_exceptionMonitor;
 
         RequestList m_singleStepRequests;
         RequestList m_breakpointRequests;
@@ -616,6 +605,7 @@
         RequestList m_methodEntryRequests;
         RequestList m_methodExitRequests;
         RequestList m_vmDeathRequests;
+		RequestList m_vmStartRequests;
         // New list of event request IDs for Java 6
         RequestList m_methodExitWithReturnValueRequests;
         RequestList m_monitorContendedEnterRequests;

Modified: harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/RequestModifier.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/RequestModifier.cpp?rev=794726&r1=794725&r2=794726&view=diff
==============================================================================
--- harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/RequestModifier.cpp (original)
+++ harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/RequestModifier.cpp Thu Jul 16 15:57:37 2009
@@ -15,22 +15,15 @@
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
-
-/**
- * @author Pavel N. Vyssotski
- * @version $Revision: 1.3 $
- */
-// RequestModifier.cpp
+#include "RequestModifier.h"
 
 #include <string.h>
 
-#include "RequestModifier.h"
-
 using namespace jdwp;
 
 // match signature with pattern omitting first 'L' and last ";"
 bool RequestModifier::MatchPattern(const char *signature, const char *pattern)
-    const throw()
+    const
 {
     if (signature == 0) {
         return false;
@@ -54,55 +47,118 @@
     }
 }
 
-bool SourceNameMatchModifier::Apply(JNIEnv* jni, EventInfo &eInfo) throw()
+bool SourceNameMatchModifier::Apply(JNIEnv* jni, EventInfo &eInfo)
 {
     JDWP_ASSERT(eInfo.cls != 0);
     jclass jvmClass = eInfo.cls;
-    try {
-        char* sourceDebugExtension = 0;
-        char* sourceFileName = 0;
-        jvmtiError err;
-        // Get source name determined by SourceDebugExtension
-        JVMTI_TRACE(err, GetJvmtiEnv()->GetSourceDebugExtension(jvmClass,
-            &sourceDebugExtension));
-
-        if (err != JVMTI_ERROR_NONE) {
-            // Can be: JVMTI_ERROR_MUST_POSSESS_CAPABILITY,JVMTI_ERROR_ABSENT_INFORMATION,
-            // JVMTI_ERROR_INVALID_CLASS, JVMTI_ERROR_NULL_POINTER
-            if(err == JVMTI_ERROR_ABSENT_INFORMATION) {                   
-                // SourceDebugExtension is absent, get source name from SourceFile
-                JVMTI_TRACE(err, GetJvmtiEnv()->GetSourceFileName(jvmClass,
-                    &sourceFileName));
-
-                if (err != JVMTI_ERROR_NONE) {
-                    // Can be: JVMTI_ERROR_MUST_POSSESS_CAPABILITY, JVMTI_ERROR_ABSENT_INFORMATION,
-                    // JVMTI_ERROR_INVALID_CLASS, JVMTI_ERROR_NULL_POINTER
-                    throw AgentException(err);
-                 }
-                 JvmtiAutoFree autoFreeFieldName(sourceFileName);
-                 return MatchPatternSourceName(sourceFileName, m_pattern);
-                 } else { 
-                    throw AgentException(err);
-                 }
+
+    char* sourceDebugExtension = 0;
+    char* sourceFileName = 0;
+    jvmtiError err;
+    // Get source name determined by SourceDebugExtension
+    JVMTI_TRACE(LOG_DEBUG, err, GetJvmtiEnv()->GetSourceDebugExtension(jvmClass,
+        &sourceDebugExtension));
+
+    if (err != JVMTI_ERROR_NONE) {
+        // Can be: JVMTI_ERROR_MUST_POSSESS_CAPABILITY,JVMTI_ERROR_ABSENT_INFORMATION,
+        // JVMTI_ERROR_INVALID_CLASS, JVMTI_ERROR_NULL_POINTER
+        if(err == JVMTI_ERROR_ABSENT_INFORMATION) {                   
+            // SourceDebugExtension is absent, get source name from SourceFile
+            JVMTI_TRACE(LOG_DEBUG, err, GetJvmtiEnv()->GetSourceFileName(jvmClass,
+                &sourceFileName));
+
+            if (err != JVMTI_ERROR_NONE) {
+                // Can be: JVMTI_ERROR_MUST_POSSESS_CAPABILITY, JVMTI_ERROR_ABSENT_INFORMATION,
+                // JVMTI_ERROR_INVALID_CLASS, JVMTI_ERROR_NULL_POINTER
+                JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "JDWP error in SourceNameMatchModifier.Apply calling GetSourceFileName: %d", err));
+                return false;
             }
-            JvmtiAutoFree autoFreeDebugExtension(sourceDebugExtension);            
-          
-            string str(sourceDebugExtension);
-            JDWP_TRACE_DATA("JDWP sourceDebugExtension: " << str);
-            vector<string> tokens;
-            ParseSourceDebugExtension(str, tokens, "\n");
-            return MatchPatternSourceName(tokens[1].c_str(), m_pattern);
-    } catch (AgentException& e) {
-        JDWP_TRACE_DATA("JDWP error in SourceNameMatchModifier.Apply: " << e.what() << " [" << e.ErrCode() << "]");
-        return false;
+            JvmtiAutoFree autoFreeFieldName(sourceFileName);
+            bool result =  MatchPatternSourceName(sourceFileName, m_pattern);
+
+            if(!result) {
+                // replace '.' with '/' to be matched with signature
+                for (char* p = m_pattern; *p != '\0'; p++) {
+                    if (*p == '.') {
+                        *p = '/';
+                    }
+                }
+                JDWP_ASSERT(eInfo.signature != 0);
+                return MatchPattern(eInfo.signature, m_pattern);
+            } else {
+                return true;
+            }
+         } else { 
+             JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "JDWP error in SourceNameMatchModifier.Apply calling GetSourceDebugExtension: %d", err));
+             return false;
+         }
+    }
+    JvmtiAutoFree autoFreeDebugExtension(sourceDebugExtension);            
+      
+    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "JDWP sourceDebugExtension: %s", sourceDebugExtension));
+
+    // We want to get the 2nd token here, split by '\n'
+    char *tok = NULL;
+    tok = strtok(sourceDebugExtension, "\n"); // 1st token
+    if (tok == NULL) return false;
+    tok = strtok(NULL, "\n");
+    if (tok == NULL) return false;
+    if (MatchPatternSourceName(tok, m_pattern)) return true;
+    while(tok = strtok(NULL, "\n")) {
+        if (strlen(tok) >= 2) {
+            if (tok[0] == '*' && tok[1] == 'F' && tok[2] == '\0') {
+                tok = strtok(NULL, "\n");
+                if (tok == NULL) return false;
+                while (tok[0] != '*') {
+                    if (tok[0] == '+') {
+                        //format: + 1 HelloWorld.java\npath/HelloWorld.java
+                        // skip plus
+                        tok++;
+                        // skip spaces
+                        while (tok[0] == ' ' && tok[0] != 0) tok++;
+                        // skip int
+                        while (tok[0] >= '0' && tok[0] <= '9'
+                               && tok[0] != 0) tok++;
+                        // skip spaces
+                        while (tok[0] == ' ' && tok[0] != 0) tok++;
+                        if (tok[0] == 0) break;
+                        //printf("plus name = '%s'\n", tok);
+                        if (MatchPatternSourceName(tok, m_pattern)) {
+                            return true;
+                        }
+                        tok = strtok(NULL, "\n");
+                        if (tok == NULL) return false;
+                        //printf("full name = '%s'\n", tok);
+                        if (MatchPatternSourceName(tok, m_pattern)) {
+                            return true;
+                        }
+                    } else if (tok[0] >= '0' && tok[0] <= '9') {
+                        // format: 1 HelloWorld.java
+                        // skip the int
+                        while (tok[0] >= '0' && tok[0] <= '9'
+                               && tok[0] != 0) tok++;
+                        // skip spaces
+                        while (tok[0] == ' ' && tok[0] != 0) tok++;
+                        if (tok[0] == 0) break;
+                        //printf("file name = '%s'\n", tok);
+                        if (MatchPatternSourceName(tok, m_pattern)) {
+                            return true;
+                        }
+                    }
+                    tok = strtok(NULL, "\n");
+                    if (tok == NULL) return false;
+                }
+            }
+        }
     }
+    return false;
 }
 
 // match source name with pattern
 bool SourceNameMatchModifier::MatchPatternSourceName(const char *sourcename, const char *pattern)
     const 
 {
-    JDWP_TRACE_DATA("JDWP in SourceNameMatchModifier::MatchPatternSourceName");
+    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "JDWP in SourceNameMatchModifier::MatchPatternSourceName(%s, %s)", sourcename, pattern));
    if(sourcename == 0) {
         return false;
     }
@@ -123,14 +179,4 @@
     }
 }
 
-// parse SourceDebugExtension by "\n" delimiter
-void SourceNameMatchModifier::ParseSourceDebugExtension(const string& str, vector<string>& tokens, const string& delimiters)
-{
-    string::size_type lastPos = str.find_first_not_of(delimiters, 0);
-    string::size_type pos = str.find_first_of(delimiters, lastPos);
-    while (string::npos != pos || string::npos != lastPos) {
-        tokens.push_back(str.substr(lastPos, pos - lastPos));
-        lastPos = str.find_first_not_of(delimiters, pos);
-        pos = str.find_first_of(delimiters, lastPos);
-    }
-}
+

Modified: harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/RequestModifier.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/RequestModifier.h?rev=794726&r1=794725&r2=794726&view=diff
==============================================================================
--- harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/RequestModifier.h (original)
+++ harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/RequestModifier.h Thu Jul 16 15:57:37 2009
@@ -15,12 +15,6 @@
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
-
-/**
- * @author Pavel N. Vyssotski
- * @version $Revision: 1.10.2.1 $
- */
-
 /**
  * @file
  * RequestModifier.h
@@ -31,7 +25,7 @@
 #define _REQUEST_MODIFIER_H_
 
 #include "AgentBase.h"
-#include <vector>
+#include "ExceptionManager.h"
 
 namespace jdwp {
 
@@ -126,8 +120,8 @@
          *
          * @return <code>TRUE</code>.
          */
-        virtual bool Apply(JNIEnv* jni, EventInfo &eInfo) throw() {
-            JDWP_TRACE_DATA("RequestModifier.Apply is invoked.");
+        virtual bool Apply(JNIEnv* jni, EventInfo &eInfo) {
+            JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "RequestModifier.Apply is invoked."));
             return true;
         }
 
@@ -136,12 +130,12 @@
          *
          * @return The JDWP request modifier kind.
          */
-        jdwpRequestModifier GetKind() const throw() { return m_kind; }
+        jdwpRequestModifier GetKind() const { return m_kind; }
 
     protected:
 
         bool MatchPattern(const char *signature, const char *pattern)
-            const throw();
+            const;
         
 
         jdwpRequestModifier m_kind;
@@ -172,7 +166,7 @@
          *
          * @return The current value of the event counter.
          */
-        jint GetCount() const throw() { return m_count; }
+        jint GetCount() const { return m_count; }
 
         /**
          * Applies count filtering for the given event.
@@ -183,7 +177,7 @@
          * @return Returns <code>TRUE</code> if count is zero, otherwise 
          * <code>FALSE</code>.
          */
-        bool Apply(JNIEnv* jni, EventInfo &eInfo) throw()
+        bool Apply(JNIEnv* jni, EventInfo &eInfo)
         {
             if (m_count > 0) {
                 m_count--;
@@ -224,7 +218,7 @@
          *
          * @return The expression ID.
          */
-        jint GetExprID() const throw() { return m_exprID; }
+        jint GetExprID() const { return m_exprID; }
 
         /**
          * Applies filtering by the expression result for the given event.
@@ -234,7 +228,7 @@
          *
          * @return <code>TRUE</code> (not implemented).
          */
-        bool Apply(JNIEnv* jni, EventInfo &eInfo) throw() {
+        bool Apply(JNIEnv* jni, EventInfo &eInfo) {
             return true;
         }
 
@@ -260,12 +254,12 @@
          *
          * @throws OutOfMemoryException.
          */
-        ThreadOnlyModifier(JNIEnv *jni, jthread thread) throw(AgentException) :
+        ThreadOnlyModifier(JNIEnv *jni, jthread thread) :
             RequestModifier(JDWP_MODIFIER_THREAD_ONLY)
         {
             m_thread = jni->NewGlobalRef(thread);
             if (m_thread == 0) {
-                throw OutOfMemoryException();
+                JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "Error in ThreadOnlyModifier constructor - out of memory"));
             }
         }
 
@@ -281,7 +275,7 @@
          *
          * @return The Java thread.
          */
-        jthread GetThread() const throw() {
+        jthread GetThread() const {
             return m_thread;
         }
 
@@ -294,7 +288,7 @@
          * @return Returns <code>TRUE</code>, if the event occurs in the 
          *         thread of interest.
          */
-        bool Apply(JNIEnv* jni, EventInfo &eInfo) throw() 
+        bool Apply(JNIEnv* jni, EventInfo &eInfo) 
         {
             JDWP_ASSERT(eInfo.thread != 0);
             return (JNI_TRUE == jni->IsSameObject(eInfo.thread, m_thread));
@@ -322,12 +316,12 @@
          *
          * @throws OutOfMemoryException.
          */
-        ClassOnlyModifier(JNIEnv *jni, jclass cls) throw(AgentException) :
+        ClassOnlyModifier(JNIEnv *jni, jclass cls) :
             RequestModifier(JDWP_MODIFIER_CLASS_ONLY)
         {
             m_class = static_cast<jclass>(jni->NewGlobalRef(cls));
             if (m_class == 0) {
-                throw OutOfMemoryException();
+                JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "Error in ClassOnlyModifier constructor - out of memory"));
             }
         }
 
@@ -343,7 +337,7 @@
          *
          * @return The Java class.
          */
-        jclass GetClass() const throw() {
+        jclass GetClass() const {
             return m_class;
         }
 
@@ -355,9 +349,10 @@
          *
          * @return Returns <code>TRUE</code>, if event occurs in the class of interest.
          */
-        bool Apply(JNIEnv* jni, EventInfo &eInfo) throw()
+        bool Apply(JNIEnv* jni, EventInfo &eInfo)
         {
             JDWP_ASSERT(eInfo.cls != 0);
+            JDWP_TRACE(LOG_RELEASE, (LOG_EVENT_FL, "ClassOnlyModifier#Apply: eInfo.cls=%p, m_class=%p", eInfo.cls,  m_class));
             return (JNI_TRUE == jni->IsAssignableFrom(eInfo.cls, m_class));
         }
 
@@ -398,7 +393,7 @@
          *
          * @return Zero-terminated string.
          */
-        const char* GetPattern() const throw() {
+        const char* GetPattern() const {
             return m_pattern;
         }
 
@@ -410,7 +405,7 @@
          *
          * @return Returns <code>TRUE</code>, if the class signature matches the given pattern.
          */
-        bool Apply(JNIEnv* jni, EventInfo &eInfo) throw()
+        bool Apply(JNIEnv* jni, EventInfo &eInfo)
         {
             JDWP_ASSERT(eInfo.signature != 0);
             return (MatchPattern(eInfo.signature, m_pattern));
@@ -453,7 +448,7 @@
          *
          * @return Zero-terminated string.
          */
-        const char* GetPattern() const throw() {
+        const char* GetPattern() const {
             return m_pattern;
         }
 
@@ -466,7 +461,7 @@
          * @return Returns <code>TRUE</code>, if the class signature does not match 
          * the given pattern.
          */
-        bool Apply(JNIEnv* jni, EventInfo &eInfo) throw()
+        bool Apply(JNIEnv* jni, EventInfo &eInfo)
         {
             JDWP_ASSERT(eInfo.signature != 0);
             return (!MatchPattern(eInfo.signature, m_pattern));
@@ -497,14 +492,14 @@
          * @throws OutOfMemoryException.
          */
         LocationOnlyModifier(JNIEnv *jni, jclass cls, jmethodID method,
-                jlocation loc) throw(AgentException) :
+                jlocation loc) :
             RequestModifier(JDWP_MODIFIER_LOCATION_ONLY),
             m_method(method),
             m_location(loc)
         {
             m_class = static_cast<jclass>(jni->NewGlobalRef(cls));
             if (m_class == 0) {
-                throw OutOfMemoryException();
+                JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "Error in LocationOnlyModifier constructor - out of memory"));
             }
         }
 
@@ -520,7 +515,7 @@
          *
          * @return The Java class.
          */
-        jclass GetClass() const throw() {
+        jclass GetClass() const {
             return m_class;
         }
 
@@ -529,7 +524,7 @@
          *
          * @return The method ID.
          */
-        jmethodID GetMethod() const throw() { 
+        jmethodID GetMethod() const { 
             return m_method;
         }
 
@@ -538,7 +533,7 @@
          *
          * @return The Java location.
          */
-        jlocation GetLocation() const throw() {
+        jlocation GetLocation() const {
             return m_location;
         }
 
@@ -550,7 +545,7 @@
          *
          * @return Returns <code>TRUE</code>, if event location is equal to the given one.
          */
-        bool Apply(JNIEnv* jni, EventInfo &eInfo) throw()
+        bool Apply(JNIEnv* jni, EventInfo &eInfo)
         {
             JDWP_ASSERT(eInfo.cls != 0);
             return (eInfo.method == m_method && eInfo.location == m_location &&
@@ -585,7 +580,7 @@
          * @throws <code>OutOfMemoryException</code>.
          */
         ExceptionOnlyModifier(JNIEnv *jni, jclass cls, bool caught,
-                bool uncaught) throw(AgentException) :
+                bool uncaught) :
             RequestModifier(JDWP_MODIFIER_EXCEPTION_ONLY),
             m_caught(caught),
             m_uncaught(uncaught)
@@ -595,7 +590,7 @@
             } else {
                 m_class = static_cast<jclass>(jni->NewGlobalRef(cls));
                 if (m_class == 0) {
-                    throw OutOfMemoryException();
+                    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "Error in ExceptionOnlyModifier constructor - out of memory"));
                 }
             }
         }
@@ -612,7 +607,7 @@
          *
          * @return The Java class.
          */
-        jclass GetClass() const throw() {
+        jclass GetClass() const {
             return m_class;
         }
 
@@ -621,7 +616,7 @@
          *
          * @return Boolean.
          */
-        bool IsCaught() const throw() {
+        bool IsCaught() const {
             return m_caught;
         }
 
@@ -630,7 +625,7 @@
          *
          * @return Boolean.
          */
-        bool IsUncaught() const throw() {
+        bool IsUncaught() const {
             return m_uncaught;
         }
 
@@ -642,7 +637,7 @@
          *
          * @return Returns <code>TRUE</code>, if the event location is equal to the given one.
          */
-        bool Apply(JNIEnv* jni, EventInfo &eInfo) throw()
+        bool Apply(JNIEnv* jni, EventInfo &eInfo)
         {
             return ((eInfo.caught ? m_caught : m_uncaught) &&
                 (m_class == 0 || (eInfo.cls != 0 &&
@@ -676,13 +671,13 @@
          * @throws <code>OutOfMemoryException</code>.
          */
         FieldOnlyModifier(JNIEnv *jni, jclass cls,
-                jfieldID field) throw(AgentException) :
+                jfieldID field) :
             RequestModifier(JDWP_MODIFIER_FIELD_ONLY),
             m_field(field)
         {
             m_class = static_cast<jclass>(jni->NewGlobalRef(cls));
             if (m_class == 0) {
-                throw OutOfMemoryException();
+                JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "Error in FieldOnlyModifier constructor - out of memory"));
             }
         }
 
@@ -698,7 +693,7 @@
          *
          * @return The Java class.
          */
-        jclass GetClass() const throw() {
+        jclass GetClass() const {
             return m_class;
         }
 
@@ -707,7 +702,7 @@
          *
          * @return The field ID.
          */
-        jfieldID GetField() const throw() {
+        jfieldID GetField() const {
             return m_field;
         }
 
@@ -719,7 +714,7 @@
          *
          * @return Returns <code>TRUE</code>, if the event field is equal to the given one.
          */
-        bool Apply(JNIEnv* jni, EventInfo &eInfo) throw()
+        bool Apply(JNIEnv* jni, EventInfo &eInfo)
         {
             JDWP_ASSERT(eInfo.cls != 0);
             return (eInfo.field == m_field &&
@@ -753,14 +748,14 @@
          * @throws OutOfMemoryException.
          */
         StepModifier(JNIEnv *jni, jthread thread, jint size,
-                jint depth) throw(AgentException) :
+                jint depth) :
             RequestModifier(JDWP_MODIFIER_STEP),
             m_size(size),
             m_depth(depth)
         {
             m_thread = jni->NewGlobalRef(thread);
             if (m_thread == 0) {
-                throw OutOfMemoryException();
+                JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "Error in StepModifier constructor - out of memory"));
             }
         }
 
@@ -776,7 +771,7 @@
          *
          * @return The Java thread.
          */
-        jthread GetThread() const throw() {
+        jthread GetThread() const {
             return m_thread;
         }
 
@@ -785,7 +780,7 @@
          *
          * @return The int step size.
          */
-        jint GetSize() const throw() {
+        jint GetSize() const {
             return m_size;
         }
 
@@ -794,7 +789,7 @@
          *
          * @return The int step depth.
          */
-        jint GetDepth() const throw() {
+        jint GetDepth() const {
             return m_depth;
         }
 
@@ -807,7 +802,7 @@
          *
          * @return <code>TRUE</code>.
          */
-        bool Apply(JNIEnv* jni, EventInfo &eInfo) throw() {
+        bool Apply(JNIEnv* jni, EventInfo &eInfo) {
             return true;
         }
 
@@ -835,7 +830,7 @@
          *
          * @throws OutOfMemoryException.
          */
-        InstanceOnlyModifier(JNIEnv *jni, jobject obj) throw(AgentException) :
+        InstanceOnlyModifier(JNIEnv *jni, jobject obj) :
             RequestModifier(JDWP_MODIFIER_INSTANCE_ONLY)
         {
             if (obj == 0) {
@@ -843,7 +838,7 @@
             } else {
                 m_instance = jni->NewGlobalRef(obj);
                 if (m_instance == 0) {
-                    throw OutOfMemoryException();
+                    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "Error in InstanceOnlyModifier constructor - out of memory"));
                 }
             }
         }
@@ -860,7 +855,7 @@
          *
          * @return The Java object.
          */
-        jobject GetInstance() const throw() {
+        jobject GetInstance() const {
             return m_instance;
         }
 
@@ -873,25 +868,28 @@
          *
          * @return <code>TRUE</code>.
          */
-        bool Apply(JNIEnv* jni, EventInfo &eInfo) throw()
+        bool Apply(JNIEnv* jni, EventInfo &eInfo)
         {
             if (eInfo.instance == 0 &&
                 (eInfo.kind == JDWP_EVENT_SINGLE_STEP  ||
                  eInfo.kind == JDWP_EVENT_BREAKPOINT   ||
                  eInfo.kind == JDWP_EVENT_EXCEPTION    ||
                  eInfo.kind == JDWP_EVENT_METHOD_ENTRY ||
-                 eInfo.kind == JDWP_EVENT_METHOD_EXIT))
+                 eInfo.kind == JDWP_EVENT_METHOD_EXIT  ||
+                 eInfo.kind == JDWP_EVENT_METHOD_EXIT_WITH_RETURN_VALUE ))
             {
                 jint modifiers;
                 jvmtiError err;
-                JVMTI_TRACE(err, GetJvmtiEnv()->GetMethodModifiers(
+                JVMTI_TRACE(LOG_DEBUG, err, GetJvmtiEnv()->GetMethodModifiers(
                     eInfo.method, &modifiers));
                 if (err == JVMTI_ERROR_NONE && (modifiers & ACC_STATIC) == 0) {
                     // get "this" object from slot 0 (stated in JVM spec)
-                    JVMTI_TRACE(err, GetJvmtiEnv()->GetLocalObject(
+                    JVMTI_TRACE(LOG_DEBUG, err, GetJvmtiEnv()->GetLocalObject(
                         eInfo.thread, 0, 0, &eInfo.instance));
                 }
             }
+            JDWP_TRACE(LOG_RELEASE, (LOG_EVENT_FL, "InstanceOnlyModifier#Apply: m_instance=%p, eInfo.instance=%p," ,
+                    m_instance, eInfo.instance));
             return ((eInfo.instance == 0 && m_instance == 0) ||
                 ((eInfo.instance != 0 && m_instance != 0) &&
                  JNI_TRUE == jni->IsSameObject(eInfo.instance, m_instance)));
@@ -935,7 +933,7 @@
          *
          * @return Zero-terminated string.
          */
-        const char* GetPattern() const throw() {
+        const char* GetPattern() const {
             return m_pattern;
         }
 
@@ -947,13 +945,12 @@
          *
          * @return Returns <code>TRUE</code>, if the source name matches the given pattern.
          */
-        bool Apply(JNIEnv* jni, EventInfo &eInfo) throw();
+        bool Apply(JNIEnv* jni, EventInfo &eInfo);
       
 
     private:
         bool MatchPatternSourceName(const char *sourcename, const char *pattern)
             const ;
-        void ParseSourceDebugExtension(const string& str, vector<string>& tokens, const string& delimiters);
 
         char* m_pattern;