Skip to content

Commit 797ddb0

Browse files
akroshgwyrichte
authored andcommitted
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.
1 parent c70af48 commit 797ddb0

File tree

4 files changed

+59
-11
lines changed

4 files changed

+59
-11
lines changed

lib/Jsrt/JsrtDebuggerObject.cpp

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -85,15 +85,22 @@ Js::DynamicObject * JsrtDebuggerObjectBase::GetChildren(WeakArenaReference<Js::I
8585
if (resolvedObjectDisplay != nullptr)
8686
{
8787
JsrtDebuggerObjectBase* debuggerObject = JsrtDebuggerObjectProperty::Make(this->GetDebuggerObjectsManager(), objectDisplayWeakRef);
88-
Js::DynamicObject* object = debuggerObject->GetJSONObject(resolvedObject.scriptContext, /* forceSetValueProp */ false);
89-
Js::Var marshaledObj = Js::CrossSite::MarshalVar(scriptContext, object);
90-
if (resolvedObjectDisplay->IsFake())
88+
try
9189
{
92-
Js::JavascriptOperators::OP_SetElementI((Js::Var)debuggerOnlyPropertiesArray, Js::JavascriptNumber::ToVar(debuggerOnlyPropertiesArrayCount++, scriptContext), marshaledObj, scriptContext);
90+
Js::DynamicObject* object = debuggerObject->GetJSONObject(resolvedObject.scriptContext, /* forceSetValueProp */ false);
91+
Js::Var marshaledObj = Js::CrossSite::MarshalVar(scriptContext, object);
92+
if (resolvedObjectDisplay->IsFake())
93+
{
94+
Js::JavascriptOperators::OP_SetElementI((Js::Var)debuggerOnlyPropertiesArray, Js::JavascriptNumber::ToVar(debuggerOnlyPropertiesArrayCount++, scriptContext), marshaledObj, scriptContext);
95+
}
96+
else
97+
{
98+
Js::JavascriptOperators::OP_SetElementI((Js::Var)propertiesArray, Js::JavascriptNumber::ToVar(propertiesArrayCount++, scriptContext), marshaledObj, scriptContext);
99+
}
93100
}
94-
else
101+
catch (const Js::JavascriptException& err)
95102
{
96-
Js::JavascriptOperators::OP_SetElementI((Js::Var)propertiesArray, Js::JavascriptNumber::ToVar(propertiesArrayCount++, scriptContext), marshaledObj, scriptContext);
103+
err.GetAndClear(); // discard exception object
97104
}
98105
objectDisplayWeakRef->ReleaseStrongReference();
99106
objectDisplayWeakRef.Detach();
@@ -415,11 +422,18 @@ Js::DynamicObject * JsrtDebuggerStackFrame::GetLocalsObject(Js::ScriptContext* s
415422
{
416423
AutoPtr<WeakArenaReference<Js::IDiagObjectModelDisplay>> objectDisplayWeakRef(resolvedObject.GetObjectDisplay());
417424
JsrtDebuggerObjectBase* debuggerObject = JsrtDebuggerObjectScope::Make(debuggerObjectsManager, objectDisplayWeakRef, scopesCount);
418-
Js::DynamicObject* object = debuggerObject->GetJSONObject(resolvedObject.scriptContext, /* forceSetValueProp */ false);
419-
Assert(object != nullptr);
420-
Js::Var marshaledObj = Js::CrossSite::MarshalVar(scriptContext, object);
421-
Js::JavascriptOperators::OP_SetElementI((Js::Var)scopesArray, Js::JavascriptNumber::ToVar(scopesCount, scriptContext), marshaledObj, scriptContext);
422-
scopesCount++;
425+
try
426+
{
427+
Js::DynamicObject* object = debuggerObject->GetJSONObject(resolvedObject.scriptContext, /* forceSetValueProp */ false);
428+
Assert(object != nullptr);
429+
Js::Var marshaledObj = Js::CrossSite::MarshalVar(scriptContext, object);
430+
Js::JavascriptOperators::OP_SetElementI((Js::Var)scopesArray, Js::JavascriptNumber::ToVar(scopesCount, scriptContext), marshaledObj, scriptContext);
431+
scopesCount++;
432+
}
433+
catch (const Js::JavascriptException& err)
434+
{
435+
err.GetAndClear(); // discard exception object
436+
}
423437
objectDisplayWeakRef.Detach();
424438
}
425439
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
//-------------------------------------------------------------------------------------------------------
2+
// Copyright (C) Microsoft. All rights reserved.
3+
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
4+
//-------------------------------------------------------------------------------------------------------
5+
6+
var p = new Proxy({x:10}, {
7+
getOwnPropertyDescriptor: function (oTarget, sKey) {
8+
throw new Error('');
9+
return { configurable: true, enumerable: true, value: 5 };
10+
}
11+
});
12+
13+
function f() {
14+
var j = 1; /**bp:evaluate('p',1);**/
15+
}
16+
f();
17+
print('Pass');
18+
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
[
2+
{
3+
"evaluate": {
4+
"p": {
5+
"#__proto__": "Object {...}",
6+
"[Proxy]": "Proxy {...}"
7+
}
8+
}
9+
}
10+
]

test/Debugger/rlexe.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,4 +114,10 @@
114114
<files>loadscript_after_detach.js</files>
115115
</default>
116116
</test>
117+
<test>
118+
<default>
119+
<compile-flags>-debuglaunch -dbgbaseline:exceptionWhileFetchingProp.js.dbg.baseline</compile-flags>
120+
<files>exceptionWhileFetchingProp.js</files>
121+
</default>
122+
</test>
117123
</regress-exe>

0 commit comments

Comments
 (0)