Introduce a handle zapping setting, and enable it by default for release and debug
The checks are split out from "extra checks" which are too expensive to turn on by default. R=danno@chromium.org Review URL: https://codereview.chromium.org/18316006 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@15548 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
8544d67b44
commit
ab5addd86d
7
Makefile
7
Makefile
@ -80,6 +80,13 @@ endif
|
||||
ifeq ($(extrachecks), off)
|
||||
GYPFLAGS += -Dv8_enable_extra_checks=0
|
||||
endif
|
||||
# handlezapping=on/off
|
||||
ifeq ($(handlezapping), on)
|
||||
GYPFLAGS += -Dv8_enable_handle_zapping=1
|
||||
endif
|
||||
ifeq ($(handlezapping), off)
|
||||
GYPFLAGS += -Dv8_enable_handle_zapping=0
|
||||
endif
|
||||
# gdbjit=on/off
|
||||
ifeq ($(gdbjit), on)
|
||||
GYPFLAGS += -Dv8_enable_gdbjit=1
|
||||
|
@ -490,6 +490,7 @@
|
||||
'Debug': {
|
||||
'variables': {
|
||||
'v8_enable_extra_checks%': 1,
|
||||
'v8_enable_handle_zapping%': 1,
|
||||
},
|
||||
'defines': [
|
||||
'DEBUG',
|
||||
@ -518,6 +519,9 @@
|
||||
['v8_enable_extra_checks==1', {
|
||||
'defines': ['ENABLE_EXTRA_CHECKS',],
|
||||
}],
|
||||
['v8_enable_handle_zapping==1', {
|
||||
'defines': ['ENABLE_HANDLE_ZAPPING',],
|
||||
}],
|
||||
['OS=="linux" or OS=="freebsd" or OS=="openbsd" or OS=="netbsd"', {
|
||||
'cflags': [ '-Wall', '<(werror)', '-W', '-Wno-unused-parameter',
|
||||
'-Wnon-virtual-dtor', '-Woverloaded-virtual' ],
|
||||
@ -550,11 +554,15 @@
|
||||
'Release': {
|
||||
'variables': {
|
||||
'v8_enable_extra_checks%': 0,
|
||||
'v8_enable_handle_zapping%': 1,
|
||||
},
|
||||
'conditions': [
|
||||
['v8_enable_extra_checks==1', {
|
||||
'defines': ['ENABLE_EXTRA_CHECKS',],
|
||||
}],
|
||||
['v8_enable_handle_zapping==1', {
|
||||
'defines': ['ENABLE_HANDLE_ZAPPING',],
|
||||
}],
|
||||
['OS=="linux" or OS=="freebsd" or OS=="openbsd" or OS=="netbsd"', {
|
||||
'cflags!': [
|
||||
'-O2',
|
||||
|
@ -7979,7 +7979,7 @@ DeferredHandles::~DeferredHandles() {
|
||||
isolate_->UnlinkDeferredHandles(this);
|
||||
|
||||
for (int i = 0; i < blocks_.length(); i++) {
|
||||
#ifdef ENABLE_EXTRA_CHECKS
|
||||
#ifdef ENABLE_HANDLE_ZAPPING
|
||||
HandleScope::ZapRange(blocks_[i], &blocks_[i][kHandleBlockSize]);
|
||||
#endif
|
||||
isolate_->handle_scope_implementer()->ReturnBlock(blocks_[i]);
|
||||
|
11
src/api.h
11
src/api.h
@ -665,17 +665,22 @@ void HandleScopeImplementer::DeleteExtensions(internal::Object** prev_limit) {
|
||||
#ifdef DEBUG
|
||||
// SealHandleScope may make the prev_limit to point inside the block.
|
||||
if (block_start <= prev_limit && prev_limit <= block_limit) {
|
||||
#ifdef ENABLE_EXTRA_CHECKS
|
||||
#ifdef ENABLE_HANDLE_ZAPPING
|
||||
internal::HandleScope::ZapRange(prev_limit, block_limit);
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
#else
|
||||
if (prev_limit == block_limit) break;
|
||||
if (prev_limit == block_limit) {
|
||||
#ifdef ENABLE_HANDLE_ZAPPING
|
||||
internal::HandleScope::ZapRange(prev_limit, block_limit);
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
blocks_.RemoveLast();
|
||||
#ifdef ENABLE_EXTRA_CHECKS
|
||||
#ifdef ENABLE_HANDLE_ZAPPING
|
||||
internal::HandleScope::ZapRange(block_start, block_limit);
|
||||
#endif
|
||||
if (spare_ != NULL) {
|
||||
|
@ -78,7 +78,7 @@ class GlobalHandles::Node {
|
||||
Internals::kNodeIsPartiallyDependentShift);
|
||||
}
|
||||
|
||||
#ifdef ENABLE_EXTRA_CHECKS
|
||||
#ifdef ENABLE_HANDLE_ZAPPING
|
||||
~Node() {
|
||||
// TODO(1428): if it's a weak handle we should have invoked its callback.
|
||||
// Zap the values for eager trapping.
|
||||
@ -117,7 +117,7 @@ class GlobalHandles::Node {
|
||||
void Release() {
|
||||
ASSERT(state() != FREE);
|
||||
set_state(FREE);
|
||||
#ifdef ENABLE_EXTRA_CHECKS
|
||||
#ifdef ENABLE_HANDLE_ZAPPING
|
||||
// Zap the values for eager trapping.
|
||||
object_ = reinterpret_cast<Object*>(kGlobalHandleZapValue);
|
||||
class_id_ = v8::HeapProfiler::kPersistentHandleNoClassId;
|
||||
|
@ -134,7 +134,7 @@ void HandleScope::CloseScope(Isolate* isolate,
|
||||
DeleteExtensions(isolate);
|
||||
}
|
||||
|
||||
#ifdef ENABLE_EXTRA_CHECKS
|
||||
#ifdef ENABLE_HANDLE_ZAPPING
|
||||
ZapRange(prev_next, prev_limit);
|
||||
#endif
|
||||
}
|
||||
|
@ -101,7 +101,7 @@ void HandleScope::DeleteExtensions(Isolate* isolate) {
|
||||
}
|
||||
|
||||
|
||||
#ifdef ENABLE_EXTRA_CHECKS
|
||||
#ifdef ENABLE_HANDLE_ZAPPING
|
||||
void HandleScope::ZapRange(Object** start, Object** end) {
|
||||
ASSERT(end - start <= kHandleBlockSize);
|
||||
for (Object** p = start; p != end; p++) {
|
||||
@ -554,7 +554,7 @@ v8::Handle<v8::Array> GetKeysForNamedInterceptor(Handle<JSReceiver> receiver,
|
||||
LOG(isolate, ApiObjectAccess("interceptor-named-enum", *object));
|
||||
result = args.Call(enum_fun);
|
||||
}
|
||||
#if ENABLE_EXTRA_CHECKS
|
||||
#if ENABLE_HANDLE_ZAPPING
|
||||
CHECK(result.IsEmpty() || v8::Utils::OpenHandle(*result)->IsJSObject());
|
||||
#endif
|
||||
return v8::Local<v8::Array>::New(reinterpret_cast<v8::Isolate*>(isolate),
|
||||
@ -575,7 +575,7 @@ v8::Handle<v8::Array> GetKeysForIndexedInterceptor(Handle<JSReceiver> receiver,
|
||||
v8::ToCData<v8::IndexedPropertyEnumerator>(interceptor->enumerator());
|
||||
LOG(isolate, ApiObjectAccess("interceptor-indexed-enum", *object));
|
||||
result = args.Call(enum_fun);
|
||||
#if ENABLE_EXTRA_CHECKS
|
||||
#if ENABLE_HANDLE_ZAPPING
|
||||
CHECK(result.IsEmpty() || v8::Utils::OpenHandle(*result)->IsJSObject());
|
||||
#endif
|
||||
}
|
||||
|
@ -177,7 +177,7 @@ class HandleScope {
|
||||
// Extend the handle scope making room for more handles.
|
||||
static internal::Object** Extend(Isolate* isolate);
|
||||
|
||||
#ifdef ENABLE_EXTRA_CHECKS
|
||||
#ifdef ENABLE_HANDLE_ZAPPING
|
||||
// Zaps the handles in the half-open interval [start, end).
|
||||
static void ZapRange(Object** start, Object** end);
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user