Reviewed by Maciej.
authorggaren <ggaren@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 16 Jul 2006 22:17:04 +0000 (22:17 +0000)
committerggaren <ggaren@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 16 Jul 2006 22:17:04 +0000 (22:17 +0000)
        - Added names to functions.

        - Removed GetPrivate/SetPrivate from callbackFunctions and callbackConstructors.
        The private data idiom is that a JS object stores its native implementation
        as private data. For functions and constructors, the native implementation is nothing
        more than the callback they already store, so supporting private data, too,
        confuses the idiom. If you *really* want, you can still create a custom
        function with private data.

        * API/JSCallbackConstructor.cpp:
        * API/JSCallbackConstructor.h:
        * API/JSCallbackFunction.cpp:
        (KJS::JSCallbackFunction::JSCallbackFunction):
        * API/JSCallbackFunction.h:
        * API/JSCallbackObject.cpp:
        (KJS::JSCallbackObject::staticFunctionGetter):
        * API/JSObjectRef.cpp:
        (JSObjectMakeFunction):
        (JSObjectMakeFunctionWithBody):
        (JSObjectGetPrivate):
        (JSObjectSetPrivate):
        * API/JSObjectRef.h:
        * API/minidom.c:
        (main):
        * API/testapi.c:
        (main):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@15469 268f45cc-cd09-0410-ab3c-d52691b4dbfc

JavaScriptCore/API/JSCallbackConstructor.cpp
JavaScriptCore/API/JSCallbackConstructor.h
JavaScriptCore/API/JSCallbackFunction.cpp
JavaScriptCore/API/JSCallbackFunction.h
JavaScriptCore/API/JSCallbackObject.cpp
JavaScriptCore/API/JSObjectRef.cpp
JavaScriptCore/API/JSObjectRef.h
JavaScriptCore/API/minidom.c
JavaScriptCore/API/testapi.c
JavaScriptCore/ChangeLog

index 7bd29534d49b507ae3d5fb5023640ae1b44f3051..49a560d37cbf54cc749aba0cc900cef670d7f9ac 100644 (file)
@@ -54,14 +54,4 @@ JSObject* JSCallbackConstructor::construct(ExecState* exec, const List &args)
     return toJS(m_callback(execRef, thisRef, argumentCount, arguments, toRef(exec->exceptionSlot())));
 }
 
-void JSCallbackConstructor::setPrivate(void* data)
-{
-    m_privateData = data;
-}
-
-void* JSCallbackConstructor::getPrivate()
-{
-    return m_privateData;
-}
-
 } // namespace KJS
index 1cce80833236d2d03d216571e6e7cb24f0d60336..7f32229e648e6d19751f7afe7d7927be0c73dca6 100644 (file)
@@ -40,9 +40,6 @@ public:
     virtual bool implementsConstruct() const;
     virtual JSObject* construct(ExecState*, const List &args);
 
-    void setPrivate(void* data);
-    void* getPrivate();
-
     virtual const ClassInfo *classInfo() const { return &info; }
     static const ClassInfo info;
     
@@ -50,7 +47,6 @@ private:
     JSCallbackConstructor(); // prevent default construction
     JSCallbackConstructor(const JSCallbackConstructor&);
     
-    void* m_privateData;
     JSObjectCallAsConstructorCallback m_callback;
 };
 
index c26ef87777cc13adb93ca052c5291a1a8536998b..7062f9cfec8e9d88e946a02b484c1e5a66961be1 100644 (file)
@@ -33,17 +33,12 @@ namespace KJS {
 
 const ClassInfo JSCallbackFunction::info = { "CallbackFunction", &InternalFunctionImp::info, 0, 0 };
 
-JSCallbackFunction::JSCallbackFunction(ExecState* exec, JSObjectCallAsFunctionCallback callback)
-    : InternalFunctionImp(static_cast<FunctionPrototype*>(exec->lexicalInterpreter()->builtinFunctionPrototype()))
+JSCallbackFunction::JSCallbackFunction(ExecState* exec, JSObjectCallAsFunctionCallback callback, const Identifier& name)
+    : InternalFunctionImp(static_cast<FunctionPrototype*>(exec->lexicalInterpreter()->builtinFunctionPrototype()), name)
     , m_callback(callback)
 {
 }
 
-bool JSCallbackFunction::implementsCall() const
-{
-    return true;
-}
-
 JSValue* JSCallbackFunction::callAsFunction(ExecState* exec, JSObject* thisObj, const List &args)
 {
     JSContextRef execRef = toRef(exec);
@@ -57,14 +52,4 @@ JSValue* JSCallbackFunction::callAsFunction(ExecState* exec, JSObject* thisObj,
     return toJS(m_callback(execRef, thisRef, thisObjRef, argumentCount, arguments, toRef(exec->exceptionSlot())));
 }
 
-void JSCallbackFunction::setPrivate(void* data)
-{
-    m_privateData = data;
-}
-
-void* JSCallbackFunction::getPrivate()
-{
-    return m_privateData;
-}
-
 } // namespace KJS
index fa46047bd7b2151d67886a3d219317a9c3321d96..72dded45b127a185a553f1abff8bb02c2e8310f5 100644 (file)
@@ -36,14 +36,10 @@ namespace KJS {
 class JSCallbackFunction : public InternalFunctionImp
 {
 public:
-    JSCallbackFunction(ExecState* exec, JSObjectCallAsFunctionCallback callback);
+    JSCallbackFunction(ExecState* exec, JSObjectCallAsFunctionCallback callback, const Identifier& name);
 
-    virtual bool implementsCall() const;
     virtual JSValue* callAsFunction(ExecState*, JSObject* thisObj, const List &args);
 
-    void setPrivate(void* data);
-    void* getPrivate();
-
     virtual const ClassInfo *classInfo() const { return &info; }
     static const ClassInfo info;
     
@@ -51,7 +47,6 @@ private:
     JSCallbackFunction(); // prevent default construction
     JSCallbackFunction(const JSCallbackFunction&);
     
-    void* m_privateData;
     JSObjectCallAsFunctionCallback m_callback;
 };
 
index 47e61140315320eec9d9f383cc554abcc485ba27..3b9e5104a5f333e092c701354e03a81c335b489b 100644 (file)
@@ -25,6 +25,7 @@
  */
 
 #include "APICast.h"
+#include "JSCallbackFunction.h"
 #include "JSCallbackObject.h"
 #include "JSStringRef.h"
 #include "JSClassRef.h"
@@ -405,9 +406,9 @@ JSValue* JSCallbackObject::staticFunctionGetter(ExecState* exec, JSObject*, cons
     for (JSClassRef jsClass = thisObj->m_class; jsClass; jsClass = jsClass->parentClass) {
         if (__JSClass::StaticFunctionsTable* staticFunctions = jsClass->staticFunctions) {
             if (StaticFunctionEntry* entry = staticFunctions->get(propertyName.ustring().rep())) {
-                JSValue* v = toJS(JSObjectMakeFunction(toRef(exec), entry->callAsFunction));
-                thisObj->putDirect(propertyName, v, entry->attributes);
-                return v;
+                JSObject* o = new JSCallbackFunction(exec, entry->callAsFunction, propertyName);
+                thisObj->putDirect(propertyName, o, entry->attributes);
+                return o;
             }
         }
     }
index 563f1929dbbdfb0d58a29d46464d7b3db704bfca..7fc01366eea7abc667e689ead1aa2b261498d06c 100644 (file)
@@ -75,11 +75,13 @@ JSObjectRef JSObjectMake(JSContextRef context, JSClassRef jsClass, JSValueRef pr
         return toRef(new JSCallbackObject(context, jsClass, jsPrototype));
 }
 
-JSObjectRef JSObjectMakeFunction(JSContextRef context, JSObjectCallAsFunctionCallback callAsFunction)
+JSObjectRef JSObjectMakeFunction(JSContextRef context, JSStringRef name, JSObjectCallAsFunctionCallback callAsFunction)
 {
     JSLock lock;
     ExecState* exec = toJS(context);
-    return toRef(new JSCallbackFunction(exec, callAsFunction));
+    Identifier nameID = name ? Identifier(toJS(name)) : Identifier("anonymous");
+    
+    return toRef(new JSCallbackFunction(exec, callAsFunction, nameID));
 }
 
 JSObjectRef JSObjectMakeConstructor(JSContextRef context, JSObjectCallAsConstructorCallback callAsConstructor)
@@ -94,18 +96,17 @@ JSObjectRef JSObjectMakeFunctionWithBody(JSContextRef context, JSStringRef name,
     JSLock lock;
     
     ExecState* exec = toJS(context);
-    UString::Rep* nameRep = name ? toJS(name) : &UString::Rep::null;
     UString::Rep* bodyRep = toJS(body);
     UString::Rep* sourceURLRep = sourceURL ? toJS(sourceURL) : &UString::Rep::null;
     
-    Identifier nameIdentifier = nameRep ? Identifier(nameRep) : Identifier("anonymous");
+    Identifier nameID = name ? Identifier(toJS(name)) : Identifier("anonymous");
     
     List args;
     for (unsigned i = 0; i < parameterCount; i++)
         args.append(jsString(UString(toJS(parameterNames[i]))));
     args.append(jsString(UString(bodyRep)));
 
-    JSObject* result = exec->dynamicInterpreter()->builtinFunction()->construct(exec, args, nameIdentifier, UString(sourceURLRep), startingLineNumber);
+    JSObject* result = exec->dynamicInterpreter()->builtinFunction()->construct(exec, args, nameID, UString(sourceURLRep), startingLineNumber);
     if (exec->hadException()) {
         if (exception)
             *exception = toRef(exec->exception());
@@ -219,12 +220,6 @@ void* JSObjectGetPrivate(JSObjectRef object)
     if (jsObject->inherits(&JSCallbackObject::info))
         return static_cast<JSCallbackObject*>(jsObject)->getPrivate();
     
-    if (jsObject->inherits(&JSCallbackFunction::info))
-        return static_cast<JSCallbackFunction*>(jsObject)->getPrivate();
-    
-    if (jsObject->inherits(&JSCallbackConstructor::info))
-        return static_cast<JSCallbackConstructor*>(jsObject)->getPrivate();
-    
     return 0;
 }
 
@@ -237,16 +232,6 @@ bool JSObjectSetPrivate(JSObjectRef object, void* data)
         return true;
     }
         
-    if (jsObject->inherits(&JSCallbackFunction::info)) {
-        static_cast<JSCallbackFunction*>(jsObject)->setPrivate(data);
-        return true;
-    }
-        
-    if (jsObject->inherits(&JSCallbackConstructor::info)) {
-        static_cast<JSCallbackConstructor*>(jsObject)->setPrivate(data);
-        return true;
-    }
-    
     return false;
 }
 
index f54e7f41a9f29e9f2ace9805d8043207949cd071..dafb41ac6764f37a986d3a8d994a3b4d6644c6af 100644 (file)
@@ -386,10 +386,11 @@ JSObjectRef JSObjectMake(JSContextRef context, JSClassRef jsClass, JSValueRef pr
 @function
 @abstract Convenience method for creating a JavaScript function with a given callback as its implementation.
 @param context The execution context to use.
+@param name A JSString containing the function's name. This will be used when converting the function to string. Pass NULL to create an anonymous function.
 @param callAsFunction The JSObjectCallAsFunctionCallback to invoke when the function is called.
 @result A JSObject that is an anonymous function. The object's prototype will be the default function prototype.
 */
-JSObjectRef JSObjectMakeFunction(JSContextRef context, JSObjectCallAsFunctionCallback callAsFunction);
+JSObjectRef JSObjectMakeFunction(JSContextRef context, JSStringRef name, JSObjectCallAsFunctionCallback callAsFunction);
 /*!
 @function
 @abstract Convenience method for creating a JavaScript constructor with a given callback as its implementation.
@@ -403,7 +404,7 @@ JSObjectRef JSObjectMakeConstructor(JSContextRef context, JSObjectCallAsConstruc
 @function
 @abstract Creates a function with a given script as its body.
 @param context The execution context to use.
-@param name A JSString containing the function's name. Pass NULL to create an anonymous function.
+@param name A JSString containing the function's name. This will be used when converting the function to string. Pass NULL to create an anonymous function.
 @param parameterCount An integer count of the number of parameter names in parameterNames.
 @param parameterNames A JSString array containing the names of the function's parameters. Pass NULL if parameterCount is 0.
 @param body A JSString containing the script to use as the function's body.
@@ -500,7 +501,6 @@ void JSObjectSetPropertyAtIndex(JSContextRef context, JSObjectRef object, unsign
 @abstract Gets a pointer to private data from an object.
 @param object A JSObject whose private data you want to get.
 @result A void* that points to the object's private data, if the object has private data, otherwise NULL.
-@discussion JSObjectGetPrivate and JSObjectSetPrivate only work on objects created by JSObjectMake, JSObjectMakeFunction, and JSObjectMakeConstructor.
 */
 void* JSObjectGetPrivate(JSObjectRef object);
 
@@ -509,8 +509,8 @@ void* JSObjectGetPrivate(JSObjectRef object);
 @abstract Sets a pointer to private data on an object.
 @param object A JSObject whose private data you want to set.
 @param data A void* that points to the object's private data.
-@result true if the set operation succeeds, otherwise false.
-@discussion JSObjectGetPrivate and JSObjectSetPrivate only work on objects created by JSObjectMake, JSObjectMakeFunction, and JSObjectMakeConstructor.
+@result true if the object can store private data, otherwise false.
+@discussion Only custom objects created with a JSClass can store private data.
 */
 bool JSObjectSetPrivate(JSObjectRef object, void* data);
 
index 7f1f41c318bad208e5f7859bcef007f1ecb57e62..31a6fbe8bc7dc81671502edd638fdc4caadaf645 100644 (file)
@@ -40,7 +40,7 @@ int main(int argc, char* argv[])
     JSObjectRef globalObject = JSContextGetGlobalObject(context);
     
     JSStringRef printIString = JSStringCreateWithUTF8CString("print");
-    JSObjectSetProperty(context, globalObject, printIString, JSObjectMakeFunction(context, print), kJSPropertyAttributeNone, NULL);
+    JSObjectSetProperty(context, globalObject, printIString, JSObjectMakeFunction(context, printIString, print), kJSPropertyAttributeNone, NULL);
     JSStringRelease(printIString);
     
     JSStringRef node = JSStringCreateWithUTF8CString("Node");
index 35cbb7c24cfdc28ae2e5dccb60fbabaf91fa0433..2bf20ffe896bd9af504d337e17ca8e3c3138def9 100644 (file)
@@ -570,20 +570,20 @@ int main(int argc, char* argv[])
     JSStringRelease(string);
 
     JSStringRef print = JSStringCreateWithUTF8CString("print");
-    JSObjectRef printFunction = JSObjectMakeFunction(context, print_callAsFunction);
+    JSObjectRef printFunction = JSObjectMakeFunction(context, print, print_callAsFunction);
     JSObjectSetProperty(context, globalObject, print, printFunction, kJSPropertyAttributeNone, NULL); 
     JSStringRelease(print);
     
-    assert(JSObjectSetPrivate(printFunction, (void*)1));
-    assert(JSObjectGetPrivate(printFunction) == (void*)1);
+    assert(!JSObjectSetPrivate(printFunction, (void*)1));
+    assert(!JSObjectGetPrivate(printFunction));
 
     JSStringRef myConstructorIString = JSStringCreateWithUTF8CString("MyConstructor");
     JSObjectRef myConstructor = JSObjectMakeConstructor(context, myConstructor_callAsConstructor);
     JSObjectSetProperty(context, globalObject, myConstructorIString, myConstructor, kJSPropertyAttributeNone, NULL);
     JSStringRelease(myConstructorIString);
     
-    assert(JSObjectSetPrivate(myConstructor, (void*)1));
-    assert(JSObjectGetPrivate(myConstructor) == (void*)1);
+    assert(!JSObjectSetPrivate(myConstructor, (void*)1));
+    assert(!JSObjectGetPrivate(myConstructor));
     
     o = JSObjectMake(context, NULL, NULL);
     JSObjectSetProperty(context, o, jsOneIString, JSValueMakeNumber(1), kJSPropertyAttributeNone, NULL);
index 5b9667e30ee35988720d7597e44ccf61e07c6537..4198af18637a8f46c79d67bf8c265563e4a13e5f 100644 (file)
@@ -1,3 +1,34 @@
+2006-07-16  Geoffrey Garen  <ggaren@apple.com>
+
+        Reviewed by Maciej.
+        
+        - Added names to functions.
+        
+        - Removed GetPrivate/SetPrivate from callbackFunctions and callbackConstructors.
+        The private data idiom is that a JS object stores its native implementation
+        as private data. For functions and constructors, the native implementation is nothing
+        more than the callback they already store, so supporting private data, too,
+        confuses the idiom. If you *really* want, you can still create a custom 
+        function with private data.
+
+        * API/JSCallbackConstructor.cpp:
+        * API/JSCallbackConstructor.h:
+        * API/JSCallbackFunction.cpp:
+        (KJS::JSCallbackFunction::JSCallbackFunction):
+        * API/JSCallbackFunction.h:
+        * API/JSCallbackObject.cpp:
+        (KJS::JSCallbackObject::staticFunctionGetter):
+        * API/JSObjectRef.cpp:
+        (JSObjectMakeFunction):
+        (JSObjectMakeFunctionWithBody):
+        (JSObjectGetPrivate):
+        (JSObjectSetPrivate):
+        * API/JSObjectRef.h:
+        * API/minidom.c:
+        (main):
+        * API/testapi.c:
+        (main):
+
 2006-07-15  Maciej Stachowiak  <mjs@apple.com>
 
         Reviewed by Darin.