Pleasing to Maciej.
authorggaren <ggaren@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 13 Jul 2006 08:56:52 +0000 (08:56 +0000)
committerggaren <ggaren@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 13 Jul 2006 08:56:52 +0000 (08:56 +0000)
        - Renamed JSEvaluate -> JSEvaluateScript, JSCheckSyntax -> JSCheckScriptSyntax
        - Added exception out parameters to JSValueTo* and JSValueIsEqual because
        they can throw
        - Removed JSObjectGetDescription because it's useless and vague, and
        JSValueToString/JSValueIsObjectOfClass do a better job, anyway
        - Clarified comments about "IsFunction/Constructor" to indicate that they
        are true of all functions/constructors, not just those created by JSObjectMake*

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

14 files changed:
JavaScriptCore/API/JSContextRef.cpp
JavaScriptCore/API/JSContextRef.h
JavaScriptCore/API/JSNode.c
JavaScriptCore/API/JSNodeList.c
JavaScriptCore/API/JSObjectRef.cpp
JavaScriptCore/API/JSObjectRef.h
JavaScriptCore/API/JSStringRef.cpp
JavaScriptCore/API/JSValueRef.cpp
JavaScriptCore/API/JSValueRef.h
JavaScriptCore/API/minidom.c
JavaScriptCore/API/testapi.c
JavaScriptCore/API/testapi.js
JavaScriptCore/ChangeLog
JavaScriptCore/JavaScriptCore.exp

index d3a128e5483be7479ccdb1b3a708a062cb43277c..4c45462e4fcc76eb3df2121b15a00854c3a059e0 100644 (file)
@@ -62,7 +62,7 @@ JSObjectRef JSContextGetGlobalObject(JSContextRef context)
     return toRef(exec->dynamicInterpreter()->globalObject());
 }
 
-JSValueRef JSEvaluate(JSContextRef context, JSStringRef script, JSObjectRef thisObject, JSStringRef sourceURL, int startingLineNumber, JSValueRef* exception)
+JSValueRef JSEvaluateScript(JSContextRef context, JSStringRef script, JSObjectRef thisObject, JSStringRef sourceURL, int startingLineNumber, JSValueRef* exception)
 {
     JSLock lock;
     ExecState* exec = toJS(context);
@@ -85,7 +85,7 @@ JSValueRef JSEvaluate(JSContextRef context, JSStringRef script, JSObjectRef this
     return toRef(jsUndefined());
 }
 
-bool JSCheckSyntax(JSContextRef context, JSStringRef script, JSStringRef sourceURL, int startingLineNumber, JSValueRef* exception)
+bool JSCheckScriptSyntax(JSContextRef context, JSStringRef script, JSStringRef sourceURL, int startingLineNumber, JSValueRef* exception)
 {
     JSLock lock;
 
index 7f2d1de703fa5551cd6148540190b162a1cb4cca..6afcdd349fb28fb275112abe2a53b142e75cf170 100644 (file)
@@ -71,13 +71,13 @@ JSObjectRef JSContextGetGlobalObject(JSContextRef context);
 @param thisObject         The object to use as "this," or NULL to use the global object as "this."
 @param sourceURL          A JSString containing a URL for the script's source file. This is only used when reporting exceptions. Pass NULL if you do not care to include source file information in exceptions.
 @param startingLineNumber An integer value specifying the script's starting line number in the file located at sourceURL. This is only used when reporting exceptions.
-@param exception          A pointer to a JSValueRef in which to store an uncaught exception, if any. Pass NULL if you do not care to store an uncaught exception.
-@result                   The JSValue that results from evaluating script, or NULL if an uncaught exception is thrown.
+@param exception          A pointer to a JSValueRef in which to store an exception, if any. Pass NULL if you do not care to store an exception.
+@result                   The JSValue that results from evaluating script, or NULL if an exception is thrown.
 */
-JSValueRef JSEvaluate(JSContextRef context, JSStringRef script, JSObjectRef thisObject, JSStringRef sourceURL, int startingLineNumber, JSValueRef* exception);
+JSValueRef JSEvaluateScript(JSContextRef context, JSStringRef script, JSObjectRef thisObject, JSStringRef sourceURL, int startingLineNumber, JSValueRef* exception);
 
 /*!
-@function JSCheckSyntax
+@function JSCheckScriptSyntax
 @abstract                 Checks for syntax errors in a string of JavaScript.
 @param context            The execution context to use.
 @param script             A JSString containing the script to check for syntax errors.
@@ -86,7 +86,7 @@ JSValueRef JSEvaluate(JSContextRef context, JSStringRef script, JSObjectRef this
 @param exception          A pointer to a JSValueRef in which to store a syntax error exception, if any. Pass NULL if you do not care to store a syntax error exception.
 @result                   true if the script is syntactically correct, otherwise false.
 */
-bool JSCheckSyntax(JSContextRef context, JSStringRef script, JSStringRef sourceURL, int startingLineNumber, JSValueRef* exception);
+bool JSCheckScriptSyntax(JSContextRef context, JSStringRef script, JSStringRef sourceURL, int startingLineNumber, JSValueRef* exception);
 
 #ifdef __cplusplus
 }
index 60e9080762512ec0f3df11373801793b984c39d9..1c9c1defb58f9d88e62cbc9e1ebbcd45b90d504c 100644 (file)
@@ -48,7 +48,7 @@ static JSValueRef JSNodePrototype_appendChild(JSContextRef context, JSObjectRef
         JSStringRelease(message);
     } else {
         Node* node = JSObjectGetPrivate(thisObject);
-        Node* child = JSObjectGetPrivate(JSValueToObject(context, argv[0]));
+        Node* child = JSObjectGetPrivate(JSValueToObject(context, argv[0], NULL));
 
         Node_appendChild(node, child);
     }
@@ -66,7 +66,7 @@ static JSValueRef JSNodePrototype_removeChild(JSContextRef context, JSObjectRef
         if (JSValueIsObjectOfClass(thisObject, JSNode_class(context))) {
             if (JSValueIsObjectOfClass(argv[0], JSNode_class(context))) {
                 Node* node = JSObjectGetPrivate(thisObject);
-                Node* child = JSObjectGetPrivate(JSValueToObject(context, argv[0]));
+                Node* child = JSObjectGetPrivate(JSValueToObject(context, argv[0], NULL));
                 
                 Node_removeChild(node, child);
             }
@@ -86,8 +86,8 @@ static JSValueRef JSNodePrototype_replaceChild(JSContextRef context, JSObjectRef
             if (JSValueIsObjectOfClass(argv[0], JSNode_class(context))) {
                 if (JSValueIsObjectOfClass(argv[1], JSNode_class(context))) {
                     Node* node = JSObjectGetPrivate(thisObject);
-                    Node* newChild = JSObjectGetPrivate(JSValueToObject(context, argv[0]));
-                    Node* oldChild = JSObjectGetPrivate(JSValueToObject(context, argv[1]));
+                    Node* newChild = JSObjectGetPrivate(JSValueToObject(context, argv[0], NULL));
+                    Node* oldChild = JSObjectGetPrivate(JSValueToObject(context, argv[1], NULL));
                     
                     Node_replaceChild(node, newChild, oldChild);
                 }
index f278791c0d41da4bc7bf7bffe06510a65c4b79a6..d13758a5f6219e6cfe460ae45fa7939a003bceb5 100644 (file)
@@ -33,7 +33,7 @@ static JSValueRef JSNodeListPrototype_item(JSContextRef context, JSObjectRef obj
     if (argc > 0) {
         NodeList* nodeList = JSObjectGetPrivate(thisObject);
         assert(nodeList);
-        Node* node = NodeList_item(nodeList, JSValueToNumber(context, argv[0]));
+        Node* node = NodeList_item(nodeList, JSValueToNumber(context, argv[0], exception));
         if (node)
             return JSNode_new(context, node);
     }
@@ -74,7 +74,7 @@ static JSValueRef JSNodeList_getProperty(JSContextRef context, JSObjectRef thisO
 {
     NodeList* nodeList = JSObjectGetPrivate(thisObject);
     assert(nodeList);
-    double index = JSValueToNumber(context, JSValueMakeString(propertyName));
+    double index = JSValueToNumber(context, JSValueMakeString(propertyName), exception);
     unsigned uindex = index;
     if (uindex == index) { // false for NaN
         Node* node = NodeList_item(nodeList, uindex);
index 216dad15d1cba7c3d41182b1677c36d8bbeaf76f..1940cb07b5a17d8547683c3483c030c5f187e156 100644 (file)
@@ -96,13 +96,6 @@ JSObjectRef JSObjectMakeFunctionWithBody(JSContextRef context, JSStringRef body,
     return toRef(static_cast<JSObject*>(new DeclaredFunctionImp(exec, "anonymous", bodyNode.get(), scopeChain)));
 }
 
-JSStringRef JSObjectGetDescription(JSObjectRef object)
-{
-    JSLock lock;
-    JSObject* jsObject = toJS(object);
-    return toRef(jsObject->className().rep());
-}
-
 JSValueRef JSObjectGetPrototype(JSObjectRef object)
 {
     JSObject* jsObject = toJS(object);
index ad770e0b909d586a0115e889354051c63883f0da..5f6c1c13b458a659d309c76cff1ca41d82890f1f 100644 (file)
@@ -383,15 +383,6 @@ JSObjectRef JSObjectMakeConstructor(JSContextRef context, JSObjectCallAsConstruc
 */
 JSObjectRef JSObjectMakeFunctionWithBody(JSContextRef context, JSStringRef body, JSStringRef sourceURL, int startingLineNumber, JSValueRef* exception);
 
-/*!
-@function
-@abstract Gets a short description of a JavaScript object.
-@param context The execution context to use.
-@param object The object whose description you want to get.
-@result A JSString containing the object's description. This is usually the object's class name.
-*/
-JSStringRef JSObjectGetDescription(JSObjectRef object);
-
 /*!
 @function
 @abstract Gets an object's prototype.
@@ -465,9 +456,9 @@ bool JSObjectSetPrivate(JSObjectRef object, void* data);
 
 /*!
 @function
-@abstract Tests whether an object is a function.
+@abstract Tests whether an object can be called as a function.
 @param object The JSObject to test.
-@result true if the object is a function, otherwise false.
+@result true if the object can be called as a function, otherwise false.
 */
 bool JSObjectIsFunction(JSObjectRef object);
 /*!
@@ -484,9 +475,9 @@ bool JSObjectIsFunction(JSObjectRef object);
 JSValueRef JSObjectCallAsFunction(JSContextRef context, JSObjectRef object, JSObjectRef thisObject, size_t argc, JSValueRef argv[], JSValueRef* exception);
 /*!
 @function
-@abstract Tests whether an object is a constructor.
+@abstract Tests whether an object can be called as a constructor.
 @param object The JSObject to test.
-@result true if the object is a constructor, otherwise false.
+@result true if the object can be called as a constructor, otherwise false.
 */
 bool JSObjectIsConstructor(JSObjectRef object);
 /*!
index e7a8e1166f84640f775045a45d2490ff6633bb43..c3394f57cf4f7a3eca69a1980b74b3617b84ccb4 100644 (file)
@@ -70,18 +70,6 @@ void JSStringRelease(JSStringRef string)
     rep->deref();
 }
 
-JSStringRef JSValueToStringCopy(JSContextRef context, JSValueRef value)
-{
-    JSLock lock;
-    JSValue* jsValue = toJS(value);
-    ExecState* exec = toJS(context);
-
-    JSStringRef stringRef = toRef(jsValue->toString(exec).rep()->ref());
-    if (exec->hadException())
-        exec->clearException();
-    return stringRef;
-}
-
 size_t JSStringGetLength(JSStringRef string)
 {
     UString::Rep* rep = toJS(string);
index 68d8ba11d61ddf8d0abd14e9f0518ab7d061af1b..779e2bb0a4ddbf06663b20ecb9c90082ef61bcfc 100644 (file)
@@ -109,16 +109,19 @@ bool JSValueIsObjectOfClass(JSValueRef value, JSClassRef jsClass)
     return false;
 }
 
-bool JSValueIsEqual(JSContextRef context, JSValueRef a, JSValueRef b)
+bool JSValueIsEqual(JSContextRef context, JSValueRef a, JSValueRef b, JSValueRef* exception)
 {
     JSLock lock;
     ExecState* exec = toJS(context);
     JSValue* jsA = toJS(a);
     JSValue* jsB = toJS(b);
 
-    bool result = equal(exec, jsA, jsB);
-    if (exec->hadException())
+    bool result = equal(exec, jsA, jsB); // false if an exception is thrown
+    if (exec->hadException()) {
+        if (exception)
+            *exception = toRef(exec->exception());
         exec->clearException();
+    }
     return result;
 }
 
@@ -129,9 +132,8 @@ bool JSValueIsStrictEqual(JSContextRef context, JSValueRef a, JSValueRef b)
     JSValue* jsA = toJS(a);
     JSValue* jsB = toJS(b);
     
-    bool result = strictEqual(exec, jsA, jsB);
-    if (exec->hadException())
-        exec->clearException();
+    bool result = strictEqual(exec, jsA, jsB); // can't throw because it doesn't perform value conversion
+    ASSERT(!exec->hadException());
     return result;
 }
 
@@ -169,7 +171,7 @@ JSValueRef JSValueMakeNumber(double value)
     return toRef(jsNumber(value));
 }
 
-bool JSValueToBoolean(JSContextRef context, JSValueRef value)
+bool JSValueToBoolean(JSContextRef context, JSValueRef value, JSValueRef* exception)
 {
     JSLock lock;
     ExecState* exec = toJS(context);
@@ -177,13 +179,15 @@ bool JSValueToBoolean(JSContextRef context, JSValueRef value)
     
     bool boolean = jsValue->toBoolean(exec);
     if (exec->hadException()) {
+        if (exception)
+            *exception = toRef(exec->exception());
         exec->clearException();
         boolean = false;
     }
     return boolean;
 }
 
-double JSValueToNumber(JSContextRef context, JSValueRef value)
+double JSValueToNumber(JSContextRef context, JSValueRef value, JSValueRef* exception)
 {
     JSLock lock;
     JSValue* jsValue = toJS(value);
@@ -191,13 +195,31 @@ double JSValueToNumber(JSContextRef context, JSValueRef value)
 
     double number = jsValue->toNumber(exec);
     if (exec->hadException()) {
+        if (exception)
+            *exception = toRef(exec->exception());
         exec->clearException();
         number = NaN;
     }
     return number;
 }
 
-JSObjectRef JSValueToObject(JSContextRef context, JSValueRef value)
+JSStringRef JSValueToStringCopy(JSContextRef context, JSValueRef value, JSValueRef* exception)
+{
+    JSLock lock;
+    JSValue* jsValue = toJS(value);
+    ExecState* exec = toJS(context);
+    
+    JSStringRef stringRef = toRef(jsValue->toString(exec).rep()->ref());
+    if (exec->hadException()) {
+        if (exception)
+            *exception = toRef(exec->exception());
+        exec->clearException();
+        stringRef = 0;
+    }
+    return stringRef;
+}
+
+JSObjectRef JSValueToObject(JSContextRef context, JSValueRef value, JSValueRef* exception)
 {
     JSLock lock;
     ExecState* exec = toJS(context);
@@ -205,6 +227,8 @@ JSObjectRef JSValueToObject(JSContextRef context, JSValueRef value)
     
     JSObjectRef objectRef = toRef(jsValue->toObject(exec));
     if (exec->hadException()) {
+        if (exception)
+            *exception = toRef(exec->exception());
         exec->clearException();
         objectRef = 0;
     }
index 7ff06a9ff5065087ddf70987f27f7008d810796b..9050214cb32e893f03d1a44a756da2b6c62e80d4 100644 (file)
@@ -124,13 +124,14 @@ bool JSValueIsObjectOfClass(JSValueRef value, JSClassRef jsClass);
 
 /*!
 @function
-@abstract       Tests whether two JavaScript values are equal, as compared by the JS == operator.
-@param context  The execution context to use.
-@param a        The first value to test.
-@param b        The second value to test.
-@result         true if the two values are equal, otherwise false.
+@abstract Tests whether two JavaScript values are equal, as compared by the JS == operator.
+@param context The execution context to use.
+@param a The first value to test.
+@param b The second value to test.
+@param exception A pointer to a JSValueRef in which to store an exception, if any. Pass NULL if you do not care to store an exception.
+@result true if the two values are equal, false if they are not equal or an exception is thrown.
 */
-bool JSValueIsEqual(JSContextRef context, JSValueRef a, JSValueRef b);
+bool JSValueIsEqual(JSContextRef context, JSValueRef a, JSValueRef b, JSValueRef* exception);
 
 /*!
 @function
@@ -203,36 +204,40 @@ JSValueRef JSValueMakeString(JSStringRef string);
 @abstract       Converts a JavaScript value to boolean and returns the resulting boolean.
 @param context  The execution context to use.
 @param value    The JSValue to convert.
-@result         The boolean result of conversion.
+@param exception A pointer to a JSValueRef in which to store an exception, if any. Pass NULL if you do not care to store an exception.
+@result         The boolean result of conversion, or false if an exception is thrown.
 */
-bool JSValueToBoolean(JSContextRef context, JSValueRef value);
+bool JSValueToBoolean(JSContextRef context, JSValueRef value, JSValueRef* exception);
 
 /*!
 @function
 @abstract       Converts a JavaScript value to number and returns the resulting number.
 @param context  The execution context to use.
 @param value    The JSValue to convert.
-@result         The numeric result of conversion, or NaN if conversion fails.
+@param exception A pointer to a JSValueRef in which to store an exception, if any. Pass NULL if you do not care to store an exception.
+@result         The numeric result of conversion, or NaN if an exception is thrown.
 */
-double JSValueToNumber(JSContextRef context, JSValueRef value);
+double JSValueToNumber(JSContextRef context, JSValueRef value, JSValueRef* exception);
 
 /*!
 @function
 @abstract       Converts a JavaScript value to string and copies the result into a JavaScript string.
 @param context  The execution context to use.
 @param value    The JSValue to convert.
-@result         A JSString with the result of conversion, or an empty string if conversion fails. Ownership follows the Create Rule.
+@param exception A pointer to a JSValueRef in which to store an exception, if any. Pass NULL if you do not care to store an exception.
+@result         A JSString with the result of conversion, or NULL if an exception is thrown. Ownership follows the Create Rule.
 */
-JSStringRef JSValueToStringCopy(JSContextRef context, JSValueRef value);
+JSStringRef JSValueToStringCopy(JSContextRef context, JSValueRef value, JSValueRef* exception);
 
 /*!
 @function
 @abstract Converts a JavaScript value to object and returns the resulting object.
 @param context  The execution context to use.
 @param value    The JSValue to convert.
+@param exception A pointer to a JSValueRef in which to store an exception, if any. Pass NULL if you do not care to store an exception.
 @result         The JSObject result of conversion, or NULL if conversion fails.
 */
-JSObjectRef JSValueToObject(JSContextRef context, JSValueRef value);
+JSObjectRef JSValueToObject(JSContextRef context, JSValueRef value, JSValueRef* exception);
 
 // Garbage collection
 /*!
index 0f262f3bf1dbd2ee1f89c6813eb74ab48a2af022..745801cc07073fbe7ebfcaa5cac34ba4017035d1 100644 (file)
@@ -50,12 +50,12 @@ int main(int argc, char* argv[])
     char* scriptUTF8 = createStringWithContentsOfFile("minidom.js");
     JSStringRef script = JSStringCreateWithUTF8CString(scriptUTF8);
     JSValueRef exception;
-    JSValueRef result = JSEvaluate(context, script, NULL, NULL, 0, &exception);
+    JSValueRef result = JSEvaluateScript(context, script, NULL, NULL, 0, &exception);
     if (result)
         printf("PASS: Test script executed successfully.\n");
     else {
         printf("FAIL: Test script threw exception:\n");
-        JSStringRef exceptionIString = JSValueToStringCopy(context, exception);
+        JSStringRef exceptionIString = JSValueToStringCopy(context, exception, NULL);
         CFStringRef exceptionCF = JSStringCopyCFString(kCFAllocatorDefault, exceptionIString);
         CFShow(exceptionCF);
         CFRelease(exceptionCF);
@@ -81,7 +81,7 @@ int main(int argc, char* argv[])
 static JSValueRef print(JSContextRef context, JSObjectRef object, JSObjectRef thisObject, size_t argc, JSValueRef argv[], JSValueRef* exception)
 {
     if (argc > 0) {
-        JSStringRef string = JSValueToStringCopy(context, argv[0]);
+        JSStringRef string = JSValueToStringCopy(context, argv[0], NULL);
         size_t numChars = JSStringGetMaximumUTF8CStringSize(string);
         char stringUTF8[numChars];
         JSStringGetUTF8CString(string, stringUTF8, numChars);
index 8dfc46994c64a256254fc4de749a354d9d9ebf86..5e1754c739c07b4bdeb6583445822ad602aeee4b 100644 (file)
@@ -38,20 +38,20 @@ static JSContextRef context = 0;
 
 static void assertEqualsAsBoolean(JSValueRef value, bool expectedValue)
 {
-    if (JSValueToBoolean(context, value) != expectedValue)
+    if (JSValueToBoolean(context, value, NULL) != expectedValue)
         fprintf(stderr, "assertEqualsAsBoolean failed: %p, %d\n", value, expectedValue);
 }
 
 static void assertEqualsAsNumber(JSValueRef value, double expectedValue)
 {
-    double number = JSValueToNumber(context, value);
+    double number = JSValueToNumber(context, value, NULL);
     if (number != expectedValue && !(isnan(number) && isnan(expectedValue)))
         fprintf(stderr, "assertEqualsAsNumber failed: %p, %lf\n", value, expectedValue);
 }
 
 static void assertEqualsAsUTF8String(JSValueRef value, const char* expectedValue)
 {
-    JSStringRef valueAsString = JSValueToStringCopy(context, value);
+    JSStringRef valueAsString = JSValueToStringCopy(context, value, NULL);
 
     size_t jsSize = JSStringGetMaximumUTF8CStringSize(valueAsString);
     char jsBuffer[jsSize];
@@ -69,7 +69,7 @@ static void assertEqualsAsUTF8String(JSValueRef value, const char* expectedValue
 #if defined(__APPLE__)
 static void assertEqualsAsCharactersPtr(JSValueRef value, const char* expectedValue)
 {
-    JSStringRef valueAsString = JSValueToStringCopy(context, value);
+    JSStringRef valueAsString = JSValueToStringCopy(context, value, NULL);
 
     size_t jsLength = JSStringGetLength(valueAsString);
     const JSChar* jsBuffer = JSStringGetCharactersPtr(valueAsString);
@@ -195,9 +195,9 @@ static JSObjectRef MyObject_callAsConstructor(JSContextRef context, JSObjectRef
     UNUSED_PARAM(object);
 
     if (argc > 0 && JSValueIsStrictEqual(context, argv[0], JSValueMakeNumber(0)))
-        return JSValueToObject(context, JSValueMakeNumber(1));
+        return JSValueToObject(context, JSValueMakeNumber(1), NULL);
     
-    return JSValueToObject(context, JSValueMakeNumber(0));
+    return JSValueToObject(context, JSValueMakeNumber(0), NULL);
 }
 
 static bool MyObject_hasInstance(JSContextRef context, JSObjectRef constructor, JSValueRef possibleValue, JSValueRef* exception)
@@ -205,7 +205,7 @@ static bool MyObject_hasInstance(JSContextRef context, JSObjectRef constructor,
     UNUSED_PARAM(context);
 
     JSStringRef numberString = JSStringCreateWithUTF8CString("Number");
-    JSObjectRef numberConstructor = JSValueToObject(context, JSObjectGetProperty(context, JSContextGetGlobalObject(context), numberString));
+    JSObjectRef numberConstructor = JSValueToObject(context, JSObjectGetProperty(context, JSContextGetGlobalObject(context), numberString), NULL);
     JSStringRelease(numberString);
 
     return JSValueIsInstanceOfConstructor(context, possibleValue, numberConstructor);
@@ -218,7 +218,8 @@ static JSValueRef MyObject_convertToType(JSContextRef context, JSObjectRef objec
     
     switch (type) {
     case kJSTypeBoolean:
-        return JSValueMakeBoolean(false); // default object conversion is 'true'
+        *exception = JSValueMakeNumber(2);
+        return NULL;
     case kJSTypeNumber:
         return JSValueMakeNumber(1);
     default:
@@ -268,7 +269,7 @@ static JSValueRef print_callAsFunction(JSContextRef context, JSObjectRef functio
     UNUSED_PARAM(thisObject);
     
     if (argc > 0) {
-        JSStringRef string = JSValueToStringCopy(context, argv[0]);
+        JSStringRef string = JSValueToStringCopy(context, argv[0], NULL);
         size_t sizeUTF8 = JSStringGetMaximumUTF8CStringSize(string);
         char stringUTF8[sizeUTF8];
         JSStringGetUTF8CString(string, stringUTF8, sizeUTF8);
@@ -301,7 +302,10 @@ int main(int argc, char* argv[])
     UNUSED_PARAM(argv);
     
     context = JSContextCreate(NULL);
-
+    
+    JSObjectRef globalObject = JSContextGetGlobalObject(context);
+    assert(JSValueIsObject(globalObject));
+    
     JSValueRef jsUndefined = JSValueMakeUndefined();
     JSValueRef jsNull = JSValueMakeNull();
     JSValueRef jsTrue = JSValueMakeBoolean(true);
@@ -363,10 +367,34 @@ int main(int argc, char* argv[])
     assert(JSValueGetType(jsCFEmptyStringWithCharacters) == kJSTypeString);
 #endif // __APPLE__
 
+    JSObjectRef myObject = JSObjectMake(context, MyObject_class(context), NULL);
+    assert(didInitialize);
+    JSStringRef myObjectIString = JSStringCreateWithUTF8CString("MyObject");
+    JSObjectSetProperty(context, globalObject, myObjectIString, myObject, kJSPropertyAttributeNone);
+    JSStringRelease(myObjectIString);
+    
+    JSValueRef exception;
+
     // Conversions that throw exceptions
-    assert(NULL == JSValueToObject(context, jsNull));
-    assert(isnan(JSValueToNumber(context, jsObjectNoProto)));
-    assertEqualsAsCharactersPtr(jsObjectNoProto, "");
+    exception = NULL;
+    assert(NULL == JSValueToObject(context, jsNull, &exception));
+    assert(exception);
+    
+    exception = NULL;
+    assert(isnan(JSValueToNumber(context, jsObjectNoProto, &exception)));
+    assert(exception);
+
+    exception = NULL;
+    assert(!JSValueToStringCopy(context, jsObjectNoProto, &exception));
+    assert(exception);
+    
+    exception = NULL;
+    assert(!JSValueToBoolean(context, myObject, &exception));
+    assert(exception);
+    
+    exception = NULL;
+    assert(!JSValueIsEqual(context, jsObjectNoProto, JSValueMakeNumber(1), &exception));
+    assert(exception);
 
     assertEqualsAsBoolean(jsUndefined, false);
     assertEqualsAsBoolean(jsNull, false);
@@ -436,8 +464,8 @@ int main(int argc, char* argv[])
     assert(JSValueIsStrictEqual(context, jsTrue, jsTrue));
     assert(!JSValueIsStrictEqual(context, jsOne, jsOneString));
 
-    assert(JSValueIsEqual(context, jsOne, jsOneString));
-    assert(!JSValueIsEqual(context, jsTrue, jsFalse));
+    assert(JSValueIsEqual(context, jsOne, jsOneString, NULL));
+    assert(!JSValueIsEqual(context, jsTrue, jsFalse, NULL));
     
 #if defined(__APPLE__)
     CFStringRef cfJSString = JSStringCopyCFString(kCFAllocatorDefault, jsCFIString);
@@ -457,34 +485,28 @@ int main(int argc, char* argv[])
     assert(JSValueIsObject(jsGlobalValue));
     JSValueUnprotect(jsGlobalValue);
 
-    /* JSInterpreter.h */
-    
-    JSObjectRef globalObject = JSContextGetGlobalObject(context);
-    assert(JSValueIsObject(globalObject));
-
     JSStringRef goodSyntax = JSStringCreateWithUTF8CString("x = 1;");
     JSStringRef badSyntax = JSStringCreateWithUTF8CString("x := 1;");
-    assert(JSCheckSyntax(context, goodSyntax, NULL, 0, NULL));
-    assert(!JSCheckSyntax(context, badSyntax, NULL, 0, NULL));
+    assert(JSCheckScriptSyntax(context, goodSyntax, NULL, 0, NULL));
+    assert(!JSCheckScriptSyntax(context, badSyntax, NULL, 0, NULL));
 
     JSValueRef result;
-    JSValueRef exception;
     JSValueRef v;
     JSObjectRef o;
 
-    result = JSEvaluate(context, goodSyntax, NULL, NULL, 1, NULL);
+    result = JSEvaluateScript(context, goodSyntax, NULL, NULL, 1, NULL);
     assert(result);
-    assert(JSValueIsEqual(context, result, jsOne));
+    assert(JSValueIsEqual(context, result, jsOne, NULL));
 
     exception = NULL;
-    result = JSEvaluate(context, badSyntax, NULL, NULL, 1, &exception);
+    result = JSEvaluateScript(context, badSyntax, NULL, NULL, 1, &exception);
     assert(!result);
     assert(JSValueIsObject(exception));
     
     JSStringRef array = JSStringCreateWithUTF8CString("Array");
     v = JSObjectGetProperty(context, globalObject, array);
     assert(v);
-    JSObjectRef arrayConstructor = JSValueToObject(context, v);
+    JSObjectRef arrayConstructor = JSValueToObject(context, v, NULL);
     JSStringRelease(array);
     result = JSObjectCallAsConstructor(context, arrayConstructor, 0, NULL, NULL);
     assert(result);
@@ -498,7 +520,7 @@ int main(int argc, char* argv[])
     JSStringRef line = JSStringCreateWithUTF8CString("line");
     assert(!JSObjectMakeFunctionWithBody(context, functionBody, NULL, 1, &exception));
     assert(JSValueIsObject(exception));
-    v = JSObjectGetProperty(context, JSValueToObject(context, exception), line);
+    v = JSObjectGetProperty(context, JSValueToObject(context, exception, NULL), line);
     assert(v);
     assertEqualsAsNumber(v, 2); // FIXME: Lexer::setCode bumps startingLineNumber by 1 -- we need to change internal callers so that it doesn't have to (saying '0' to mean '1' in the API would be really confusing -- it's really confusing internally, in fact)
     JSStringRelease(functionBody);
@@ -510,14 +532,8 @@ int main(int argc, char* argv[])
 
     assert(JSObjectIsFunction(function));
     v = JSObjectCallAsFunction(context, function, NULL, 0, NULL, NULL);
-    assert(JSValueIsEqual(context, v, arrayConstructor));
+    assert(JSValueIsEqual(context, v, arrayConstructor, NULL));
                                                   
-    JSObjectRef myObject = JSObjectMake(context, MyObject_class(context), NULL);
-    assert(didInitialize);
-    JSStringRef myObjectIString = JSStringCreateWithUTF8CString("MyObject");
-    JSObjectSetProperty(context, globalObject, myObjectIString, myObject, kJSPropertyAttributeNone);
-    JSStringRelease(myObjectIString);
-
     JSStringRef print = JSStringCreateWithUTF8CString("print");
     JSObjectRef printFunction = JSObjectMakeFunction(context, print_callAsFunction);
     JSObjectSetProperty(context, globalObject, print, printFunction, kJSPropertyAttributeNone); 
@@ -551,18 +567,18 @@ int main(int argc, char* argv[])
     function = JSObjectMakeFunctionWithBody(context, functionBody, NULL, 1, NULL);
     JSStringRelease(functionBody);
     v = JSObjectCallAsFunction(context, function, NULL, 0, NULL, NULL);
-    assert(JSValueIsEqual(context, v, globalObject));
+    assert(JSValueIsEqual(context, v, globalObject, NULL));
     v = JSObjectCallAsFunction(context, function, o, 0, NULL, NULL);
-    assert(JSValueIsEqual(context, v, o));
+    assert(JSValueIsEqual(context, v, o, NULL));
     
     char* scriptUTF8 = createStringWithContentsOfFile("testapi.js");
     JSStringRef script = JSStringCreateWithUTF8CString(scriptUTF8);
-    result = JSEvaluate(context, script, NULL, NULL, 1, &exception);
+    result = JSEvaluateScript(context, script, NULL, NULL, 1, &exception);
     if (JSValueIsUndefined(result))
         printf("PASS: Test script executed successfully.\n");
     else {
         printf("FAIL: Test script returned unexcpected value:\n");
-        JSStringRef exceptionIString = JSValueToStringCopy(context, exception);
+        JSStringRef exceptionIString = JSValueToStringCopy(context, exception, NULL);
         CFStringRef exceptionCF = JSStringCopyCFString(kCFAllocatorDefault, exceptionIString);
         CFShow(exceptionCF);
         CFRelease(exceptionCF);
index e2cddb4df7e5bc1ee3a0af904752a96beccf481e..5ba30ee7f22a9ae99db3319a0e2d0e71933b3736 100644 (file)
@@ -72,7 +72,7 @@ shouldBe("MyObject.regularType", undefined);
 shouldBe("MyObject(0)", 1);
 shouldBe("MyObject()", undefined);
 shouldBe("typeof new MyObject()", "object");
-shouldBe("MyObject ? 1 : 0", 0); // toBoolean
+shouldBe("MyObject ? 1 : 0", 2); // toBoolean -- should throw 2
 shouldBe("+MyObject", 1); // toNumber
 shouldBe("(MyObject.toString())", "[object CallbackObject]"); // toString
 shouldBe("MyObject - 0", NaN); // toPrimitive
index 6f3b09ee9cf13958f07d04951932eb8abde74565..841984693a02e29055b590bc3456109a210e4f2b 100644 (file)
@@ -1,3 +1,15 @@
+2006-07-13  Geoffrey Garen  <ggaren@apple.com>
+
+        Pleasing to Maciej.
+        
+        - Renamed JSEvaluate -> JSEvaluateScript, JSCheckSyntax -> JSCheckScriptSyntax
+        - Added exception out parameters to JSValueTo* and JSValueIsEqual because
+        they can throw
+        - Removed JSObjectGetDescription because it's useless and vague, and 
+        JSValueToString/JSValueIsObjectOfClass do a better job, anyway
+        - Clarified comments about "IsFunction/Constructor" to indicate that they
+        are true of all functions/constructors, not just those created by JSObjectMake*
+
 2006-07-12  Geoffrey Garen  <ggaren@apple.com>
 
         RS by Beth.
index 6f0045b8bcc2421c3497e2f33ca1cbb8b8f0f31b..ebeed090b1536d5793f99a7e026d5fea0417a0b8 100644 (file)
@@ -1,20 +1,19 @@
 .objc_class_name_WebScriptObject
 .objc_class_name_WebScriptObjectPrivate
 .objc_class_name_WebUndefined
-_JSCheckSyntax
+_JSCheckScriptSyntax
 _JSClassCreate
 _JSClassRelease
 _JSClassRetain
 _JSContextCreate
 _JSContextDestroy
 _JSContextGetGlobalObject
-_JSEvaluate
+_JSEvaluateScript
 _JSGarbageCollect
 _JSObjectCallAsConstructor
 _JSObjectCallAsFunction
 _JSObjectCreatePropertyEnumerator
 _JSObjectDeleteProperty
-_JSObjectGetDescription
 _JSObjectGetPrivate
 _JSObjectGetProperty
 _JSObjectGetPrototype