Pārlūkot izejas kodu

Handling exception while GetJSONObject in script debugger.

During GetChildren phase when we try to build JSON object we might throw exception. That skipped calling .Detach on the AutoPtr - which leads to release
the debugger property again.
Fixed that by catching and discarding the exception.
Akrosh Gandhi 6 gadi atpakaļ
vecāks
revīzija
797ddb02fa

+ 25 - 11
lib/Jsrt/JsrtDebuggerObject.cpp

@@ -85,15 +85,22 @@ Js::DynamicObject * JsrtDebuggerObjectBase::GetChildren(WeakArenaReference<Js::I
                 if (resolvedObjectDisplay != nullptr)
                 {
                     JsrtDebuggerObjectBase* debuggerObject = JsrtDebuggerObjectProperty::Make(this->GetDebuggerObjectsManager(), objectDisplayWeakRef);
-                    Js::DynamicObject* object = debuggerObject->GetJSONObject(resolvedObject.scriptContext, /* forceSetValueProp */ false);
-                    Js::Var marshaledObj = Js::CrossSite::MarshalVar(scriptContext, object);
-                    if (resolvedObjectDisplay->IsFake())
+                    try
                     {
-                        Js::JavascriptOperators::OP_SetElementI((Js::Var)debuggerOnlyPropertiesArray, Js::JavascriptNumber::ToVar(debuggerOnlyPropertiesArrayCount++, scriptContext), marshaledObj, scriptContext);
+                        Js::DynamicObject* object = debuggerObject->GetJSONObject(resolvedObject.scriptContext, /* forceSetValueProp */ false);
+                        Js::Var marshaledObj = Js::CrossSite::MarshalVar(scriptContext, object);
+                        if (resolvedObjectDisplay->IsFake())
+                        {
+                            Js::JavascriptOperators::OP_SetElementI((Js::Var)debuggerOnlyPropertiesArray, Js::JavascriptNumber::ToVar(debuggerOnlyPropertiesArrayCount++, scriptContext), marshaledObj, scriptContext);
+                        }
+                        else
+                        {
+                            Js::JavascriptOperators::OP_SetElementI((Js::Var)propertiesArray, Js::JavascriptNumber::ToVar(propertiesArrayCount++, scriptContext), marshaledObj, scriptContext);
+                        }
                     }
-                    else
+                    catch (const Js::JavascriptException& err)
                     {
-                        Js::JavascriptOperators::OP_SetElementI((Js::Var)propertiesArray, Js::JavascriptNumber::ToVar(propertiesArrayCount++, scriptContext), marshaledObj, scriptContext);
+                        err.GetAndClear();   // discard exception object
                     }
                     objectDisplayWeakRef->ReleaseStrongReference();
                     objectDisplayWeakRef.Detach();
@@ -415,11 +422,18 @@ Js::DynamicObject * JsrtDebuggerStackFrame::GetLocalsObject(Js::ScriptContext* s
                     {
                         AutoPtr<WeakArenaReference<Js::IDiagObjectModelDisplay>> objectDisplayWeakRef(resolvedObject.GetObjectDisplay());
                         JsrtDebuggerObjectBase* debuggerObject = JsrtDebuggerObjectScope::Make(debuggerObjectsManager, objectDisplayWeakRef, scopesCount);
-                        Js::DynamicObject* object = debuggerObject->GetJSONObject(resolvedObject.scriptContext, /* forceSetValueProp */ false);
-                        Assert(object != nullptr);
-                        Js::Var marshaledObj = Js::CrossSite::MarshalVar(scriptContext, object);
-                        Js::JavascriptOperators::OP_SetElementI((Js::Var)scopesArray, Js::JavascriptNumber::ToVar(scopesCount, scriptContext), marshaledObj, scriptContext);
-                        scopesCount++;
+                        try
+                        {
+                            Js::DynamicObject* object = debuggerObject->GetJSONObject(resolvedObject.scriptContext, /* forceSetValueProp */ false);
+                            Assert(object != nullptr);
+                            Js::Var marshaledObj = Js::CrossSite::MarshalVar(scriptContext, object);
+                            Js::JavascriptOperators::OP_SetElementI((Js::Var)scopesArray, Js::JavascriptNumber::ToVar(scopesCount, scriptContext), marshaledObj, scriptContext);
+                            scopesCount++;
+                        }
+                        catch (const Js::JavascriptException& err)
+                        {
+                            err.GetAndClear();   // discard exception object
+                        }
                         objectDisplayWeakRef.Detach();
                     }
                 }

+ 18 - 0
test/Debugger/exceptionWhileFetchingProp.js

@@ -0,0 +1,18 @@
+//-------------------------------------------------------------------------------------------------------
+// Copyright (C) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
+//-------------------------------------------------------------------------------------------------------
+
+var p = new Proxy({x:10}, {
+    getOwnPropertyDescriptor: function (oTarget, sKey) {
+        throw new Error('');
+        return { configurable: true, enumerable: true, value: 5 };
+    }
+  });
+  
+  function f() {
+    var j = 1; /**bp:evaluate('p',1);**/
+  }
+  f();
+  print('Pass');
+  

+ 10 - 0
test/Debugger/exceptionWhileFetchingProp.js.dbg.baseline

@@ -0,0 +1,10 @@
+[
+  {
+    "evaluate": {
+      "p": {
+        "#__proto__": "Object {...}",
+        "[Proxy]": "Proxy {...}"
+      }
+    }
+  }
+]

+ 6 - 0
test/Debugger/rlexe.xml

@@ -114,4 +114,10 @@
       <files>loadscript_after_detach.js</files>
     </default>
   </test>
+  <test>
+    <default>
+      <compile-flags>-debuglaunch -dbgbaseline:exceptionWhileFetchingProp.js.dbg.baseline</compile-flags>
+      <files>exceptionWhileFetchingProp.js</files>
+    </default>
+  </test>
 </regress-exe>