]> git.saurik.com Git - apple/javascriptcore.git/blame - bindings/runtime.h
JavaScriptCore-466.1.tar.gz
[apple/javascriptcore.git] / bindings / runtime.h
CommitLineData
b37bf2e1
A
1/*
2 * Copyright (C) 2003 Apple Computer, Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#ifndef JAVASCRIPTCORE_BINDINGS_RUNTIME_H
27#define JAVASCRIPTCORE_BINDINGS_RUNTIME_H
28
29#include "value.h"
30
31#include <wtf/Noncopyable.h>
32#include <wtf/HashMap.h>
33#include <wtf/Vector.h>
34
35namespace KJS {
36
37class Identifier;
38class List;
39class PropertyNameArray;
40
41namespace Bindings {
42
43class Instance;
44class Method;
45class RootObject;
46
47typedef Vector<Method*> MethodList;
48
49class Field
50{
51public:
52 virtual const char* name() const = 0;
53
54 virtual JSValue* valueFromInstance(ExecState*, const Instance*) const = 0;
55 virtual void setValueToInstance(ExecState*, const Instance*, JSValue*) const = 0;
56
57 virtual ~Field() {}
58};
59
60class Method : Noncopyable
61{
62public:
63 virtual const char *name() const = 0;
64
65 virtual int numParameters() const = 0;
66
67 virtual ~Method() {}
68};
69
70class Class : Noncopyable
71{
72public:
73 virtual const char *name() const = 0;
74
75 virtual MethodList methodsNamed(const Identifier&, Instance*) const = 0;
76
77 virtual Field *fieldNamed(const Identifier&, Instance*) const = 0;
78
79 virtual JSValue* fallbackObject(ExecState*, Instance*, const Identifier&) { return jsUndefined(); }
80
81 virtual ~Class() {}
82};
83
84typedef void (*KJSDidExecuteFunctionPtr)(ExecState*, JSObject* rootObject);
85
86class Instance : Noncopyable {
87public:
88 typedef enum {
89 JavaLanguage,
90 ObjectiveCLanguage,
91 CLanguage
92#if PLATFORM(QT)
93 , QtLanguage
94#endif
95 } BindingLanguage;
96
97 Instance(PassRefPtr<RootObject>);
98
99 static void setDidExecuteFunction(KJSDidExecuteFunctionPtr func);
100 static KJSDidExecuteFunctionPtr didExecuteFunction();
101
102 static Instance* createBindingForLanguageInstance(BindingLanguage, void* nativeInstance, PassRefPtr<RootObject>);
103 static JSObject* createRuntimeObject(BindingLanguage, void* nativeInstance, PassRefPtr<RootObject>);
104 static JSObject* createRuntimeObject(Instance*);
105
106 static Instance* getInstance(JSObject*, BindingLanguage);
107
108 void ref() { _refCount++; }
109 void deref()
110 {
111 if (--_refCount == 0)
112 delete this;
113 }
114
115 // These functions are called before and after the main entry points into
116 // the native implementations. They can be used to establish and cleanup
117 // any needed state.
118 virtual void begin() {}
119 virtual void end() {}
120
121 virtual Class *getClass() const = 0;
122
123 virtual JSValue* getValueOfField(ExecState*, const Field*) const;
124 virtual JSValue* getValueOfUndefinedField(ExecState*, const Identifier&, JSType) const { return jsUndefined(); }
125 virtual void setValueOfField(ExecState*, const Field*, JSValue*) const;
126 virtual bool supportsSetValueOfUndefinedField() { return false; }
127 virtual void setValueOfUndefinedField(ExecState*, const Identifier&, JSValue*) {}
128
129 virtual bool implementsCall() const { return false; }
130
131 virtual JSValue* invokeMethod(ExecState*, const MethodList&, const List& args) = 0;
132 virtual JSValue* invokeDefaultMethod(ExecState*, const List&) { return jsUndefined(); }
133
134 virtual void getPropertyNames(ExecState*, PropertyNameArray&) { }
135
136 virtual JSValue* defaultValue(JSType hint) const = 0;
137
138 virtual JSValue* valueOf() const { return jsString(getClass()->name()); }
139
140 RootObject* rootObject() const;
141
142 virtual ~Instance();
143
144 virtual BindingLanguage getBindingLanguage() const = 0;
145
146protected:
147 RefPtr<RootObject> _rootObject;
148 unsigned _refCount;
149};
150
151class Array : Noncopyable
152{
153public:
154 Array(PassRefPtr<RootObject>);
155 virtual ~Array();
156
157 virtual void setValueAt(ExecState *, unsigned index, JSValue*) const = 0;
158 virtual JSValue* valueAt(ExecState *, unsigned index) const = 0;
159 virtual unsigned int getLength() const = 0;
160protected:
161 RefPtr<RootObject> _rootObject;
162};
163
164const char *signatureForParameters(const List&);
165
166typedef HashMap<RefPtr<UString::Rep>, MethodList*> MethodListMap;
167typedef HashMap<RefPtr<UString::Rep>, Method*> MethodMap;
168typedef HashMap<RefPtr<UString::Rep>, Field*> FieldMap;
169
170} // namespace Bindings
171
172} // namespace KJS
173
174#endif