64 lines
1.7 KiB
Plaintext
64 lines
1.7 KiB
Plaintext
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#import "base/mac/scoped_nsexception_enabler.h"
|
|
|
|
#import "base/lazy_instance.h"
|
|
#import "base/threading/thread_local.h"
|
|
|
|
// To make the |g_exceptionsAllowed| declaration readable.
|
|
using base::LazyInstance;
|
|
using base::ThreadLocalBoolean;
|
|
|
|
// When C++ exceptions are disabled, the C++ library defines |try| and
|
|
// |catch| so as to allow exception-expecting C++ code to build properly when
|
|
// language support for exceptions is not present. These macros interfere
|
|
// with the use of |@try| and |@catch| in Objective-C files such as this one.
|
|
// Undefine these macros here, after everything has been #included, since
|
|
// there will be no C++ uses and only Objective-C uses from this point on.
|
|
#undef try
|
|
#undef catch
|
|
|
|
namespace {
|
|
|
|
// Whether to allow NSExceptions to be raised on the current thread.
|
|
LazyInstance<ThreadLocalBoolean>::Leaky
|
|
g_exceptionsAllowed = LAZY_INSTANCE_INITIALIZER;
|
|
|
|
} // namespace
|
|
|
|
namespace base {
|
|
namespace mac {
|
|
|
|
bool GetNSExceptionsAllowed() {
|
|
return g_exceptionsAllowed.Get().Get();
|
|
}
|
|
|
|
void SetNSExceptionsAllowed(bool allowed) {
|
|
return g_exceptionsAllowed.Get().Set(allowed);
|
|
}
|
|
|
|
id RunBlockIgnoringExceptions(BlockReturningId block) {
|
|
id ret = nil;
|
|
@try {
|
|
base::mac::ScopedNSExceptionEnabler enable;
|
|
ret = block();
|
|
}
|
|
@catch(id exception) {
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
ScopedNSExceptionEnabler::ScopedNSExceptionEnabler() {
|
|
was_enabled_ = GetNSExceptionsAllowed();
|
|
SetNSExceptionsAllowed(true);
|
|
}
|
|
|
|
ScopedNSExceptionEnabler::~ScopedNSExceptionEnabler() {
|
|
SetNSExceptionsAllowed(was_enabled_);
|
|
}
|
|
|
|
} // namespace mac
|
|
} // namespace base
|