1bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block/* 2bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block * Copyright (C) 2003, 2008, 2009 Apple Inc. All rights reserved. 3bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block * Copyright 2010, The Android Open Source Project 4bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block * 5bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block * Redistribution and use in source and binary forms, with or without 6bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block * modification, are permitted provided that the following conditions 7bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block * are met: 8bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block * 1. Redistributions of source code must retain the above copyright 9bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block * notice, this list of conditions and the following disclaimer. 10bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block * 2. Redistributions in binary form must reproduce the above copyright 11bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block * notice, this list of conditions and the following disclaimer in the 12bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block * documentation and/or other materials provided with the distribution. 13bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block * 14bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 15bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 17bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 18bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 19bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 20bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 21bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 22bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 24bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block */ 26bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block 27bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block#ifndef BridgeJSC_h 28bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block#define BridgeJSC_h 29bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block 30bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block#if USE(JSC) 31bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block 32bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block#include <runtime/JSString.h> 33bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block#include <wtf/HashMap.h> 34bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block#include <wtf/RefCounted.h> 35bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block#include <wtf/Vector.h> 36bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block 37bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Blocknamespace JSC { 38bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block 39bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Blockclass ArgList; 40bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Blockclass Identifier; 41bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Blockclass JSGlobalObject; 42bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Blockclass PropertyNameArray; 43bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Blockclass RuntimeObjectImp; 44bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block 45bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Blocknamespace Bindings { 46bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block 47bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Blockclass Instance; 48bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Blockclass Method; 49bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Blockclass RootObject; 50bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block 51bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Blocktypedef Vector<Method*> MethodList; 52bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block 53bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Blockclass Field { 54bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Blockpublic: 55bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block virtual JSValue valueFromInstance(ExecState*, const Instance*) const = 0; 56bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block virtual void setValueToInstance(ExecState*, const Instance*, JSValue) const = 0; 57bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block 58bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block virtual ~Field() { } 59bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block}; 60bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block 61bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Blockclass Class : public Noncopyable { 62bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Blockpublic: 63bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block virtual MethodList methodsNamed(const Identifier&, Instance*) const = 0; 64bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block virtual Field* fieldNamed(const Identifier&, Instance*) const = 0; 65bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block virtual JSValue fallbackObject(ExecState*, Instance*, const Identifier&) { return jsUndefined(); } 66bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block 67bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block virtual ~Class() { } 68bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block}; 69bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block 70bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Blocktypedef void (*KJSDidExecuteFunctionPtr)(ExecState*, JSObject* rootObject); 71bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block 72bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Blockclass Instance : public RefCounted<Instance> { 73bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Blockpublic: 74bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block Instance(PassRefPtr<RootObject>); 75bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block 76bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block static void setDidExecuteFunction(KJSDidExecuteFunctionPtr func); 77bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block static KJSDidExecuteFunctionPtr didExecuteFunction(); 78bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block 79bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block // These functions are called before and after the main entry points into 80bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block // the native implementations. They can be used to establish and cleanup 81bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block // any needed state. 82bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block void begin(); 83bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block void end(); 84bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block 85bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block virtual Class* getClass() const = 0; 86bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block RuntimeObjectImp* createRuntimeObject(ExecState*); 87bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block void willInvalidateRuntimeObject(); 88bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block void willDestroyRuntimeObject(); 89bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block 90bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block // Returns false if the value was not set successfully. 91bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block virtual bool setValueOfUndefinedField(ExecState*, const Identifier&, JSValue) { return false; } 92bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block 93bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block virtual JSValue invokeMethod(ExecState*, const MethodList&, const ArgList& args) = 0; 94bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block 95bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block virtual bool supportsInvokeDefaultMethod() const { return false; } 96bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block virtual JSValue invokeDefaultMethod(ExecState*, const ArgList&) { return jsUndefined(); } 97bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block 98bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block virtual bool supportsConstruct() const { return false; } 99bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block virtual JSValue invokeConstruct(ExecState*, const ArgList&) { return JSValue(); } 100bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block 101bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block virtual void getPropertyNames(ExecState*, PropertyNameArray&) { } 102bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block 103bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block virtual JSValue defaultValue(ExecState*, PreferredPrimitiveType) const = 0; 104bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block 105bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block virtual JSValue valueOf(ExecState* exec) const = 0; 106bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block 107bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block RootObject* rootObject() const; 108bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block 109bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block virtual ~Instance(); 110bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block 111bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block virtual bool getOwnPropertySlot(JSObject*, ExecState*, const Identifier&, PropertySlot&) { return false; } 112bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block virtual bool getOwnPropertyDescriptor(JSObject*, ExecState*, const Identifier&, PropertyDescriptor&) { return false; } 113bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block virtual void put(JSObject*, ExecState*, const Identifier&, JSValue, PutPropertySlot&) { } 114bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block 115bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Blockprotected: 116bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block virtual void virtualBegin() { } 117bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block virtual void virtualEnd() { } 118bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block virtual RuntimeObjectImp* newRuntimeObject(ExecState*); 119bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block 120bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block RefPtr<RootObject> m_rootObject; 121bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block 122bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Blockprivate: 123bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block RuntimeObjectImp* m_runtimeObject; 124bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block}; 125bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block 126bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Blockclass Array : public Noncopyable { 127bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Blockpublic: 128bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block Array(PassRefPtr<RootObject>); 129bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block virtual ~Array(); 130bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block 131bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block virtual void setValueAt(ExecState*, unsigned index, JSValue) const = 0; 132bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block virtual JSValue valueAt(ExecState*, unsigned index) const = 0; 133bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block virtual unsigned int getLength() const = 0; 134bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block 135bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Blockprotected: 136bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block RefPtr<RootObject> m_rootObject; 137bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block}; 138bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block 139bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Blockconst char* signatureForParameters(const ArgList&); 140bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block 141bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Blocktypedef HashMap<RefPtr<UString::Rep>, MethodList*> MethodListMap; 142bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Blocktypedef HashMap<RefPtr<UString::Rep>, Method*> MethodMap; 143bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Blocktypedef HashMap<RefPtr<UString::Rep>, Field*> FieldMap; 144bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block 145bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block} // namespace Bindings 146bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block 147bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block} // namespace JSC 148bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block 149bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block#endif // USE(JSC) 150bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block 151bd0a8b8ddfa1230848d33782c0e0f04f739dd550Steve Block#endif 152