Updated plugin binding API to reflect latest revision from
[WebKit-https.git] / JavaScriptCore / bindings / c / c_instance.cpp
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 #include <c_class.h>
26 #include <c_instance.h>
27 #include <c_runtime.h>
28 #include <c_utility.h>
29
30 #ifdef NDEBUG
31 #define C_LOG(formatAndArgs...) ((void)0)
32 #else
33 #define C_LOG(formatAndArgs...) { \
34     fprintf (stderr, "%s:%d -- %s:  ", __FILE__, __LINE__, __FUNCTION__); \
35     fprintf(stderr, formatAndArgs); \
36 }
37 #endif
38
39 using namespace KJS::Bindings;
40 using namespace KJS;
41
42 CInstance::CInstance (NPObject *o) 
43 {
44     _object = NPN_RetainObject (o);
45 };
46
47 CInstance::~CInstance () 
48 {
49     NPN_ReleaseObject (_object);
50     delete _class;
51 }
52
53
54 CInstance::CInstance (const CInstance &other) : Instance() 
55 {
56     _object = NPN_RetainObject (other._object);
57 };
58
59 CInstance &CInstance::operator=(const CInstance &other){
60     if (this == &other)
61         return *this;
62     
63     NPObject *_oldObject = _object;
64     _object= NPN_RetainObject (other._object);
65     NPN_ReleaseObject (_oldObject);
66     
67     return *this;
68 };
69
70 Class *CInstance::getClass() const
71 {
72     if (!_class) {
73         _class = new CClass (_object->_class);
74     }
75     return _class;
76 }
77
78
79 void CInstance::begin()
80 {
81     // Do nothing.
82 }
83
84 void CInstance::end()
85 {
86     // Do nothing.
87 }
88
89 Value CInstance::invokeMethod (KJS::ExecState *exec, const MethodList &methodList, const List &args)
90 {
91     Value resultValue;
92
93     // Overloading methods are not allowed by NPObjects.  Should only be one
94     // name match for a particular method.
95     assert (methodList.length() == 1);
96
97     CMethod *method = 0;
98     method = static_cast<CMethod*>(methodList.methodAt(0));
99
100     NPIdentifier ident = NPN_GetIdentifier (method->name());
101     if (!_object->_class->hasMethod (_object->_class, ident))
102         return Undefined();
103
104     unsigned i, count = args.size();
105     NPVariant *cArgs;
106     NPVariant localBuffer[128];
107     if (count > 128)
108         cArgs = (NPVariant *)malloc (sizeof(NPVariant)*count);
109     else
110         cArgs = localBuffer;
111     
112     for (i = 0; i < count; i++) {
113         convertValueToNPVariant (exec, args.at(i), &cArgs[i]);
114     }
115
116     // Invoke the 'C' method.
117     NPVariant resultVariant;
118     _object->_class->invoke (_object, ident, cArgs, count, &resultVariant);
119
120     for (i = 0; i < count; i++) {
121         NPN_ReleaseVariantValue (&cArgs[i]);
122     }
123
124     if (resultVariant.type != NPVariantVoidType) {
125         resultValue = convertNPVariantToValue (exec, &resultVariant);
126         
127         if (cArgs != localBuffer)
128             free ((void *)cArgs);
129             
130         NPN_ReleaseVariantValue (&resultVariant);
131         
132         return resultValue;
133     }
134     
135     return Undefined();
136 }
137
138
139 KJS::Value CInstance::defaultValue (KJS::Type hint) const
140 {
141     if (hint == KJS::StringType) {
142         return stringValue();
143     }
144     else if (hint == KJS::NumberType) {
145         return numberValue();
146     }
147     else if (hint == KJS::BooleanType) {
148         return booleanValue();
149     }
150     
151     return valueOf();
152 }
153
154 KJS::Value CInstance::stringValue() const
155 {
156     // FIXME:  Implement something sensible, like calling toString...
157     KJS::String v("");
158     return v;
159 }
160
161 KJS::Value CInstance::numberValue() const
162 {
163     // FIXME:  Implement something sensible
164     KJS::Number v(0);
165     return v;
166 }
167
168 KJS::Value CInstance::booleanValue() const
169 {
170     // FIXME:  Implement something sensible
171     KJS::Boolean v((bool)0);
172     return v;
173 }
174
175 KJS::Value CInstance::valueOf() const 
176 {
177     return stringValue();
178 };