Commit d00a1439 authored by danno@chromium.org's avatar danno@chromium.org

Add trampoline to enable pointer -> handle code calls

R=mstarzinger@chromium.org

Review URL: https://codereview.chromium.org/18550002

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@15507 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 240c7ace
......@@ -564,6 +564,82 @@ Handle<Object> Factory::NewNumberFromSize(size_t value,
}
// Used to "safely" transition from pointer-based runtime code to Handle-based
// runtime code. When a GC happens during the called Handle-based code, a
// failure object is returned to the pointer-based code to cause it abort and
// re-trigger a gc of it's own. Since this double-gc will cause the Handle-based
// code to be called twice, it must be idempotent.
class IdempotentPointerToHandleCodeTrampoline {
public:
explicit IdempotentPointerToHandleCodeTrampoline(Isolate* isolate)
: isolate_(isolate) {}
template<typename R>
MUST_USE_RESULT MaybeObject* Call(R (*function)()) {
int collections = isolate_->heap()->gc_count();
(*function)();
return (collections == isolate_->heap()->gc_count())
? isolate_->heap()->true_value()
: reinterpret_cast<MaybeObject*>(Failure::RetryAfterGC());
}
template<typename R>
MUST_USE_RESULT MaybeObject* CallWithReturnValue(R (*function)()) {
int collections = isolate_->heap()->gc_count();
Object* result = (*function)();
return (collections == isolate_->heap()->gc_count())
? result
: reinterpret_cast<MaybeObject*>(Failure::RetryAfterGC());
}
template<typename R, typename P1>
MUST_USE_RESULT MaybeObject* Call(R (*function)(P1), P1 p1) {
int collections = isolate_->heap()->gc_count();
(*function)(p1);
return (collections == isolate_->heap()->gc_count())
? isolate_->heap()->true_value()
: reinterpret_cast<MaybeObject*>(Failure::RetryAfterGC());
}
template<typename R, typename P1>
MUST_USE_RESULT MaybeObject* CallWithReturnValue(
R (*function)(P1),
P1 p1) {
int collections = isolate_->heap()->gc_count();
Object* result = (*function)(p1);
return (collections == isolate_->heap()->gc_count())
? result
: reinterpret_cast<MaybeObject*>(Failure::RetryAfterGC());
}
template<typename R, typename P1, typename P2>
MUST_USE_RESULT MaybeObject* Call(
R (*function)(P1, P2),
P1 p1,
P2 p2) {
int collections = isolate_->heap()->gc_count();
(*function)(p1, p2);
return (collections == isolate_->heap()->gc_count())
? isolate_->heap()->true_value()
: reinterpret_cast<MaybeObject*>(Failure::RetryAfterGC());
}
template<typename R, typename P1, typename P2>
MUST_USE_RESULT MaybeObject* CallWithReturnValue(
R (*function)(P1, P2),
P1 p1,
P2 p2) {
int collections = isolate_->heap()->gc_count();
Object* result = (*function)(p1, p2);
return (collections == isolate_->heap()->gc_count())
? result
: reinterpret_cast<MaybeObject*>(Failure::RetryAfterGC());
}
private:
Isolate* isolate_;
};
} } // namespace v8::internal
......
......@@ -1812,6 +1812,8 @@ class Heap {
void QueueMemoryChunkForFree(MemoryChunk* chunk);
void FreeQueuedChunks();
int gc_count() const { return gc_count_; }
// Completely clear the Instanceof cache (to stop it keeping objects alive
// around a GC).
inline void CompletelyClearInstanceofCache();
......
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