| Index: Source/bindings/v8/ThenableCoercions.h
|
| diff --git a/Source/bindings/v8/ThenableCoercions.h b/Source/bindings/v8/ThenableCoercions.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..074c044da11a452a6022e9091623b6b605ed0c64
|
| --- /dev/null
|
| +++ b/Source/bindings/v8/ThenableCoercions.h
|
| @@ -0,0 +1,107 @@
|
| +/*
|
| + * Copyright (C) 2013, Google Inc. All rights reserved.
|
| + *
|
| + * Redistribution and use in source and binary forms, with or without
|
| + * modification, are permitted provided that the following conditions
|
| + * are met:
|
| + * 1. Redistributions of source code must retain the above copyright
|
| + * notice, this list of conditions and the following disclaimer.
|
| + * 2. Redistributions in binary form must reproduce the above copyright
|
| + * notice, this list of conditions and the following disclaimer in the
|
| + * documentation and/or other materials provided with the distribution.
|
| + *
|
| + * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
|
| + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
| + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
| + * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
|
| + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
| + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
| + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
| + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
| + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
| + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| + */
|
| +
|
| +#ifndef ThenableCoercions_h
|
| +#define ThenableCoercions_h
|
| +
|
| +#include "bindings/v8/ScopedPersistent.h"
|
| +#include "wtf/Assertions.h"
|
| +#include "wtf/DoublyLinkedList.h"
|
| +#include "wtf/Noncopyable.h"
|
| +#include "wtf/PassOwnPtr.h"
|
| +#include "wtf/Vector.h"
|
| +
|
| +#include <v8.h>
|
| +
|
| +namespace WebCore {
|
| +
|
| +class ThenableCoercions {
|
| + WTF_MAKE_NONCOPYABLE(ThenableCoercions);
|
| +public:
|
| + static PassOwnPtr<ThenableCoercions> create();
|
| +
|
| + ThenableCoercions();
|
| + ~ThenableCoercions();
|
| +
|
| + bool has(v8::Handle<v8::Object> thenable);
|
| + v8::Handle<v8::Object> get(v8::Handle<v8::Object> thenable);
|
| + void set(v8::Handle<v8::Object> thenable, v8::Handle<v8::Object> promise, v8::Isolate*);
|
| +
|
| +private:
|
| + class Entry : public DoublyLinkedListNode<Entry> {
|
| + WTF_MAKE_NONCOPYABLE(Entry);
|
| + friend class DoublyLinkedListNode<Entry>;
|
| + public:
|
| + static Entry* create(v8::Handle<v8::Object> thenable, v8::Handle<v8::Object> promise, ThenableCoercions* thenableCoercions, v8::Isolate* isolate)
|
| + {
|
| + return new Entry(thenable, promise, thenableCoercions, isolate);
|
| + }
|
| +
|
| + v8::Local<v8::Object> thenable()
|
| + {
|
| + return m_thenable.newLocal(m_isolate);
|
| + }
|
| +
|
| + v8::Local<v8::Object> promise()
|
| + {
|
| + return m_promise.newLocal(m_isolate);
|
| + }
|
| +
|
| + private:
|
| + Entry(v8::Handle<v8::Object> thenable, v8::Handle<v8::Object> promise, ThenableCoercions*, v8::Isolate*);
|
| +
|
| + static void makeWeakCallback(v8::Isolate*, v8::Persistent<v8::Object>* thenable, Entry*);
|
| +
|
| + Entry* m_next;
|
| + Entry* m_prev;
|
| + ScopedPersistent<v8::Object> m_thenable;
|
| + ScopedPersistent<v8::Object> m_promise;
|
| + ThenableCoercions* m_thenableCoercions;
|
| + v8::Isolate* m_isolate;
|
| + };
|
| +
|
| + class GuardEntriesListAgainstGC {
|
| + WTF_MAKE_NONCOPYABLE(GuardEntriesListAgainstGC);
|
| + public:
|
| + GuardEntriesListAgainstGC(ThenableCoercions*);
|
| + ~GuardEntriesListAgainstGC();
|
| +
|
| + private:
|
| + ThenableCoercions* m_thenableCoercions;
|
| + };
|
| +
|
| + friend class Entry;
|
| + friend class GuardEntriesListAgainstGC;
|
| +
|
| + void tryToDelete(Entry*);
|
| + void deleteInternal(Entry*);
|
| +
|
| + DoublyLinkedList<Entry> m_entries;
|
| + Vector<Entry*> m_entriesToDelete;
|
| + bool m_entriesListGuarded : 1;
|
| +};
|
| +
|
| +} // namespace WebCore
|
| +
|
| +#endif // ThenableCoercions_h
|
|
|