blob: d169e9e4a191ca1c78ef84d5c0e0332fb489b4ca (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
* vim: set ts=8 sts=2 et sw=2 tw=80:
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "js/Exception.h"
#include "js/Context.h" // js::AssertHeapIsIdle
#include "vm/JSContext.h"
#include "vm/SavedFrame.h"
using namespace js;
bool JS::StealPendingExceptionStack(JSContext* cx,
JS::ExceptionStack* exceptionStack) {
if (!GetPendingExceptionStack(cx, exceptionStack)) {
return false;
}
// "Steal" exception by clearing it.
cx->clearPendingException();
return true;
}
bool JS::GetPendingExceptionStack(JSContext* cx,
JS::ExceptionStack* exceptionStack) {
AssertHeapIsIdle();
CHECK_THREAD(cx);
MOZ_ASSERT(exceptionStack);
MOZ_ASSERT(cx->isExceptionPending());
RootedValue exception(cx);
if (!cx->getPendingException(&exception)) {
return false;
}
RootedObject stack(cx, cx->getPendingExceptionStack());
exceptionStack->init(exception, stack);
return true;
}
void JS::SetPendingExceptionStack(JSContext* cx,
const JS::ExceptionStack& exceptionStack) {
AssertHeapIsIdle();
CHECK_THREAD(cx);
// We don't check the compartments of `exception` and `stack` here,
// because we're not doing anything with them other than storing
// them, and stored exception values can be in an abitrary
// compartment while stored stack values are always the unwrapped
// object anyway.
Rooted<SavedFrame*> nstack(cx);
if (exceptionStack.stack()) {
nstack = &UncheckedUnwrap(exceptionStack.stack())->as<SavedFrame>();
}
cx->setPendingException(exceptionStack.exception(), nstack);
}
|