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