Commit ab5addd8 authored by jochen@chromium.org's avatar jochen@chromium.org

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
parent 8544d67b
...@@ -80,6 +80,13 @@ endif ...@@ -80,6 +80,13 @@ endif
ifeq ($(extrachecks), off) ifeq ($(extrachecks), off)
GYPFLAGS += -Dv8_enable_extra_checks=0 GYPFLAGS += -Dv8_enable_extra_checks=0
endif 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 # gdbjit=on/off
ifeq ($(gdbjit), on) ifeq ($(gdbjit), on)
GYPFLAGS += -Dv8_enable_gdbjit=1 GYPFLAGS += -Dv8_enable_gdbjit=1
......
...@@ -490,6 +490,7 @@ ...@@ -490,6 +490,7 @@
'Debug': { 'Debug': {
'variables': { 'variables': {
'v8_enable_extra_checks%': 1, 'v8_enable_extra_checks%': 1,
'v8_enable_handle_zapping%': 1,
}, },
'defines': [ 'defines': [
'DEBUG', 'DEBUG',
...@@ -518,6 +519,9 @@ ...@@ -518,6 +519,9 @@
['v8_enable_extra_checks==1', { ['v8_enable_extra_checks==1', {
'defines': ['ENABLE_EXTRA_CHECKS',], 'defines': ['ENABLE_EXTRA_CHECKS',],
}], }],
['v8_enable_handle_zapping==1', {
'defines': ['ENABLE_HANDLE_ZAPPING',],
}],
['OS=="linux" or OS=="freebsd" or OS=="openbsd" or OS=="netbsd"', { ['OS=="linux" or OS=="freebsd" or OS=="openbsd" or OS=="netbsd"', {
'cflags': [ '-Wall', '<(werror)', '-W', '-Wno-unused-parameter', 'cflags': [ '-Wall', '<(werror)', '-W', '-Wno-unused-parameter',
'-Wnon-virtual-dtor', '-Woverloaded-virtual' ], '-Wnon-virtual-dtor', '-Woverloaded-virtual' ],
...@@ -550,11 +554,15 @@ ...@@ -550,11 +554,15 @@
'Release': { 'Release': {
'variables': { 'variables': {
'v8_enable_extra_checks%': 0, 'v8_enable_extra_checks%': 0,
'v8_enable_handle_zapping%': 1,
}, },
'conditions': [ 'conditions': [
['v8_enable_extra_checks==1', { ['v8_enable_extra_checks==1', {
'defines': ['ENABLE_EXTRA_CHECKS',], 'defines': ['ENABLE_EXTRA_CHECKS',],
}], }],
['v8_enable_handle_zapping==1', {
'defines': ['ENABLE_HANDLE_ZAPPING',],
}],
['OS=="linux" or OS=="freebsd" or OS=="openbsd" or OS=="netbsd"', { ['OS=="linux" or OS=="freebsd" or OS=="openbsd" or OS=="netbsd"', {
'cflags!': [ 'cflags!': [
'-O2', '-O2',
......
...@@ -7979,7 +7979,7 @@ DeferredHandles::~DeferredHandles() { ...@@ -7979,7 +7979,7 @@ DeferredHandles::~DeferredHandles() {
isolate_->UnlinkDeferredHandles(this); isolate_->UnlinkDeferredHandles(this);
for (int i = 0; i < blocks_.length(); i++) { for (int i = 0; i < blocks_.length(); i++) {
#ifdef ENABLE_EXTRA_CHECKS #ifdef ENABLE_HANDLE_ZAPPING
HandleScope::ZapRange(blocks_[i], &blocks_[i][kHandleBlockSize]); HandleScope::ZapRange(blocks_[i], &blocks_[i][kHandleBlockSize]);
#endif #endif
isolate_->handle_scope_implementer()->ReturnBlock(blocks_[i]); isolate_->handle_scope_implementer()->ReturnBlock(blocks_[i]);
......
...@@ -665,17 +665,22 @@ void HandleScopeImplementer::DeleteExtensions(internal::Object** prev_limit) { ...@@ -665,17 +665,22 @@ void HandleScopeImplementer::DeleteExtensions(internal::Object** prev_limit) {
#ifdef DEBUG #ifdef DEBUG
// SealHandleScope may make the prev_limit to point inside the block. // SealHandleScope may make the prev_limit to point inside the block.
if (block_start <= prev_limit && prev_limit <= block_limit) { if (block_start <= prev_limit && prev_limit <= block_limit) {
#ifdef ENABLE_EXTRA_CHECKS #ifdef ENABLE_HANDLE_ZAPPING
internal::HandleScope::ZapRange(prev_limit, block_limit); internal::HandleScope::ZapRange(prev_limit, block_limit);
#endif #endif
break; break;
} }
#else #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 #endif
blocks_.RemoveLast(); blocks_.RemoveLast();
#ifdef ENABLE_EXTRA_CHECKS #ifdef ENABLE_HANDLE_ZAPPING
internal::HandleScope::ZapRange(block_start, block_limit); internal::HandleScope::ZapRange(block_start, block_limit);
#endif #endif
if (spare_ != NULL) { if (spare_ != NULL) {
......
...@@ -78,7 +78,7 @@ class GlobalHandles::Node { ...@@ -78,7 +78,7 @@ class GlobalHandles::Node {
Internals::kNodeIsPartiallyDependentShift); Internals::kNodeIsPartiallyDependentShift);
} }
#ifdef ENABLE_EXTRA_CHECKS #ifdef ENABLE_HANDLE_ZAPPING
~Node() { ~Node() {
// TODO(1428): if it's a weak handle we should have invoked its callback. // TODO(1428): if it's a weak handle we should have invoked its callback.
// Zap the values for eager trapping. // Zap the values for eager trapping.
...@@ -117,7 +117,7 @@ class GlobalHandles::Node { ...@@ -117,7 +117,7 @@ class GlobalHandles::Node {
void Release() { void Release() {
ASSERT(state() != FREE); ASSERT(state() != FREE);
set_state(FREE); set_state(FREE);
#ifdef ENABLE_EXTRA_CHECKS #ifdef ENABLE_HANDLE_ZAPPING
// Zap the values for eager trapping. // Zap the values for eager trapping.
object_ = reinterpret_cast<Object*>(kGlobalHandleZapValue); object_ = reinterpret_cast<Object*>(kGlobalHandleZapValue);
class_id_ = v8::HeapProfiler::kPersistentHandleNoClassId; class_id_ = v8::HeapProfiler::kPersistentHandleNoClassId;
......
...@@ -134,7 +134,7 @@ void HandleScope::CloseScope(Isolate* isolate, ...@@ -134,7 +134,7 @@ void HandleScope::CloseScope(Isolate* isolate,
DeleteExtensions(isolate); DeleteExtensions(isolate);
} }
#ifdef ENABLE_EXTRA_CHECKS #ifdef ENABLE_HANDLE_ZAPPING
ZapRange(prev_next, prev_limit); ZapRange(prev_next, prev_limit);
#endif #endif
} }
......
...@@ -101,7 +101,7 @@ void HandleScope::DeleteExtensions(Isolate* isolate) { ...@@ -101,7 +101,7 @@ void HandleScope::DeleteExtensions(Isolate* isolate) {
} }
#ifdef ENABLE_EXTRA_CHECKS #ifdef ENABLE_HANDLE_ZAPPING
void HandleScope::ZapRange(Object** start, Object** end) { void HandleScope::ZapRange(Object** start, Object** end) {
ASSERT(end - start <= kHandleBlockSize); ASSERT(end - start <= kHandleBlockSize);
for (Object** p = start; p != end; p++) { for (Object** p = start; p != end; p++) {
...@@ -554,7 +554,7 @@ v8::Handle<v8::Array> GetKeysForNamedInterceptor(Handle<JSReceiver> receiver, ...@@ -554,7 +554,7 @@ v8::Handle<v8::Array> GetKeysForNamedInterceptor(Handle<JSReceiver> receiver,
LOG(isolate, ApiObjectAccess("interceptor-named-enum", *object)); LOG(isolate, ApiObjectAccess("interceptor-named-enum", *object));
result = args.Call(enum_fun); result = args.Call(enum_fun);
} }
#if ENABLE_EXTRA_CHECKS #if ENABLE_HANDLE_ZAPPING
CHECK(result.IsEmpty() || v8::Utils::OpenHandle(*result)->IsJSObject()); CHECK(result.IsEmpty() || v8::Utils::OpenHandle(*result)->IsJSObject());
#endif #endif
return v8::Local<v8::Array>::New(reinterpret_cast<v8::Isolate*>(isolate), return v8::Local<v8::Array>::New(reinterpret_cast<v8::Isolate*>(isolate),
...@@ -575,7 +575,7 @@ v8::Handle<v8::Array> GetKeysForIndexedInterceptor(Handle<JSReceiver> receiver, ...@@ -575,7 +575,7 @@ v8::Handle<v8::Array> GetKeysForIndexedInterceptor(Handle<JSReceiver> receiver,
v8::ToCData<v8::IndexedPropertyEnumerator>(interceptor->enumerator()); v8::ToCData<v8::IndexedPropertyEnumerator>(interceptor->enumerator());
LOG(isolate, ApiObjectAccess("interceptor-indexed-enum", *object)); LOG(isolate, ApiObjectAccess("interceptor-indexed-enum", *object));
result = args.Call(enum_fun); result = args.Call(enum_fun);
#if ENABLE_EXTRA_CHECKS #if ENABLE_HANDLE_ZAPPING
CHECK(result.IsEmpty() || v8::Utils::OpenHandle(*result)->IsJSObject()); CHECK(result.IsEmpty() || v8::Utils::OpenHandle(*result)->IsJSObject());
#endif #endif
} }
......
...@@ -177,7 +177,7 @@ class HandleScope { ...@@ -177,7 +177,7 @@ class HandleScope {
// Extend the handle scope making room for more handles. // Extend the handle scope making room for more handles.
static internal::Object** Extend(Isolate* isolate); static internal::Object** Extend(Isolate* isolate);
#ifdef ENABLE_EXTRA_CHECKS #ifdef ENABLE_HANDLE_ZAPPING
// Zaps the handles in the half-open interval [start, end). // Zaps the handles in the half-open interval [start, end).
static void ZapRange(Object** start, Object** end); static void ZapRange(Object** start, Object** end);
#endif #endif
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment