fd4a81335de1603c0a904e932377fd1fb12b8f45
[WebKit-https.git] / JavaScriptCore / bindings / objc / objc_runtime.h
1 /*
2  * Copyright (C) 2004 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 #ifndef _BINDINGS_OBJC_RUNTIME_H_
26 #define _BINDINGS_OBJC_RUNTIME_H_
27
28 #include <CoreFoundation/CoreFoundation.h>
29
30 #include <runtime.h>
31 #include <ustring.h>
32
33 #include <objc_header.h>
34
35 namespace KJS
36 {
37 class Value;
38
39 namespace Bindings
40 {
41
42 class ObjcInstance;
43
44 class ObjcField : public Field
45 {
46 public:
47     ObjcField(Ivar ivar);
48
49     ObjcField(CFStringRef name);
50     
51     ~ObjcField() {
52         if (_name)
53             CFRelease (_name);
54     };
55
56     ObjcField(const ObjcField &other) : Field() {
57         _ivar = other._ivar;
58
59         if (other._name != _name) {
60             if (_name)
61                 CFRelease (_name);
62             if (other._name)
63                 _name = (CFStringRef)CFRetain (other._name);
64             else 
65                 _name = 0;
66         }
67     };
68     
69     ObjcField &operator=(const ObjcField &other) {
70         if (this == &other)
71             return *this;
72
73         _ivar = other._ivar;
74         
75         if (other._name != _name) {
76             if (_name)
77                 CFRelease (_name);
78             if (other._name)
79                 _name = (CFStringRef)CFRetain (other._name);
80             else 
81                 _name = 0;
82         }
83         
84         return *this;
85     };
86         
87     virtual KJS::Value valueFromInstance(KJS::ExecState *exec, const Instance *instance) const;
88     virtual void setValueToInstance(KJS::ExecState *exec, const Instance *instance, const KJS::Value &aValue) const;
89     
90     virtual const char *name() const;
91     virtual RuntimeType type() const;
92         
93 private:
94     Ivar _ivar;
95     CFStringRef _name;
96 };
97
98
99 class ObjcMethod : public Method
100 {
101 public:
102     ObjcMethod() : Method(), _objcClass(0), _selector(0) {};
103
104     ObjcMethod(struct objc_class *aClass, const char *_selector);
105     ~ObjcMethod () {
106         if (_javaScriptName);
107             CFRelease (_javaScriptName);
108     };
109
110     ObjcMethod(const ObjcMethod &other) : Method() {
111         _objcClass = other._objcClass;
112         _selector = other._selector;
113     };
114     
115     ObjcMethod &operator=(const ObjcMethod &other) {
116         if (this == &other)
117             return *this;
118
119         _objcClass = other._objcClass;
120         _selector = other._selector;
121         
122         return *this;
123     }
124
125     virtual const char *name() const;
126
127     virtual long numParameters() const;
128     
129     NSMethodSignature *getMethodSignature() const;
130     
131     bool isFallbackMethod() const { return strcmp(_selector, "invokeUndefinedMethodFromWebScript:withArguments:") == 0; }
132     void setJavaScriptName (CFStringRef n);
133     CFStringRef javaScriptName() const { return _javaScriptName; }
134     
135 private:
136     struct objc_class *_objcClass;
137     const char *_selector;
138     CFStringRef _javaScriptName;
139 };
140
141 class ObjcArray : public Array
142 {
143 public:
144     ObjcArray (ObjectStructPtr a);
145
146     ObjcArray (const ObjcArray &other);
147
148     ObjcArray &operator=(const ObjcArray &other);
149     
150     virtual void setValueAt(KJS::ExecState *exec, unsigned int index, const KJS::Value &aValue) const;
151     virtual KJS::Value valueAt(KJS::ExecState *exec, unsigned int index) const;
152     virtual unsigned int getLength() const;
153     
154     virtual ~ObjcArray();
155
156     ObjectStructPtr getObjcArray() const { return _array; }
157
158     static KJS::Value convertObjcArrayToArray (KJS::ExecState *exec, ObjectStructPtr anObject);
159
160 private:
161     ObjectStructPtr _array;
162 };
163
164 class ObjcFallbackObjectImp : public KJS::ObjectImp {
165 public:
166     ObjcFallbackObjectImp(ObjectImp *proto);
167         
168     ObjcFallbackObjectImp(ObjcInstance *i, const KJS::Identifier propertyName);
169
170     const ClassInfo *classInfo() const { return &info; }
171
172     virtual Value get(ExecState *exec, const Identifier &propertyName) const;
173
174     virtual void put(ExecState *exec, const Identifier &propertyName,
175                      const Value &value, int attr = None);
176
177     virtual bool canPut(ExecState *exec, const Identifier &propertyName) const;
178
179     virtual bool implementsCall() const;
180     virtual Value call(ExecState *exec, Object &thisObj, const List &args);
181
182     virtual bool hasProperty(ExecState *exec,
183                              const Identifier &propertyName) const;
184
185
186     virtual bool deleteProperty(ExecState *exec,
187                                 const Identifier &propertyName);
188
189     virtual Value defaultValue(ExecState *exec, Type hint) const;
190
191 private:
192     static const ClassInfo info;
193
194     ObjcInstance *_instance;
195     KJS::Identifier _item;
196 };
197
198 } // namespace Bindings
199
200 } // namespace KJS
201
202 #endif