Objective-C API for JavaScriptCore
authorbarraclough@apple.com <barraclough@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 2 Jan 2013 23:34:48 +0000 (23:34 +0000)
committerbarraclough@apple.com <barraclough@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 2 Jan 2013 23:34:48 +0000 (23:34 +0000)
https://bugs.webkit.org/show_bug.cgi?id=105889

Reviewed by Geoff Garen.

Fixes for a number of issues raised by Darin.

* API/APIJSValue.h:
    - Fix typos in comment
    - Add newline before NS_CLASS_AVAILABLE(10_9, NA)
    - cls -> expectedClass
    - key type for -setObject:forKeyedSubscript: is now NSObject <NSCopying> *
* API/JSBase.h:
    - JS_OBJC_API_ENABLED no longer implies __OBJC__
* API/JSBlockAdaptor.mm:
(BlockArgumentStruct::BlockArgumentStruct):
(BlockArgumentStruct):
    - mark virtual functions as virtual, override, and private
    - refactor out buffer allocation for struct types
(BlockArgumentTypeDelegate::typeVoid):
(BlockArgumentTypeDelegate::typeBlock):
(BlockArgumentTypeDelegate::typeStruct):
    - return nil -> return 0
(BlockResultStruct::BlockResultStruct):
(BlockResultStruct):
    - mark virtual functions as virtual, override, and private
    - refactor out buffer allocation for struct types
(buildBlockSignature):
    - %lu is not an appropriate format specifier for NSInteger
(-[JSBlockAdaptor initWithBlockSignatureFromProtocol:]):
    - nil check [super init]
(-[JSBlockAdaptor blockMatchesSignature:]):
(-[JSBlockAdaptor blockFromValue:inContext:withException:]):
    - ctx -> contextRef
* API/JSContext.h:
    - Fix typos in comment
    - Add newline before NS_CLASS_AVAILABLE(10_9, NA)
    - key type for -setObject:forKeyedSubscript: is now NSObject <NSCopying> *
* API/JSContext.mm:
(-[JSContext initWithVirtualMachine:]):
    - nil check [super init]
(+[JSContext currentArguments]):
    - args -> argumentArray
(-[JSContext setObject:forKeyedSubscript:]):
    - key type for -setObject:forKeyedSubscript: is now NSObject <NSCopying> *
(-[JSContext dealloc]):
(-[JSContext protect:]):
(-[JSContext unprotect:]):
    - m_protected -> m_protectCounts
* API/JSValue.mm:
(-[JSValue toObjectOfClass:]):
    - cls -> expectedClass
(-[JSValue toBool]):
(-[JSValue deleteProperty:]):
(-[JSValue hasProperty:]):
(-[JSValue isUndefined]):
(-[JSValue isNull]):
(-[JSValue isBoolean]):
(-[JSValue isNumber]):
(-[JSValue isString]):
(-[JSValue isObject]):
(-[JSValue isEqualToObject:]):
(-[JSValue isEqualWithTypeCoercionToObject:]):
(-[JSValue isInstanceOf:]):
    - removed ? YES : NO
(-[JSValue callWithArguments:]):
(-[JSValue constructWithArguments:]):
(-[JSValue invokeMethod:withArguments:]):
    - args -> argumentArray
(+[JSValue valueWithPoint:inContext:]):
(+[JSValue valueWithRange:inContext:]):
(+[JSValue valueWithRect:inContext:]):
(+[JSValue valueWithSize:inContext:]):
    - [NSNumber numberWithFloat:] -> @()
(-[JSValue objectForKeyedSubscript:]):
(-[JSValue setObject:forKeyedSubscript:]):
    - key type for -setObject:forKeyedSubscript: is now NSObject <NSCopying> *
(JSContainerConvertor):
(JSContainerConvertor::isWorkListEmpty):
(JSContainerConvertor::convert):
(ObjcContainerConvertor):
(ObjcContainerConvertor::isWorkListEmpty):
    - remove WTF::
    - isWorkListEmpty is const
(objectToValue):
    -  use fast enumeration
(-[JSValue initWithValue:inContext:]):
    - nil check [super init]
(getStructTagHandler):
    - m_structHandlers -> structHandlers
* API/JSVirtualMachine.h:
    - Add newline before NS_CLASS_AVAILABLE(10_9, NA)
* API/JSVirtualMachine.mm:
(-[JSVirtualMachine init]):
    - nil check [super init]
* API/JSWrapperMap.mm:
(selectorToPropertyName):
(copyPrototypeProperties):
    - remove WTF::
    - use static_cast
(-[JSObjCClassInfo initWithContext:forClass:superClassInfo:]):
(-[JSWrapperMap initWithContext:]):
    - nil check [super init]
(-[JSWrapperMap wrapperForObject:]):
(tryUnwrapObjcObject):
    - enable ASSERT
(getJSExportProtocol):
(getNSBlockClass):
    - remove if check on initializing static
* API/JavaScriptCore.h:
    - JS_OBJC_API_ENABLED no longer implies __OBJC__
* API/ObjCCallbackFunction.mm:
(CallbackArgumentOfClass):
(CallbackArgumentOfClass::~CallbackArgumentOfClass):
(CallbackArgumentStruct::CallbackArgumentStruct):
(CallbackArgumentStruct):
(CallbackArgumentBlockCallback):
    - mark virtual functions as virtual, override, and private
    - refactor out buffer allocation for struct types
(ArgumentTypeDelegate::typeVoid):
(ArgumentTypeDelegate::typeOfClass):
(ArgumentTypeDelegate::typeStruct):
    - return nil -> return 0
(CallbackResultStruct::CallbackResultStruct):
(CallbackResultStruct):
    - mark virtual functions as virtual, override, and private
    - refactor out buffer allocation for struct types
(ResultTypeDelegate::typeStruct):
    - return nil -> return 0
(ObjCCallbackFunction):
    - remove WTF::
(objCCallbackFunctionFinalize):
    - use static_cast
(objCCallbackFunctionCallAsFunction):
    - Fix typos in comment
(createObjCCallbackFunctionClass):
(objCCallbackFunctionClass):
    - Split out createObjCCallbackFunctionClass from objCCallbackFunctionClass
(ObjCCallbackFunction::call):
    - ctx -> contextRef
(blockSignatureContainsClass):
    - Remove tri-state enum.
(skipNumber):
    - isdigit -> isASCIIDigit
(objCCallbackFunctionForInvocation):
    - clean up & comment blockSignatureContainsClass() usage
(tryUnwrapBlock):
    - use static_cast
* API/ObjcRuntimeExtras.h:
(forEachProtocolImplementingProtocol):
(forEachMethodInClass):
(forEachMethodInProtocol):
(forEachPropertyInProtocol):
    - Remove WTF::
    - Remove if (count) checks
(skipPair):
    - NSUInteger -> size_t
(StringRange):
(StringRange::operator const char*):
(StringRange::get):
(StructBuffer):
(StructBuffer::StructBuffer):
(StructBuffer::~StructBuffer):
(StructBuffer::operator void*):
    - Added helper for creating an aligned buffer, used by struct conversion invocations.
(parseObjCType):
    - *(position++) -> *position++
* API/tests/testapi.c:
    - PLATFORM(MAC) -> JS_OBJC_API_ENABLED
* API/tests/testapi.m:
(blockSignatureContainsClass):
    - Remove tri-state enum.
(testObjectiveCAPI):
    - Added more result type checks.

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

15 files changed:
Source/JavaScriptCore/API/APIJSValue.h
Source/JavaScriptCore/API/JSBase.h
Source/JavaScriptCore/API/JSBlockAdaptor.mm
Source/JavaScriptCore/API/JSContext.h
Source/JavaScriptCore/API/JSContext.mm
Source/JavaScriptCore/API/JSValue.mm
Source/JavaScriptCore/API/JSVirtualMachine.h
Source/JavaScriptCore/API/JSVirtualMachine.mm
Source/JavaScriptCore/API/JSWrapperMap.mm
Source/JavaScriptCore/API/JavaScriptCore.h
Source/JavaScriptCore/API/ObjCCallbackFunction.mm
Source/JavaScriptCore/API/ObjcRuntimeExtras.h
Source/JavaScriptCore/API/tests/testapi.c
Source/JavaScriptCore/API/tests/testapi.m
Source/JavaScriptCore/ChangeLog

index 9fc291a..4ee7439 100644 (file)
@@ -34,9 +34,9 @@
 // originate from the same JSContext as the JSValue on which the method was
 // invoked.
 //
-// The JSContext is used to manage the life-cycle of the refereced JavaScript
+// The JSContext is used to manage the life-cycle of the referenced JavaScript
 // value within the virtual machine. So long as the JSContext is being retained
-// the JSValue will continue to keep the referencd value within the JavaScript
+// the JSValue will continue to keep the referenced value within the JavaScript
 // virtual machine alive. When the JSContext associated with a JSValue is
 // deallocated the weak context property of the JSValue will become nil. After
 // this occurs the value within the JavaScript virtual machine is no longer
@@ -47,7 +47,7 @@
 // For all methods taking arguments of type id, arguments will be converted
 // into a JavaScript value according to the conversion specified below.
 // All JavaScript values are associated with a particular JSVirtualMachine
-// (the associated JSVirtualMachine is avaible indirectly via the context
+// (the associated JSVirtualMachine is available indirectly via the context
 // property). An instance of JSValue may only be passed as an argument to
 // methods on instances of JSValue and JSContext that belong to the same
 // JSVirtualMachine - passing a JSValue to a method on an object originating
@@ -90,8 +90,9 @@
 // the Objective-C instance being retained by the wrapper is returned.
 //
 // *** For Objective-C Class objects a constructor object containing exported
-// class methods will be returned. See JSExport.h sor more information on
+// class methods will be returned. See JSExport.h for more information on
 // constructor objects.
+
 NS_CLASS_AVAILABLE(10_9, NA)
 @interface JSValue : NSObject
 
@@ -115,7 +116,7 @@ NS_CLASS_AVAILABLE(10_9, NA)
 - (id)toObject;
 // Convert this value to a corresponding Objective-C object, if the result is
 // not of the specified class then nil will be returned.
-- (id)toObjectOfClass:(Class)cls;
+- (id)toObjectOfClass:(Class)expectedClass;
 // The value is copied to a boolean according to the conversion specified by the
 // JavaScript language.
 - (BOOL)toBool;
@@ -254,7 +255,7 @@ NS_CLASS_AVAILABLE(10_9, NA)
 
 - (JSValue *)objectForKeyedSubscript:(id)key;
 - (JSValue *)objectAtIndexedSubscript:(NSUInteger)index;
-- (void)setObject:(id)object forKeyedSubscript:(id <NSCopying>)key;
+- (void)setObject:(id)object forKeyedSubscript:(NSObject <NSCopying> *)key;
 - (void)setObject:(id)object atIndexedSubscript:(NSUInteger)index;
 
 @end
index eed88b6..d5dafc9 100644 (file)
@@ -141,6 +141,6 @@ JS_EXPORT void JSGarbageCollect(JSContextRef ctx);
 
 /* Enable the Objective-C API for platforms with a modern runtime. */
 #undef JS_OBJC_API_ENABLED
-#define JS_OBJC_API_ENABLED (defined(__OBJC__) && defined(__clang__) && defined(__APPLE__) && (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1090) && !defined(__i386__))
+#define JS_OBJC_API_ENABLED (defined(__clang__) && defined(__APPLE__) && (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1090) && !defined(__i386__))
 
 #endif /* JSBase_h */
index 3cfafee..49587dc 100644 (file)
@@ -40,8 +40,8 @@
 #import "wtf/OwnPtr.h"
 
 extern "C" {
-id __NSMakeSpecialForwardingCaptureBlock(const char *signature, void (^handler)(NSInvocation *inv));
-};
+id __NSMakeSpecialForwardingCaptureBlock(const char *signature, void (^handler)(NSInvocation *));
+}
 
 class BlockArgument {
 public:
@@ -56,8 +56,7 @@ BlockArgument::~BlockArgument()
 }
 
 class BlockArgumentBoolean : public BlockArgument {
-public:
-    JSValueRef get(NSInvocation* invocation, NSInteger argumentNumber, JSContext* context, JSValueRef*)
+    virtual JSValueRef get(NSInvocation* invocation, NSInteger argumentNumber, JSContext* context, JSValueRef*) override
     {
         bool value;
         [invocation getArgument:&value atIndex:argumentNumber];
@@ -67,8 +66,7 @@ public:
 
 template<typename T>
 class BlockArgumentNumeric : public BlockArgument {
-public:
-    JSValueRef get(NSInvocation* invocation, NSInteger argumentNumber, JSContext* context, JSValueRef*)
+    virtual JSValueRef get(NSInvocation* invocation, NSInteger argumentNumber, JSContext* context, JSValueRef*) override
     {
         T value;
         [invocation getArgument:&value atIndex:argumentNumber];
@@ -77,8 +75,7 @@ public:
 };
 
 class BlockArgumentId : public BlockArgument {
-public:
-    JSValueRef get(NSInvocation* invocation, NSInteger argumentNumber, JSContext* context, JSValueRef*)
+    virtual JSValueRef get(NSInvocation* invocation, NSInteger argumentNumber, JSContext* context, JSValueRef*) override
     {
         id value;
         [invocation getArgument:&value atIndex:argumentNumber];
@@ -90,26 +87,16 @@ class BlockArgumentStruct : public BlockArgument {
 public:
     BlockArgumentStruct(NSInvocation* conversionInvocation, const char* encodedType)
         : m_conversionInvocation(conversionInvocation)
+        , m_buffer(encodedType)
     {
-        [m_conversionInvocation retain];
-        NSUInteger size, alignment;
-        NSGetSizeAndAlignment(encodedType, &size, &alignment);
-        --alignment;
-        m_allocation = (char*)malloc(size + alignment);
-        m_buffer = reinterpret_cast<char*>((reinterpret_cast<intptr_t>(m_allocation) + alignment) & ~alignment);
-    }
-    
-    virtual ~BlockArgumentStruct()
-    {
-        [m_conversionInvocation release];
-        free(m_allocation);
     }
     
-    virtual JSValueRef get(NSInvocation* invocation, NSInteger argumentNumber, JSContext* context, JSValueRef*)
+private:
+    virtual JSValueRef get(NSInvocation* invocation, NSInteger argumentNumber, JSContext* context, JSValueRef*) override
     {
-        [invocation getArgument:m_allocation atIndex:argumentNumber];
+        [invocation getArgument:m_buffer atIndex:argumentNumber];
 
-        [m_conversionInvocation setArgument:m_allocation atIndex:2];
+        [m_conversionInvocation setArgument:m_buffer atIndex:2];
         [m_conversionInvocation setArgument:&context atIndex:3];
         [m_conversionInvocation invokeWithTarget:[JSValue class]];
 
@@ -118,10 +105,8 @@ public:
         return valueInternalValue(value);
     }
 
-private:
-    NSInvocation* m_conversionInvocation;
-    char* m_buffer;
-    char* m_allocation;
+    RetainPtr<NSInvocation> m_conversionInvocation;
+    StructBuffer m_buffer;
 };
 
 class BlockArgumentTypeDelegate {
@@ -148,7 +133,7 @@ public:
     static ResultType typeVoid()
     {
         ASSERT_NOT_REACHED();
-        return nil;
+        return 0;
     }
 
     static ResultType typeId()
@@ -163,7 +148,7 @@ public:
 
     static ResultType typeBlock(const char*, const char*)
     {
-        return nil;
+        return 0;
     }
 
     static ResultType typeStruct(const char* begin, const char* end)
@@ -171,7 +156,7 @@ public:
         StringRange copy(begin, end);
         if (NSInvocation* invocation = valueToTypeInvocationFor(copy))
             return new BlockArgumentStruct(invocation, copy);
-        return nil;
+        return 0;
     }
 };
 
@@ -185,16 +170,14 @@ public:
 };
 
 class BlockResultVoid : public BlockResult {
-public:
-    void set(NSInvocation*, JSContext*, JSValueRef, JSValueRef*)
+    virtual void set(NSInvocation*, JSContext*, JSValueRef, JSValueRef*) override
     {
     }
 };
 
 template<typename T>
 class BlockResultInteger : public BlockResult {
-public:
-    void set(NSInvocation* invocation, JSContext* context, JSValueRef result, JSValueRef* exception)
+    virtual void set(NSInvocation* invocation, JSContext* context, JSValueRef result, JSValueRef* exception) override
     {
         T value = (T)JSC::toInt32(JSValueToNumber(contextInternalContext(context), result, exception));
         [invocation setReturnValue:&value];
@@ -203,8 +186,7 @@ public:
 
 template<typename T>
 class BlockResultDouble : public BlockResult {
-public:
-    void set(NSInvocation* invocation, JSContext* context, JSValueRef result, JSValueRef* exception)
+    virtual void set(NSInvocation* invocation, JSContext* context, JSValueRef result, JSValueRef* exception) override
     {
         T value = (T)JSValueToNumber(contextInternalContext(context), result, exception);
         [invocation setReturnValue:&value];
@@ -212,8 +194,7 @@ public:
 };
 
 class BlockResultBoolean : public BlockResult {
-public:
-    void set(NSInvocation* invocation, JSContext* context, JSValueRef result, JSValueRef*)
+    virtual void set(NSInvocation* invocation, JSContext* context, JSValueRef result, JSValueRef*) override
     {
         bool value = JSValueToBoolean(contextInternalContext(context), result);
         [invocation setReturnValue:&value];
@@ -224,22 +205,12 @@ class BlockResultStruct : public BlockResult {
 public:
     BlockResultStruct(NSInvocation* conversionInvocation, const char* encodedType)
         : m_conversionInvocation(conversionInvocation)
+        , m_buffer(encodedType)
     {
-        [m_conversionInvocation retain];
-        NSUInteger size, alignment;
-        NSGetSizeAndAlignment(encodedType, &size, &alignment);
-        --alignment;
-        m_allocation = (char*)malloc(size + alignment);
-        m_buffer = reinterpret_cast<char*>((reinterpret_cast<intptr_t>(m_allocation) + alignment) & ~alignment);
-    }
-    
-    virtual ~BlockResultStruct()
-    {
-        [m_conversionInvocation release];
-        free(m_allocation);
     }
     
-    void set(NSInvocation* invocation, JSContext* context, JSValueRef result, JSValueRef*)
+private:
+    virtual void set(NSInvocation* invocation, JSContext* context, JSValueRef result, JSValueRef*) override
     {
         JSValue* value = [JSValue valueWithValue:result inContext:context];
         [m_conversionInvocation invokeWithTarget:value];
@@ -247,25 +218,23 @@ public:
         [invocation setReturnValue:&value];
     }
 
-private:
-    NSInvocation* m_conversionInvocation;
-    char* m_buffer;
-    char* m_allocation;
+    RetainPtr<NSInvocation> m_conversionInvocation;
+    StructBuffer m_buffer;
 };
 
 @implementation JSBlockAdaptor {
-    WTF::RetainPtr<NSString> m_signatureWithOffsets;
-    WTF::RetainPtr<NSString> m_signatureWithoutOffsets;
+    RetainPtr<NSString> m_signatureWithOffsets;
+    RetainPtr<NSString> m_signatureWithoutOffsets;
     OwnPtr<BlockResult> m_result;
     OwnPtr<BlockArgument> m_arguments;
     size_t m_argumentCount;
 }
 
 // Helper function to add offset information back into a block signature.
-static NSString* buildBlockSignature(NSString* prefix, const char* begin, const char* end, NSUInteger& offset, NSString* postfix)
+static NSString* buildBlockSignature(NSString* prefix, const char* begin, const char* end, unsigned long long& offset, NSString* postfix)
 {
     StringRange copy(begin, end);
-    NSString* result = [NSString stringWithFormat:@"%@%s%lu%@", prefix, copy.get(), offset, postfix];
+    NSString* result = [NSString stringWithFormat:@"%@%s%@%@", prefix, copy.get(), @(offset), postfix];
     NSUInteger size;
     NSGetSizeAndAlignment(copy, &size, 0);
     if (size < 4)
@@ -276,7 +245,9 @@ static NSString* buildBlockSignature(NSString* prefix, const char* begin, const
 
 - (id)initWithBlockSignatureFromProtocol:(const char*)encodedType
 {
-    [super init];
+    self = [super init];
+    if (!self)
+        return nil;
 
     m_signatureWithoutOffsets = [NSString stringWithUTF8String:encodedType];
     m_argumentCount = 0;
@@ -288,16 +259,15 @@ static NSString* buildBlockSignature(NSString* prefix, const char* begin, const
     OwnPtr<BlockResult> result = adoptPtr(new BlockResultVoid);
     const char* resultTypeEnd = encodedType;
 
-    if (encodedType[0] != '@' || encodedType[1] != '?') {
+    if (encodedType[0] != '@' || encodedType[1] != '?')
         return self;
-    }
     encodedType += 2;
 
     // The first argument to a block is the block itself.
     NSString* signature = @"@?0";
-    NSUInteger offset = sizeof(void*);
+    unsigned long long offset = sizeof(void*);
 
-    OwnPtr<BlockArgument> arguments = 0;
+    OwnPtr<BlockArgument> arguments;
     OwnPtr<BlockArgument>* nextArgument = &arguments;
     while (*encodedType) {
         const char* begin = encodedType;
@@ -316,7 +286,7 @@ static NSString* buildBlockSignature(NSString* prefix, const char* begin, const
 
     // Prefix the signature with the return type & total stackframe size.
     // (this call will also add the return type size to the offset,
-    // which is a nonsesne, but harmless since this is the last use).
+    // which is a nonsense, but harmless since this is the last use).
     signature = buildBlockSignature(@"", resultTypeBegin, resultTypeEnd, offset, signature);
 
     m_signatureWithOffsets = signature;
@@ -334,7 +304,7 @@ static NSString* buildBlockSignature(NSString* prefix, const char* begin, const
     if (!_Block_has_signature(block))
         return false;
 
-    const char* withoutOffsets= [m_signatureWithoutOffsets UTF8String];
+    const char* withoutOffsets = [m_signatureWithoutOffsets UTF8String];
     const char* signature = _Block_signature(block);
 
     while (true) {
@@ -354,30 +324,30 @@ static NSString* buildBlockSignature(NSString* prefix, const char* begin, const
 
 - (id)blockFromValue:(JSValueRef)argument inContext:(JSContext*)context withException:(JSValueRef*)exception
 {
-    JSGlobalContextRef ctx = contextInternalContext(context);
+    JSGlobalContextRef contextRef = contextInternalContext(context);
 
     // Check for null/undefined.
-    if (JSValueIsUndefined(ctx, argument) || JSValueIsNull(ctx, argument))
+    if (JSValueIsUndefined(contextRef, argument) || JSValueIsNull(contextRef, argument))
         return nil;
 
     JSObjectRef function = 0;
-    if (id object = tryUnwrapObjcObject(ctx, argument)) {
+    if (id object = tryUnwrapObjcObject(contextRef, argument)) {
         // Check if the argument is an Objective-C block.
         if ([object isKindOfClass:getNSBlockClass()]) {
             if ([self blockMatchesSignature:object])
                 return object;
         }
-    } else if (m_signatureWithOffsets && JSValueIsObject(ctx, argument)) {
+    } else if (m_signatureWithOffsets && JSValueIsObject(contextRef, argument)) {
         // Check if the argument is a JavaScript function
         // (and that were able to create a forwarding block for this signature).
-        JSObjectRef object = JSValueToObject(ctx, argument, exception);
-        if (JSObjectIsFunction(ctx, object))
+        JSObjectRef object = JSValueToObject(contextRef, argument, exception);
+        if (JSObjectIsFunction(contextRef, object))
             function = object;
     }
 
     if (!function) {
-        JSC::APIEntryShim entryShim(toJS(ctx));
-        *exception = toRef(JSC::createTypeError(toJS(ctx), "Invalid argument supplied for Objective-C block"));
+        JSC::APIEntryShim entryShim(toJS(contextRef));
+        *exception = toRef(JSC::createTypeError(toJS(contextRef), "Invalid argument supplied for Objective-C block"));
         return nil;
     }
 
@@ -396,15 +366,15 @@ static NSString* buildBlockSignature(NSString* prefix, const char* begin, const
         JSContext* context = value.context;
         if (!context)
             return;
-        JSGlobalContextRef ctx = contextInternalContext(context);
+        JSGlobalContextRef contextRef = contextInternalContext(context);
 
-        JSValueRef args[adaptor->m_argumentCount];
+        JSValueRef argumentArray[adaptor->m_argumentCount];
 
         size_t argumentNumber = 0;
         BlockArgument* arguments = adaptor->m_arguments.get();
         for (BlockArgument* argument = arguments; argument; argument = argument->m_next.get()) {
             JSValueRef exception = 0;
-            args[argumentNumber] = argument->get(invocation, argumentNumber + 1, context, &exception);
+            argumentArray[argumentNumber] = argument->get(invocation, argumentNumber + 1, context, &exception);
             if (exception) {
                 [context notifyException:exception];
                 return;
@@ -415,7 +385,7 @@ static NSString* buildBlockSignature(NSString* prefix, const char* begin, const
         size_t argumentCount = argumentNumber;
 
         JSValueRef exception = 0;
-        JSObjectCallAsFunction(ctx, JSValueToObject(ctx, valueInternalValue(value), 0), 0, argumentCount, args, &exception);
+        JSObjectCallAsFunction(contextRef, JSValueToObject(contextRef, valueInternalValue(value), 0), 0, argumentCount, argumentArray, &exception);
         if (exception) {
             [context notifyException:exception];
             return;
index f879a3a..bdacd2f 100644 (file)
@@ -29,7 +29,7 @@
 
 @class JSVirtualMachine, JSValue;
 
-// An instance of JSContext represents a JavaScript execution environment, all
+// An instance of JSContext represents a JavaScript execution environment. All
 // JavaScript execution takes place within a context.
 // JSContext is also used to manage the life-cycle of objects within the
 // JavaScript virtual machine. Every instance of JSValue is associated with a
@@ -38,6 +38,7 @@
 // of JSContext is deallocated and the weak references to it are cleared the
 // JSValues that had been associated with this context will be invalidated, and
 // will cease to keep the values within the JavaScript engine alive.
+
 NS_CLASS_AVAILABLE(10_9, NA)
 @interface JSContext : NSObject
 
@@ -109,7 +110,7 @@ NS_CLASS_AVAILABLE(10_9, NA)
 @interface JSContext(SubscriptSupport)
 
 - (JSValue *)objectForKeyedSubscript:(id)key;
-- (void)setObject:(id)object forKeyedSubscript:(id <NSCopying>)key;
+- (void)setObject:(id)object forKeyedSubscript:(NSObject <NSCopying> *)key;
 
 @end
 
index 29391cc..c0f01fe 100644 (file)
 
 #if JS_OBJC_API_ENABLED
 
-typedef WTF::HashMap<JSValueRef, size_t> ProtectMap;
+typedef HashMap<JSValueRef, size_t> ProtectMap;
 
 @implementation JSContext {
     JSVirtualMachine *m_virtualMachine;
     JSGlobalContextRef m_context;
     JSWrapperMap *m_wrapperMap;
-    ProtectMap m_protected;
+    ProtectMap m_protectCounts;
 }
 
 @synthesize exception;
@@ -56,7 +56,9 @@ typedef WTF::HashMap<JSValueRef, size_t> ProtectMap;
 
 - (id)initWithVirtualMachine:(JSVirtualMachine *)virtualMachine
 {
-    [super init];
+    self = [super init];
+    if (!self)
+        return nil;
 
     m_virtualMachine = [virtualMachine retain];
     m_context = JSGlobalContextCreateInGroup(getGroupFromVirtualMachine(virtualMachine), 0);
@@ -115,10 +117,10 @@ typedef WTF::HashMap<JSValueRef, size_t> ProtectMap;
     if (!entry->currentArguments) {
         JSContext *context = [JSContext currentContext];
         size_t count = entry->argumentCount;
-        JSValue * args[count];
+        JSValue * argumentArray[count];
         for (size_t i =0; i < count; ++i)
-            args[i] = [JSValue valueWithValue:entry->arguments[i] inContext:context];
-        entry->currentArguments = [[NSArray alloc] initWithObjects:args count:count];
+            argumentArray[i] = [JSValue valueWithValue:entry->arguments[i] inContext:context];
+        entry->currentArguments = [[NSArray alloc] initWithObjects:argumentArray count:count];
     }
 
     return entry->currentArguments;
@@ -138,7 +140,7 @@ typedef WTF::HashMap<JSValueRef, size_t> ProtectMap;
     return [self globalObject][key];
 }
 
-- (void)setObject:(id)object forKeyedSubscript:(id <NSCopying>)key
+- (void)setObject:(id)object forKeyedSubscript:(NSObject <NSCopying> *)key
 {
     [self globalObject][key] = object;
 }
@@ -156,8 +158,8 @@ JSGlobalContextRef contextInternalContext(JSContext* context)
 {
     toJS(m_context)->lexicalGlobalObject()->m_apiData = 0;
 
-    ProtectMap::iterator iterator = m_protected.begin();
-    ProtectMap::iterator end = m_protected.end();
+    ProtectMap::iterator iterator = m_protectCounts.begin();
+    ProtectMap::iterator end = m_protectCounts.end();
     for (; iterator != end; ++iterator)
         JSValueUnprotect(m_context, iterator->key);
 
@@ -207,10 +209,10 @@ JSGlobalContextRef contextInternalContext(JSContext* context)
 
 - (void)protect:(JSValueRef)value
 {
-    // Lock access to m_protected
+    // Lock access to m_protectCounts
     JSC::JSLockHolder lock(toJS(m_context));
 
-    ProtectMap::AddResult result = m_protected.add(value, 1);
+    ProtectMap::AddResult result = m_protectCounts.add(value, 1);
     if (result.isNewEntry)
         JSValueProtect(m_context, value);
     else
@@ -219,12 +221,12 @@ JSGlobalContextRef contextInternalContext(JSContext* context)
 
 - (void)unprotect:(JSValueRef)value
 {
-    // Lock access to m_protected
+    // Lock access to m_protectCounts
     JSC::JSLockHolder lock(toJS(m_context));
 
-    ProtectMap::iterator iterator = m_protected.find(value);
+    ProtectMap::iterator iterator = m_protectCounts.find(value);
     if (iterator->value == 1) {
-        m_protected.remove(value);
+        m_protectCounts.remove(value);
         JSValueUnprotect(m_context, value);
     } else
         --iterator->value;
index d1b817d..080b12b 100644 (file)
@@ -60,30 +60,37 @@ NSString * const JSPropertyDescriptorSetKey = @"set";
 {
     return [JSValue valueWithValue:objectToValue(context, value) inContext:context];
 }
+
 + (JSValue *)valueWithBool:(BOOL)value inContext:(JSContext *)context
 {
     return [JSValue valueWithValue:JSValueMakeBoolean(contextInternalContext(context), value) inContext:context];
 }
+
 + (JSValue *)valueWithDouble:(double)value inContext:(JSContext *)context
 {
     return [JSValue valueWithValue:JSValueMakeNumber(contextInternalContext(context), value) inContext:context];
 }
+
 + (JSValue *)valueWithInt32:(int32_t)value inContext:(JSContext *)context
 {
     return [JSValue valueWithValue:JSValueMakeNumber(contextInternalContext(context), value) inContext:context];
 }
+
 + (JSValue *)valueWithUInt32:(uint32_t)value inContext:(JSContext *)context
 {
     return [JSValue valueWithValue:JSValueMakeNumber(contextInternalContext(context), value) inContext:context];
 }
+
 + (JSValue *)valueWithNewObjectInContext:(JSContext *)context
 {
     return [JSValue valueWithValue:JSObjectMake(contextInternalContext(context), 0, 0) inContext:context];
 }
+
 + (JSValue *)valueWithNewArrayInContext:(JSContext *)context
 {
     return [JSValue valueWithValue:JSObjectMakeArray(contextInternalContext(context), 0, NULL, 0) inContext:context];
 }
+
 + (JSValue *)valueWithNewRegularExpressionFromPattern:(NSString *)pattern flags:(NSString *)flags inContext:(JSContext *)context
 {
     JSStringRef patternString = JSStringCreateWithCFString((CFStringRef)pattern);
@@ -94,6 +101,7 @@ NSString * const JSPropertyDescriptorSetKey = @"set";
 
     return [JSValue valueWithValue:JSObjectMakeRegExp(contextInternalContext(context), 2, arguments, 0) inContext:context];
 }
+
 + (JSValue *)valueWithNewErrorFromMessage:(NSString *)message inContext:(JSContext *)context
 {
     JSStringRef string = JSStringCreateWithCFString((CFStringRef)message);
@@ -102,10 +110,12 @@ NSString * const JSPropertyDescriptorSetKey = @"set";
 
     return [JSValue valueWithValue:JSObjectMakeError(contextInternalContext(context), 1, &argument, 0) inContext:context];
 }
+
 + (JSValue *)valueWithNullInContext:(JSContext *)context
 {
     return [JSValue valueWithValue:JSValueMakeNull(contextInternalContext(context)) inContext:context];
 }
+
 + (JSValue *)valueWithUndefinedInContext:(JSContext *)context
 {
     return [JSValue valueWithValue:JSValueMakeUndefined(contextInternalContext(context)) inContext:context];
@@ -118,17 +128,19 @@ NSString * const JSPropertyDescriptorSetKey = @"set";
         return nil;
     return valueToObject(context, m_value);
 }
-- (id)toObjectOfClass:(Class)cls
+
+- (id)toObjectOfClass:(Class)expectedClass
 {
     id result = [self toObject];
-    return [result isKindOfClass:cls] ? result : nil;
+    return [result isKindOfClass:expectedClass] ? result : nil;
 }
 
 - (BOOL)toBool
 {
     JSContext *context = [self context];
-    return (context && JSValueToBoolean(contextInternalContext(context), m_value)) ? YES : NO;
+    return (context && JSValueToBoolean(contextInternalContext(context), m_value));
 }
+
 - (double)toDouble
 {
     JSContext *context = [self context];
@@ -144,14 +156,17 @@ NSString * const JSPropertyDescriptorSetKey = @"set";
 
     return result;
 }
+
 - (int32_t)toInt32
 {
     return JSC::toInt32([self toDouble]);
 }
+
 - (uint32_t)toUInt32
 {
     return JSC::toUInt32([self toDouble]);
 }
+
 - (NSNumber *)toNumber
 {
     JSContext *context = [self context];
@@ -164,6 +179,7 @@ NSString * const JSPropertyDescriptorSetKey = @"set";
         [context notifyException:exception];
     return result;
 }
+
 - (NSString *)toString
 {
     JSContext *context = [self context];
@@ -176,6 +192,7 @@ NSString * const JSPropertyDescriptorSetKey = @"set";
         [context notifyException:exception];
     return result;
 }
+
 - (NSDate *)toDate
 {
     JSContext *context = [self context];
@@ -188,6 +205,7 @@ NSString * const JSPropertyDescriptorSetKey = @"set";
         [context notifyException:exception];
     return result;
 }
+
 - (NSArray *)toArray
 {
     JSContext *context = [self context];
@@ -200,6 +218,7 @@ NSString * const JSPropertyDescriptorSetKey = @"set";
         [context notifyException:exception];
     return result;
 }
+
 - (NSDictionary *)toDictionary
 {
     JSContext *context = [self context];
@@ -232,6 +251,7 @@ NSString * const JSPropertyDescriptorSetKey = @"set";
 
     return [JSValue valueWithValue:result inContext:context];
 }
+
 - (void)setValue:(id)value forProperty:(NSString *)propertyName
 {
     JSContext *context = [self context];
@@ -253,6 +273,7 @@ NSString * const JSPropertyDescriptorSetKey = @"set";
         return;
     }
 }
+
 - (BOOL)deleteProperty:(NSString *)propertyName
 {
     JSContext *context = [self context];
@@ -265,13 +286,14 @@ NSString * const JSPropertyDescriptorSetKey = @"set";
         return [context boolFromNotifyException:exception];
 
     JSStringRef name = JSStringCreateWithCFString((CFStringRef)propertyName);
-    BOOL result = JSObjectDeleteProperty(contextInternalContext(context), object, name, &exception) ? YES : NO;
+    BOOL result = JSObjectDeleteProperty(contextInternalContext(context), object, name, &exception);
     JSStringRelease(name);
     if (exception)
         return [context boolFromNotifyException:exception];
 
     return result;
 }
+
 - (BOOL)hasProperty:(NSString *)propertyName
 {
     JSContext *context = [self context];
@@ -284,10 +306,11 @@ NSString * const JSPropertyDescriptorSetKey = @"set";
         return [context boolFromNotifyException:exception];
 
     JSStringRef name = JSStringCreateWithCFString((CFStringRef)propertyName);
-    BOOL result = JSObjectHasProperty(contextInternalContext(context), object, name) ? YES : NO;
+    BOOL result = JSObjectHasProperty(contextInternalContext(context), object, name);
     JSStringRelease(name);
     return result;
 }
+
 - (void)defineProperty:(NSString *)property descriptor:(id)descriptor
 {
     JSContext *context = [self context];
@@ -316,6 +339,7 @@ NSString * const JSPropertyDescriptorSetKey = @"set";
 
     return [JSValue valueWithValue:result inContext:context];
 }
+
 - (void)setValue:(id)value atIndex:(NSUInteger)index
 {
     JSContext *context = [self context];
@@ -342,32 +366,37 @@ NSString * const JSPropertyDescriptorSetKey = @"set";
 - (BOOL)isUndefined
 {
     JSContext *context = [self context];
-    return (context && JSValueIsUndefined(contextInternalContext(context), m_value)) ? YES : NO;
+    return (context && JSValueIsUndefined(contextInternalContext(context), m_value));
 }
+
 - (BOOL)isNull
 {
     JSContext *context = [self context];
-    return (context && JSValueIsNull(contextInternalContext(context), m_value)) ? YES : NO;
+    return (context && JSValueIsNull(contextInternalContext(context), m_value));
 }
+
 - (BOOL)isBoolean
 {
     JSContext *context = [self context];
-    return (context && JSValueIsBoolean(contextInternalContext(context), m_value)) ? YES : NO;
+    return (context && JSValueIsBoolean(contextInternalContext(context), m_value));
 }
+
 - (BOOL)isNumber
 {
     JSContext *context = [self context];
-    return (context && JSValueIsNumber(contextInternalContext(context), m_value)) ? YES : NO;
+    return (context && JSValueIsNumber(contextInternalContext(context), m_value));
 }
+
 - (BOOL)isString
 {
     JSContext *context = [self context];
-    return (context && JSValueIsString(contextInternalContext(context), m_value)) ? YES : NO;
+    return (context && JSValueIsString(contextInternalContext(context), m_value));
 }
+
 - (BOOL)isObject
 {
     JSContext *context = [self context];
-    return (context && JSValueIsObject(contextInternalContext(context), m_value)) ? YES : NO;
+    return (context && JSValueIsObject(contextInternalContext(context), m_value));
 }
 
 - (BOOL)isEqualToObject:(id)value
@@ -376,8 +405,9 @@ NSString * const JSPropertyDescriptorSetKey = @"set";
     if (!context)
         return NO;
 
-    return JSValueIsStrictEqual(contextInternalContext(context), m_value, objectToValue(context, value)) ? YES : NO;
+    return JSValueIsStrictEqual(contextInternalContext(context), m_value, objectToValue(context, value));
 }
+
 - (BOOL)isEqualWithTypeCoercionToObject:(id)value
 {
     JSContext *context = [self context];
@@ -385,12 +415,13 @@ NSString * const JSPropertyDescriptorSetKey = @"set";
         return NO;
 
     JSValueRef exception = 0;
-    BOOL result = JSValueIsEqual(contextInternalContext(context), m_value, objectToValue(context, value), &exception) ? YES : NO;
+    BOOL result = JSValueIsEqual(contextInternalContext(context), m_value, objectToValue(context, value), &exception);
     if (exception)
         return [context boolFromNotifyException:exception];
 
     return result;
 }
+
 - (BOOL)isInstanceOf:(id)value
 {
     JSContext *context = [self context];
@@ -402,23 +433,23 @@ NSString * const JSPropertyDescriptorSetKey = @"set";
     if (exception)
         return [context boolFromNotifyException:exception];
 
-    BOOL result = JSValueIsInstanceOfConstructor(contextInternalContext(context), m_value, constructor, &exception) ? YES : NO;
+    BOOL result = JSValueIsInstanceOfConstructor(contextInternalContext(context), m_value, constructor, &exception);
     if (exception)
         return [context boolFromNotifyException:exception];
 
     return result;
 }
 
-- (JSValue *)callWithArguments:(NSArray *)args
+- (JSValue *)callWithArguments:(NSArray *)argumentArray
 {
     JSContext *context = [self context];
     if (!context)
         return nil;
 
-    NSUInteger argumentCount = [args count];
+    NSUInteger argumentCount = [argumentArray count];
     JSValueRef arguments[argumentCount];
     for (unsigned i = 0; i < argumentCount; ++i)
-        arguments[i] = objectToValue(context, [args objectAtIndex:i]);
+        arguments[i] = objectToValue(context, [argumentArray objectAtIndex:i]);
 
     JSValueRef exception = 0;
     JSObjectRef object = JSValueToObject(contextInternalContext(context), m_value, &exception);
@@ -431,16 +462,17 @@ NSString * const JSPropertyDescriptorSetKey = @"set";
 
     return [JSValue valueWithValue:result inContext:context];
 }
-- (JSValue *)constructWithArguments:(NSArray *)args
+
+- (JSValue *)constructWithArguments:(NSArray *)argumentArray
 {
     JSContext *context = [self context];
     if (!context)
         return nil;
 
-    NSUInteger argumentCount = [args count];
+    NSUInteger argumentCount = [argumentArray count];
     JSValueRef arguments[argumentCount];
     for (unsigned i = 0; i < argumentCount; ++i)
-        arguments[i] = objectToValue(context, [args objectAtIndex:i]);
+        arguments[i] = objectToValue(context, [argumentArray objectAtIndex:i]);
 
     JSValueRef exception = 0;
     JSObjectRef object = JSValueToObject(contextInternalContext(context), m_value, &exception);
@@ -453,6 +485,7 @@ NSString * const JSPropertyDescriptorSetKey = @"set";
 
     return [JSValue valueWithValue:result inContext:context];
 }
+
 - (JSValue *)invokeMethod:(NSString *)method withArguments:(NSArray *)arguments
 {
     JSContext *context = [self context];
@@ -460,9 +493,9 @@ NSString * const JSPropertyDescriptorSetKey = @"set";
         return nil;
 
     NSUInteger argumentCount = [arguments count];
-    JSValueRef args[argumentCount];
+    JSValueRef argumentArray[argumentCount];
     for (unsigned i = 0; i < argumentCount; ++i)
-        args[i] = objectToValue(context, [arguments objectAtIndex:i]);
+        argumentArray[i] = objectToValue(context, [arguments objectAtIndex:i]);
 
     JSValueRef exception = 0;
     JSObjectRef thisObject = JSValueToObject(contextInternalContext(context), m_value, &exception);
@@ -470,16 +503,16 @@ NSString * const JSPropertyDescriptorSetKey = @"set";
         return [context valueFromNotifyException:exception];
 
     JSStringRef name = JSStringCreateWithCFString((CFStringRef)method);
-    JSValueRef func = JSObjectGetProperty(contextInternalContext(context), thisObject, name, &exception);
+    JSValueRef function = JSObjectGetProperty(contextInternalContext(context), thisObject, name, &exception);
     JSStringRelease(name);
     if (exception)
         return [context valueFromNotifyException:exception];
 
-    JSObjectRef object = JSValueToObject(contextInternalContext(context), func, &exception);
+    JSObjectRef object = JSValueToObject(contextInternalContext(context), function, &exception);
     if (exception)
         return [context valueFromNotifyException:exception];
 
-    JSValueRef result = JSObjectCallAsFunction(contextInternalContext(context), object, thisObject, argumentCount, args, &exception);
+    JSValueRef result = JSObjectCallAsFunction(contextInternalContext(context), object, thisObject, argumentCount, argumentArray, &exception);
     if (exception)
         return [context valueFromNotifyException:exception];
 
@@ -506,8 +539,8 @@ NSString * const JSPropertyDescriptorSetKey = @"set";
 - (NSRange)toRange
 {
     return (NSRange){
-        (NSUInteger)[self[@"location"] toDouble],
-        (NSUInteger)[self[@"length"] toDouble]
+        [[self[@"location"] toNumber] unsignedIntegerValue],
+        [[self[@"length"] toNumber] unsignedIntegerValue]
     };
 }
 
@@ -530,34 +563,34 @@ NSString * const JSPropertyDescriptorSetKey = @"set";
 + (JSValue *)valueWithPoint:(CGPoint)point inContext:(JSContext *)context
 {
     return [JSValue valueWithObject:@{
-        @"x":[NSNumber numberWithFloat:point.x],
-        @"y":[NSNumber numberWithFloat:point.y]
+        @"x":@(point.x),
+        @"y":@(point.y)
     } inContext:context];
 }
 
 + (JSValue *)valueWithRange:(NSRange)range inContext:(JSContext *)context
 {
     return [JSValue valueWithObject:@{
-        @"location":[NSNumber numberWithFloat:range.location],
-        @"length":[NSNumber numberWithFloat:range.length]
+        @"location":@(range.location),
+        @"length":@(range.length)
     } inContext:context];
 }
 
 + (JSValue *)valueWithRect:(CGRect)rect inContext:(JSContext *)context
 {
     return [JSValue valueWithObject:@{
-        @"x":[NSNumber numberWithFloat:rect.origin.x],
-        @"y":[NSNumber numberWithFloat:rect.origin.y],
-        @"width":[NSNumber numberWithFloat:rect.size.width],
-        @"height":[NSNumber numberWithFloat:rect.size.height]
+        @"x":@(rect.origin.x),
+        @"y":@(rect.origin.y),
+        @"width":@(rect.size.width),
+        @"height":@(rect.size.height)
     } inContext:context];
 }
 
 + (JSValue *)valueWithSize:(CGSize)size inContext:(JSContext *)context
 {
     return [JSValue valueWithObject:@{
-        @"width":[NSNumber numberWithFloat:size.width],
-        @"height":[NSNumber numberWithFloat:size.height]
+        @"width":@(size.width),
+        @"height":@(size.height)
     } inContext:context];
 }
 
@@ -571,7 +604,7 @@ NSString * const JSPropertyDescriptorSetKey = @"set";
     if (!context)
         return nil;
 
-    if (![(NSObject*)key isKindOfClass:[NSString class]]) {
+    if (![key isKindOfClass:[NSString class]]) {
         key = [[JSValue valueWithObject:key inContext:context] toString];
         if (!key)
             return [JSValue valueWithUndefinedInContext:context];
@@ -585,13 +618,13 @@ NSString * const JSPropertyDescriptorSetKey = @"set";
     return [self valueAtIndex:index];
 }
 
-- (void)setObject:(id)object forKeyedSubscript:(id <NSCopying>)key
+- (void)setObject:(id)object forKeyedSubscript:(NSObject <NSCopying> *)key
 {
     JSContext *context = [self context];
     if (!context)
         return;
 
-    if (![(NSObject*)key isKindOfClass:[NSString class]]) {
+    if (![key isKindOfClass:[NSString class]]) {
         key = [[JSValue valueWithObject:key inContext:context] toString];
         if (!key)
             return;
@@ -641,19 +674,19 @@ public:
     }
 
     id convert(JSValueRef property);
-    void add(Task task);
+    void add(Task);
     Task take();
-    bool isWorkListEmpty() { return !m_worklist.size(); }
+    bool isWorkListEmpty() const { return !m_worklist.size(); }
 
 private:
     JSGlobalContextRef m_context;
-    WTF::HashMap<JSValueRef, id> m_objectMap;
-    WTF::Vector<Task> m_worklist;
+    HashMap<JSValueRef, id> m_objectMap;
+    Vector<Task> m_worklist;
 };
 
 inline id JSContainerConvertor::convert(JSValueRef value)
 {
-    WTF::HashMap<JSValueRef, id>::iterator iter = m_objectMap.find(value);
+    HashMap<JSValueRef, id>::iterator iter = m_objectMap.find(value);
     if (iter != m_objectMap.end())
         return iter->value;
 
@@ -785,6 +818,7 @@ id valueToNumber(JSGlobalContextRef context, JSValueRef value, JSValueRef* excep
     double result = JSValueToNumber(context, value, exception);
     return [NSNumber numberWithDouble:*exception ? std::numeric_limits<double>::quiet_NaN() : result];
 }
+
 id valueToString(JSGlobalContextRef context, JSValueRef value, JSValueRef* exception)
 {
     ASSERT(!*exception);
@@ -803,6 +837,7 @@ id valueToString(JSGlobalContextRef context, JSValueRef value, JSValueRef* excep
     JSStringRelease(jsstring);
     return stringNS;
 }
+
 id valueToDate(JSGlobalContextRef context, JSValueRef value, JSValueRef* exception)
 {
     ASSERT(!*exception);
@@ -814,6 +849,7 @@ id valueToDate(JSGlobalContextRef context, JSValueRef value, JSValueRef* excepti
     double result = JSValueToNumber(context, value, exception);
     return *exception ? nil : [NSDate dateWithTimeIntervalSince1970:result];
 }
+
 id valueToArray(JSGlobalContextRef context, JSValueRef value, JSValueRef* exception)
 {
     ASSERT(!*exception);
@@ -829,6 +865,7 @@ id valueToArray(JSGlobalContextRef context, JSValueRef value, JSValueRef* except
         *exception = toRef(JSC::createTypeError(toJS(context), "Cannot convert primitive to NSArray"));
     return nil;
 }
+
 id valueToDictionary(JSGlobalContextRef context, JSValueRef value, JSValueRef* exception)
 {
     ASSERT(!*exception);
@@ -859,14 +896,14 @@ public:
     }
 
     JSValueRef convert(id object);
-    void add(Task task);
+    void add(Task);
     Task take();
-    bool isWorkListEmpty() { return !m_worklist.size(); }
+    bool isWorkListEmpty() const { return !m_worklist.size(); }
 
 private:
     JSContext *m_context;
-    WTF::HashMap<id, JSValueRef> m_objectMap;
-    WTF::Vector<Task> m_worklist;
+    HashMap<id, JSValueRef> m_objectMap;
+    Vector<Task> m_worklist;
 };
 
 JSValueRef ObjcContainerConvertor::convert(id object)
@@ -965,7 +1002,7 @@ JSValueRef objectToValue(JSContext *context, id object)
 
         if (current.type == ContainerArray) {
             ASSERT([current.objc isKindOfClass:[NSArray class]]);
-            NSArray * array = (NSArray *)current.objc;
+            NSArray *array = (NSArray *)current.objc;
             NSUInteger count = [array count];
             for (NSUInteger index = 0; index < count; ++index)
                 JSObjectSetPropertyAtIndex(contextInternalContext(context), js, index, convertor.convert([array objectAtIndex:index]), 0);
@@ -973,8 +1010,7 @@ JSValueRef objectToValue(JSContext *context, id object)
             ASSERT(current.type == ContainerDictionary);
             ASSERT([current.objc isKindOfClass:[NSDictionary class]]);
             NSDictionary* dictionary = (NSDictionary*)current.objc;
-            NSEnumerator* enumerator = [dictionary keyEnumerator];
-            while (id key = [enumerator nextObject]) {
+            for (id key in [dictionary keyEnumerator]) {
                 if ([key isKindOfClass:[NSString class]]) {
                     JSStringRef propertyName = JSStringCreateWithCFString((CFStringRef)key);
                     JSObjectSetProperty(contextInternalContext(context), js, propertyName, convertor.convert([dictionary objectForKey:key]), 0, 0);
@@ -1000,11 +1036,12 @@ JSValueRef valueInternalValue(JSValue * value)
 
 - (JSValue *)initWithValue:(JSValueRef)value inContext:(JSContext*)context
 {
-    ASSERT(value);
+    self = [super init];
+    if (!self)
+        return nil;
 
+    ASSERT(value);
     objc_initWeak(&m_weakContext, context);
-
-    [super init];
     [context protect:value];
     m_value = value;
     return self;
@@ -1020,20 +1057,20 @@ static StructTagHandler* getStructTagHandler(const char* encodedType)
     static SpinLock getStructTagHandlerLock = SPINLOCK_INITIALIZER;
     SpinLockHolder lockHolder(&getStructTagHandlerLock);
 
-    typedef WTF::HashMap<RefPtr<StringImpl>, StructTagHandler> StructHandlers;
-    static StructHandlers *m_structHandlers = 0;
+    typedef HashMap<RefPtr<StringImpl>, StructTagHandler> StructHandlers;
+    static StructHandlersstructHandlers = 0;
 
-    if (!m_structHandlers) {
-        m_structHandlers = new StructHandlers();
+    if (!structHandlers) {
+        structHandlers = new StructHandlers();
 
         // Step 1: find all valueWith<Foo>:inContext: class methods in JSValue.
-        size_t valueWithMinLen = strlen("valueWithX:inContext:");
+        size_t valueWithMinLength = strlen("valueWithX:inContext:");
         forEachMethodInClass(object_getClass([JSValue class]), ^(Method method){
-            SEL sel = method_getName(method);
-            const char* name = sel_getName(sel);
-            size_t len = strlen(name);
+            SEL selector = method_getName(method);
+            const char* name = sel_getName(selector);
+            size_t nameLength = strlen(name);
             // Check for valueWith<Foo>:context:
-            if (len < valueWithMinLen || strncmp(name, "valueWith", 9) || strncmp(name + len - 11, ":inContext:", 11))
+            if (nameLength < valueWithMinLength || strncmp(name, "valueWith", 9) || strncmp(name + nameLength - 11, ":inContext:", 11))
                 return;
             // Check for [ id, SEL, <type>, <contextType> ]
             if (method_getNumberOfArguments(method) != 4)
@@ -1051,18 +1088,18 @@ static StructTagHandler* getStructTagHandler(const char* encodedType)
             if (strcmp(idType, "@"))
                 return;
             char* type = method_copyArgumentType(method, 2);
-            m_structHandlers->add(WTF::String(type).impl(), (StructTagHandler){ sel, 0 });
+            structHandlers->add(String(type).impl(), (StructTagHandler){ selector, 0 });
             free(type);
         });
 
         // Step 2: find all to<Foo> instance methods in JSValue.
         size_t minLenValue = strlen("toX");
         forEachMethodInClass([JSValue class], ^(Method method){
-            SEL sel = method_getName(method);
-            const char* name = sel_getName(sel);
-            size_t len = strlen(name);
+            SEL selector = method_getName(method);
+            const char* name = sel_getName(selector);
+            size_t nameLength = strlen(name);
             // Check for to<Foo>
-            if (len < minLenValue || strncmp(name, "to", 2))
+            if (nameLength < minLenValue || strncmp(name, "to", 2))
                 return;
             // Check for [ id, SEL ]
             if (method_getNumberOfArguments(method) != 2)
@@ -1070,38 +1107,38 @@ static StructTagHandler* getStructTagHandler(const char* encodedType)
             // Try to find a matching valueWith<Foo>:context: method.
             char* type = method_copyReturnType(method);
 
-            StructHandlers::iterator iter = m_structHandlers->find(WTF::String(type).impl());
+            StructHandlers::iterator iter = structHandlers->find(String(type).impl());
             free(type);
-            if (iter == m_structHandlers->end())
+            if (iter == structHandlers->end())
                 return;
             StructTagHandler& handler = iter->value;
 
             // check that strlen(<foo>) == strlen(<Foo>)
             const char* valueWithName = sel_getName(handler.typeToValueSEL);
             size_t valueWithLen = strlen(valueWithName);
-            if (valueWithLen - valueWithMinLen != len - minLenValue)
+            if (valueWithLen - valueWithMinLength != nameLength - minLenValue)
                 return;
             // Check that <Foo> == <Foo>
-            if (strncmp(valueWithName + 9, name + 2, len - minLenValue - 1))
+            if (strncmp(valueWithName + 9, name + 2, nameLength - minLenValue - 1))
                 return;
-            handler.valueToTypeSEL = sel;
+            handler.valueToTypeSEL = selector;
         });
 
         // Step 3: clean up - remove entries where we found prospective valueWith<Foo>:inContext: conversions, but no matching to<Foo> methods.
-        typedef WTF::HashSet<RefPtr<WTF::StringImpl> > RemoveSet;
+        typedef HashSet<RefPtr<StringImpl> > RemoveSet;
         RemoveSet removeSet;
-        for (StructHandlers::iterator iter = m_structHandlers->begin(); iter != m_structHandlers->end(); ++iter) {
+        for (StructHandlers::iterator iter = structHandlers->begin(); iter != structHandlers->end(); ++iter) {
             StructTagHandler& handler = iter->value;
             if (!handler.valueToTypeSEL)
                 removeSet.add(iter->key);
         }
 
         for (RemoveSet::iterator iter = removeSet.begin(); iter != removeSet.end(); ++iter)
-            m_structHandlers->remove(*iter);
+            structHandlers->remove(*iter);
     }
 
-    StructHandlers::iterator iter = m_structHandlers->find(WTF::String(encodedType).impl());
-    if (iter == m_structHandlers->end())
+    StructHandlers::iterator iter = structHandlers->find(String(encodedType).impl());
+    if (iter == structHandlers->end())
         return 0;
     return &iter->value;
 }
index 7656cf6..443c374 100644 (file)
@@ -31,6 +31,7 @@
 // or set of execution resources. Thread safety is supported by locking the
 // virtual machine, with concurrent JavaScript execution supported by allocating
 // separate instances of JSVirtualMachine.
+
 NS_CLASS_AVAILABLE(10_9, NA)
 @interface JSVirtualMachine : NSObject
 
index ff53449..1e52819 100644 (file)
 
 - (id)init
 {
-    [super init];
+    self = [super init];
+    if (!self)
+        return nil;
+
     m_group = JSContextGroupCreate();
     toJS(m_group)->m_apiData = self;
     return self;
index ce3ec7e..5f98868 100644 (file)
@@ -72,7 +72,7 @@ static NSString* selectorToPropertyName(const char* start)
     size_t header = firstColon - start;
     // The new string needs to be long enough to hold 'header', plus the remainder of the string, excluding
     // at least one ':', but including a '\0'. (This is conservative if there are more than one ':').
-    char* buffer = (char*)malloc(header + strlen(firstColon + 1) + 1);
+    char* buffer = static_cast<char*>(malloc(header + strlen(firstColon + 1) + 1));
     // Copy 'header' characters, set output to point to the end of this & input to point past the first ':'.
     memcpy(buffer, start, header);
     char* output = buffer + header;
@@ -228,7 +228,7 @@ static void copyPrototypeProperties(JSContext* context, Class objcClass, Protoco
         char* getterName;
         char* setterName;
     };
-    __block WTF::Vector<Property> propertyList;
+    __block Vector<Property> propertyList;
 
     // Map recording the methods used as getters/setters.
     NSMutableDictionary *accessorMethods = [NSMutableDictionary dictionary];
@@ -302,7 +302,9 @@ static void copyPrototypeProperties(JSContext* context, Class objcClass, Protoco
 
 - (id)initWithContext:(JSContext*)context forClass:(Class)cls superClassInfo:(JSObjCClassInfo*)superClassInfo
 {
-    [super init];
+    self = [super init];
+    if (!self)
+        return nil;
 
     const char* className = class_getName(cls);
     m_context = context;
@@ -378,7 +380,10 @@ static void copyPrototypeProperties(JSContext* context, Class objcClass, Protoco
 
 - (id)initWithContext:(JSContext*)context
 {
-    [super init];
+    self = [super init];
+    if (!self)
+        return nil;
+
     m_context = context;
     m_classMap = [[NSMutableDictionary alloc] init];
     return self;
@@ -421,7 +426,7 @@ static void copyPrototypeProperties(JSContext* context, Class objcClass, Protoco
 
     // FIXME: https://bugs.webkit.org/show_bug.cgi?id=105891
     // This general approach to wrapper caching is pretty effective, but there are a couple of problems:
-    // (1) For immortal objects JSValues will effectively leaj and this results in error output being logged - we should avoid adding associated objects to immortal objects.
+    // (1) For immortal objects JSValues will effectively leak and this results in error output being logged - we should avoid adding associated objects to immortal objects.
     // (2) A long lived object may rack up many JSValues. When the contexts are released these will unproctect the associated JavaScript objects,
     //     but still, would probably nicer if we made it so that only one associated object was required, broadcasting object dealloc.
     objc_setAssociatedObject(object, m_context, wrapper, OBJC_ASSOCIATION_RETAIN);
@@ -436,7 +441,7 @@ id tryUnwrapObjcObject(JSGlobalContextRef context, JSValueRef value)
         return nil;
     JSValueRef exception = 0;
     JSObjectRef object = JSValueToObject(context, value, &exception);
-    //ASSERT(!exception);
+    ASSERT(!exception);
     if (JSValueIsObjectOfClass(context, object, wrapperClass()))
         return (id)JSObjectGetPrivate(object);
     if (id target = tryUnwrapBlock(context, object))
@@ -446,17 +451,13 @@ id tryUnwrapObjcObject(JSGlobalContextRef context, JSValueRef value)
 
 Protocol* getJSExportProtocol()
 {
-    static Protocol* protocol = 0;
-    if (!protocol)
-        protocol = objc_getProtocol("JSExport");
+    static Protocol* protocol = objc_getProtocol("JSExport");
     return protocol;
 }
 
 Class getNSBlockClass()
 {
-    static Class cls = 0;
-    if (!cls)
-        cls = objc_getClass("NSBlock");
+    static Class cls = objc_getClass("NSBlock");
     return cls;
 }
 
index 4ce8bd3..350b61e 100644 (file)
@@ -29,7 +29,7 @@
 #include <JavaScriptCore/JavaScript.h>
 #include <JavaScriptCore/JSStringRefCF.h>
 
-#if JS_OBJC_API_ENABLED
+#if defined(__OBJC__) && JS_OBJC_API_ENABLED
 
 #import "JSContext.h"
 #import "APIJSValue.h"
index f3c9520..b211743 100644 (file)
@@ -37,8 +37,8 @@
 #import "JSValueInternal.h"
 #import "ObjCCallbackFunction.h"
 #import "ObjcRuntimeExtras.h"
-#import "objc/runtime.h"
-#import "wtf/RetainPtr.h"
+#import <objc/runtime.h>
+#import <wtf/RetainPtr.h>
 
 class CallbackArgument {
 public:
@@ -53,8 +53,7 @@ CallbackArgument::~CallbackArgument()
 }
 
 class CallbackArgumentBoolean : public CallbackArgument {
-public:
-    void set(NSInvocation* invocation, NSInteger argumentNumber, JSContext* context, JSValueRef argument, JSValueRef*)
+    virtual void set(NSInvocation* invocation, NSInteger argumentNumber, JSContext* context, JSValueRef argument, JSValueRef*) override
     {
         bool value = JSValueToBoolean(contextInternalContext(context), argument);
         [invocation setArgument:&value atIndex:argumentNumber];
@@ -63,8 +62,7 @@ public:
 
 template<typename T>
 class CallbackArgumentInteger : public CallbackArgument {
-public:
-    void set(NSInvocation* invocation, NSInteger argumentNumber, JSContext* context, JSValueRef argument, JSValueRef* exception)
+    virtual void set(NSInvocation* invocation, NSInteger argumentNumber, JSContext* context, JSValueRef argument, JSValueRef* exception) override
     {
         T value = (T)JSC::toInt32(JSValueToNumber(contextInternalContext(context), argument, exception));
         [invocation setArgument:&value atIndex:argumentNumber];
@@ -73,8 +71,7 @@ public:
 
 template<typename T>
 class CallbackArgumentDouble : public CallbackArgument {
-public:
-    void set(NSInvocation* invocation, NSInteger argumentNumber, JSContext* context, JSValueRef argument, JSValueRef* exception)
+    virtual void set(NSInvocation* invocation, NSInteger argumentNumber, JSContext* context, JSValueRef argument, JSValueRef* exception) override
     {
         T value = (T)JSValueToNumber(contextInternalContext(context), argument, exception);
         [invocation setArgument:&value atIndex:argumentNumber];
@@ -82,8 +79,7 @@ public:
 };
 
 class CallbackArgumentJSValue : public CallbackArgument {
-public:
-    void set(NSInvocation* invocation, NSInteger argumentNumber, JSContext* context, JSValueRef argument, JSValueRef*)
+    virtual void set(NSInvocation* invocation, NSInteger argumentNumber, JSContext* context, JSValueRef argument, JSValueRef*) override
     {
         JSValue* value = [JSValue valueWithValue:argument inContext:context];
         [invocation setArgument:&value atIndex:argumentNumber];
@@ -91,8 +87,7 @@ public:
 };
 
 class CallbackArgumentId : public CallbackArgument {
-public:
-    void set(NSInvocation* invocation, NSInteger argumentNumber, JSContext* context, JSValueRef argument, JSValueRef*)
+    virtual void set(NSInvocation* invocation, NSInteger argumentNumber, JSContext* context, JSValueRef argument, JSValueRef*) override
     {
         id value = valueToObject(context, argument);
         [invocation setArgument:&value atIndex:argumentNumber];
@@ -108,37 +103,36 @@ public:
         [m_class retain];
     }
 
-    ~CallbackArgumentOfClass()
+private:
+    virtual ~CallbackArgumentOfClass()
     {
         [m_class release];
     }
 
-    void set(NSInvocation* invocation, NSInteger argumentNumber, JSContext* context, JSValueRef argument, JSValueRef* exception)
+    virtual void set(NSInvocation* invocation, NSInteger argumentNumber, JSContext* context, JSValueRef argument, JSValueRef* exception) override
     {
-        JSGlobalContextRef ctx = contextInternalContext(context);
+        JSGlobalContextRef contextRef = contextInternalContext(context);
 
-        id object = tryUnwrapObjcObject(ctx, argument);
+        id object = tryUnwrapObjcObject(contextRef, argument);
         if (object && [object isKindOfClass:m_class]) {
             [invocation setArgument:&object atIndex:argumentNumber];
             return;
         }
 
-        if (JSValueIsNull(ctx, argument) || JSValueIsUndefined(ctx, argument)) {
+        if (JSValueIsNull(contextRef, argument) || JSValueIsUndefined(contextRef, argument)) {
             object = nil;
             [invocation setArgument:&object atIndex:argumentNumber];
             return;
         }
 
-        *exception = toRef(JSC::createTypeError(toJS(ctx), "Argument does not match Objective-C Class"));
+        *exception = toRef(JSC::createTypeError(toJS(contextRef), "Argument does not match Objective-C Class"));
     }
 
-private:
     Class m_class;
 };
 
 class CallbackArgumentNSNumber : public CallbackArgument {
-public:
-    void set(NSInvocation* invocation, NSInteger argumentNumber, JSContext* context, JSValueRef argument, JSValueRef* exception)
+    virtual void set(NSInvocation* invocation, NSInteger argumentNumber, JSContext* context, JSValueRef argument, JSValueRef* exception) override
     {
         id value = valueToNumber(contextInternalContext(context), argument, exception);
         [invocation setArgument:&value atIndex:argumentNumber];
@@ -146,8 +140,7 @@ public:
 };
 
 class CallbackArgumentNSString : public CallbackArgument {
-public:
-    void set(NSInvocation* invocation, NSInteger argumentNumber, JSContext* context, JSValueRef argument, JSValueRef* exception)
+    virtual void set(NSInvocation* invocation, NSInteger argumentNumber, JSContext* context, JSValueRef argument, JSValueRef* exception) override
     {
         id value = valueToString(contextInternalContext(context), argument, exception);
         [invocation setArgument:&value atIndex:argumentNumber];
@@ -155,8 +148,7 @@ public:
 };
 
 class CallbackArgumentNSDate : public CallbackArgument {
-public:
-    void set(NSInvocation* invocation, NSInteger argumentNumber, JSContext* context, JSValueRef argument, JSValueRef* exception)
+    virtual void set(NSInvocation* invocation, NSInteger argumentNumber, JSContext* context, JSValueRef argument, JSValueRef* exception) override
     {
         id value = valueToDate(contextInternalContext(context), argument, exception);
         [invocation setArgument:&value atIndex:argumentNumber];
@@ -164,8 +156,7 @@ public:
 };
 
 class CallbackArgumentNSArray : public CallbackArgument {
-public:
-    void set(NSInvocation* invocation, NSInteger argumentNumber, JSContext* context, JSValueRef argument, JSValueRef* exception)
+    virtual void set(NSInvocation* invocation, NSInteger argumentNumber, JSContext* context, JSValueRef argument, JSValueRef* exception) override
     {
         id value = valueToArray(contextInternalContext(context), argument, exception);
         [invocation setArgument:&value atIndex:argumentNumber];
@@ -173,8 +164,7 @@ public:
 };
 
 class CallbackArgumentNSDictionary : public CallbackArgument {
-public:
-    void set(NSInvocation* invocation, NSInteger argumentNumber, JSContext* context, JSValueRef argument, JSValueRef* exception)
+    virtual void set(NSInvocation* invocation, NSInteger argumentNumber, JSContext* context, JSValueRef argument, JSValueRef* exception) override
     {
         id value = valueToDictionary(contextInternalContext(context), argument, exception);
         [invocation setArgument:&value atIndex:argumentNumber];
@@ -185,22 +175,12 @@ class CallbackArgumentStruct : public CallbackArgument {
 public:
     CallbackArgumentStruct(NSInvocation* conversionInvocation, const char* encodedType)
         : m_conversionInvocation(conversionInvocation)
+        , m_buffer(encodedType)
     {
-        [m_conversionInvocation retain];
-        NSUInteger size, alignment;
-        NSGetSizeAndAlignment(encodedType, &size, &alignment);
-        --alignment;
-        m_allocation = (char*)malloc(size + alignment);
-        m_buffer = reinterpret_cast<char*>((reinterpret_cast<intptr_t>(m_allocation) + alignment) & ~alignment);
     }
     
-    virtual ~CallbackArgumentStruct()
-    {
-        [m_conversionInvocation release];
-        free(m_allocation);
-    }
-    
-    void set(NSInvocation* invocation, NSInteger argumentNumber, JSContext* context, JSValueRef argument, JSValueRef*)
+private:
+    virtual void set(NSInvocation* invocation, NSInteger argumentNumber, JSContext* context, JSValueRef argument, JSValueRef*) override
     {
         JSValue* value = [JSValue valueWithValue:argument inContext:context];
         [m_conversionInvocation invokeWithTarget:value];
@@ -208,10 +188,8 @@ public:
         [invocation setArgument:m_buffer atIndex:argumentNumber];
     }
 
-private:
-    NSInvocation* m_conversionInvocation;
-    char* m_buffer;
-    char* m_allocation;
+    RetainPtr<NSInvocation> m_conversionInvocation;
+    StructBuffer m_buffer;
 };
 
 class CallbackArgumentBlockCallback : public CallbackArgument {
@@ -221,18 +199,18 @@ public:
     {
     }
     
+private:
     virtual ~CallbackArgumentBlockCallback()
     {
         [m_adaptor release];
     }
     
-    void set(NSInvocation* invocation, NSInteger argumentNumber, JSContext* context, JSValueRef argument, JSValueRef* exception)
+    virtual void set(NSInvocation* invocation, NSInteger argumentNumber, JSContext* context, JSValueRef argument, JSValueRef* exception) override
     {
         id block = [m_adaptor blockFromValue:argument inContext:context withException:exception];
         [invocation setArgument:&block atIndex:argumentNumber];
     }
 
-private:
     JSBlockAdaptor* m_adaptor;
 };
 
@@ -260,7 +238,7 @@ public:
     static ResultType typeVoid()
     {
         ASSERT_NOT_REACHED();
-        return nil;
+        return 0;
     }
 
     static ResultType typeId()
@@ -273,7 +251,7 @@ public:
         StringRange copy(begin, end);
         Class cls = objc_getClass(copy);
         if (!cls)
-            return nil;
+            return 0;
 
         if (cls == [JSValue class])
             return new CallbackArgumentJSValue;
@@ -302,7 +280,7 @@ public:
         StringRange copy(begin, end);
         if (NSInvocation* invocation = valueToTypeInvocationFor(copy))
             return new CallbackArgumentStruct(invocation, copy);
-        return nil;
+        return 0;
     }
 };
 
@@ -316,16 +294,14 @@ public:
 };
 
 class CallbackResultVoid : public CallbackResult {
-public:
-    virtual JSValueRef get(NSInvocation*, JSContext* context, JSValueRef*)
+    virtual JSValueRef get(NSInvocation*, JSContext* context, JSValueRef*) override
     {
         return JSValueMakeUndefined(contextInternalContext(context));
     }
 };
 
 class CallbackResultId : public CallbackResult {
-public:
-    virtual JSValueRef get(NSInvocation* invocation, JSContext* context, JSValueRef*)
+    virtual JSValueRef get(NSInvocation* invocation, JSContext* context, JSValueRef*) override
     {
         id value;
         [invocation getReturnValue:&value];
@@ -335,18 +311,16 @@ public:
 
 template<typename T>
 class CallbackResultNumeric : public CallbackResult {
-public:
-    virtual JSValueRef get(NSInvocation* invocation, JSContext* context, JSValueRef*)
+    virtual JSValueRef get(NSInvocation* invocation, JSContext* context, JSValueRef*) override
     {
         T value;
         [invocation getReturnValue:&value];
-        return JSValueMakeNumber(contextInternalContext(context), (double)value);
+        return JSValueMakeNumber(contextInternalContext(context), value);
     }
 };
 
 class CallbackResultBoolean : public CallbackResult {
-public:
-    virtual JSValueRef get(NSInvocation* invocation, JSContext* context, JSValueRef*)
+    virtual JSValueRef get(NSInvocation* invocation, JSContext* context, JSValueRef*) override
     {
         bool value;
         [invocation getReturnValue:&value];
@@ -358,26 +332,16 @@ class CallbackResultStruct : public CallbackResult {
 public:
     CallbackResultStruct(NSInvocation* conversionInvocation, const char* encodedType)
         : m_conversionInvocation(conversionInvocation)
+        , m_buffer(encodedType)
     {
-        [m_conversionInvocation retain];
-        NSUInteger size, alignment;
-        NSGetSizeAndAlignment(encodedType, &size, &alignment);
-        --alignment;
-        m_allocation = (char*)malloc(size + alignment);
-        m_buffer = reinterpret_cast<char*>((reinterpret_cast<intptr_t>(m_allocation) + alignment) & ~alignment);
     }
     
-    virtual ~CallbackResultStruct()
-    {
-        [m_conversionInvocation release];
-        free(m_allocation);
-    }
-    
-    virtual JSValueRef get(NSInvocation* invocation, JSContext* context, JSValueRef*)
+private:
+    virtual JSValueRef get(NSInvocation* invocation, JSContext* context, JSValueRef*) override
     {
-        [invocation getReturnValue:m_allocation];
+        [invocation getReturnValue:m_buffer];
 
-        [m_conversionInvocation setArgument:m_allocation atIndex:2];
+        [m_conversionInvocation setArgument:m_buffer atIndex:2];
         [m_conversionInvocation setArgument:&context atIndex:3];
         [m_conversionInvocation invokeWithTarget:[JSValue class]];
 
@@ -386,10 +350,8 @@ public:
         return valueInternalValue(value);
     }
 
-private:
-    NSInvocation* m_conversionInvocation;
-    char* m_buffer;
-    char* m_allocation;
+    RetainPtr<NSInvocation> m_conversionInvocation;
+    StructBuffer m_buffer;
 };
 
 class ResultTypeDelegate {
@@ -438,7 +400,7 @@ public:
         StringRange copy(begin, end);
         if (NSInvocation* invocation = typeToValueInvocationFor(copy))
             return new CallbackResultStruct(invocation, copy);
-        return nil;
+        return 0;
     }
 };
 
@@ -482,25 +444,25 @@ private:
     WeakContextRef m_context;
     CallbackType m_type;
     Class m_instanceClass;
-    WTF::RetainPtr<NSInvocation> m_invocation;
+    RetainPtr<NSInvocation> m_invocation;
     OwnPtr<CallbackArgument> m_arguments;
     OwnPtr<CallbackResult> m_result;
 };
 
 static void objCCallbackFunctionFinalize(JSObjectRef object)
 {
-    delete (ObjCCallbackFunction*)JSObjectGetPrivate(object);
+    delete static_cast<ObjCCallbackFunction*>(JSObjectGetPrivate(object));
 }
 
 static JSValueRef objCCallbackFunctionCallAsFunction(JSContextRef callerContext, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
 {
     // Retake the API lock - we need this for a few reasons:
-    // (1) We don't want to support the C-API's confusing drops-locks-once policy - should only drop locks if we can do so recursivey.
-    // (2) We're caling some JSC internals that require us to be on the 'inside' - e.g. createTypeError.
-    // (3) We need to be locked (per context would be fine) against conflicting usgae of the ObjCCallbackFunction's NSInvocation.
+    // (1) We don't want to support the C-API's confusing drops-locks-once policy - should only drop locks if we can do so recursively.
+    // (2) We're calling some JSC internals that require us to be on the 'inside' - e.g. createTypeError.
+    // (3) We need to be locked (per context would be fine) against conflicting usage of the ObjCCallbackFunction's NSInvocation.
     JSC::APIEntryShim entryShim(toJS(callerContext));
 
-    ObjCCallbackFunction* callback = (ObjCCallbackFunction*)JSObjectGetPrivate(function);
+    ObjCCallbackFunction* callback = static_cast<ObjCCallbackFunction*>(JSObjectGetPrivate(function));
     JSContext *context = callback->context();
     if (!context) {
         // FIXME: https://bugs.webkit.org/show_bug.cgi?id=105894
@@ -522,39 +484,40 @@ static JSValueRef objCCallbackFunctionCallAsFunction(JSContextRef callerContext,
     return result;
 }
 
+static JSClassRef createObjCCallbackFunctionClass()
+{
+    JSClassDefinition definition;
+    definition = kJSClassDefinitionEmpty;
+    definition.className = "Function";
+    definition.finalize = objCCallbackFunctionFinalize;
+    definition.callAsFunction = objCCallbackFunctionCallAsFunction;
+    return JSClassCreate(&definition);
+}
+
 static JSClassRef objCCallbackFunctionClass()
 {
     static SpinLock initLock = SPINLOCK_INITIALIZER;
     SpinLockHolder lockHolder(&initLock);
 
-    static JSClassRef classRef = 0;
-
-    if (!classRef) {
-        JSClassDefinition definition;
-        definition = kJSClassDefinitionEmpty;
-        definition.className = "Function";
-        definition.finalize = objCCallbackFunctionFinalize;
-        definition.callAsFunction = objCCallbackFunctionCallAsFunction;
-        classRef = JSClassCreate(&definition);
-    }
-
+    static JSClassRef classRef = createObjCCallbackFunctionClass();
     return classRef;
 }
 
 JSValueRef ObjCCallbackFunction::call(JSContext *context, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
 {
-    JSGlobalContextRef ctx = contextInternalContext(context);
+    JSGlobalContextRef contextRef = contextInternalContext(context);
 
     size_t firstArgument;
     switch (m_type) {
     case CallbackInstanceMethod: {
-        id target = tryUnwrapObjcObject(ctx, thisObject);
+        id target = tryUnwrapObjcObject(contextRef, thisObject);
         if (!target || ![target isKindOfClass:m_instanceClass]) {
-            *exception = toRef(JSC::createTypeError(toJS(ctx), "self type check failed for Objective-C instance method"));
-            return JSValueMakeUndefined(ctx);
+            *exception = toRef(JSC::createTypeError(toJS(contextRef), "self type check failed for Objective-C instance method"));
+            return JSValueMakeUndefined(contextRef);
         }
         [m_invocation setTarget:target];
     }
+    // fallthrough - firstArgument for CallbackInstanceMethod is also 2!
     case CallbackClassMethod:
         firstArgument = 2;
         break;
@@ -564,10 +527,10 @@ JSValueRef ObjCCallbackFunction::call(JSContext *context, JSObjectRef thisObject
 
     size_t argumentNumber = 0;
     for (CallbackArgument* argument = m_arguments.get(); argument; argument = argument->m_next.get()) {
-        JSValueRef value = argumentNumber < argumentCount ? arguments[argumentNumber] : JSValueMakeUndefined(ctx);
+        JSValueRef value = argumentNumber < argumentCount ? arguments[argumentNumber] : JSValueMakeUndefined(contextRef);
         argument->set(m_invocation.get(), argumentNumber + firstArgument, context, value, exception);
         if (*exception)
-            return JSValueMakeUndefined(ctx);
+            return JSValueMakeUndefined(contextRef);
         ++argumentNumber;
     }
 
@@ -578,24 +541,18 @@ JSValueRef ObjCCallbackFunction::call(JSContext *context, JSObjectRef thisObject
 
 static bool blockSignatureContainsClass()
 {
-    enum CheckResult {
-        CheckResultFalse,
-        CheckResultTrue,
-        CheckResultUnknown
-    };
-    static enum CheckResult check = CheckResultUnknown;
-    if (check == CheckResultUnknown) {
+    static bool containsClass = ^{
         id block = ^(NSString *string){ return string; };
-        check = _Block_has_signature(block) && strstr(_Block_signature(block), "NSString") ? CheckResultTrue : CheckResultFalse;
-    }
-    return (bool)check;
+        return _Block_has_signature(block) && strstr(_Block_signature(block), "NSString");
+    };
+    return containsClass;
 }
 
 inline bool skipNumber(const char*& position)
 {
-    if (!isdigit(*position))
+    if (!isASCIIDigit(*position))
         return false;
-    while(isdigit(*++position));
+    while (isASCIIDigit(*++position)) { }
     return true;
 }
 
@@ -610,11 +567,16 @@ static JSObjectRef objCCallbackFunctionForInvocation(JSContext* context, NSInvoc
     switch (type) {
     case CallbackInstanceMethod:
     case CallbackClassMethod:
-        if ('@' != *(position++) || !skipNumber(position) || ':' != *(position++) || !skipNumber(position))
+        // Methods are passed two implicit arguments - (id)self, and the selector.
+        if ('@' != *position++ || !skipNumber(position) || ':' != *position++ || !skipNumber(position))
             return nil;
         break;
     case CallbackBlock:
-        if (('@' != *(position++)) || ('?' != *(position++)) || !skipNumber(position) || (!blockSignatureContainsClass() && strchr(position, '@')))
+        // Blocks are passed one implicit argument - the block, of type "@?".
+        if (('@' != *position++) || ('?' != *position++) || !skipNumber(position))
+            return nil;
+        // Only allow arguments of type 'id' if the block signature contains the NS type information.
+        if ((!blockSignatureContainsClass() && strchr(position, '@')))
             return nil;
         break;
     }
@@ -671,7 +633,7 @@ id tryUnwrapBlock(JSGlobalContextRef context, JSObjectRef object)
 {
     if (!JSValueIsObjectOfClass(context, object, objCCallbackFunctionClass()))
         return nil;
-    return ((ObjCCallbackFunction*)JSObjectGetPrivate(object))->wrappedBlock();
+    return (static_cast<ObjCCallbackFunction*>(JSObjectGetPrivate(object)))->wrappedBlock();
 }
 
 #endif
index 80509b9..2561940 100644 (file)
@@ -46,16 +46,14 @@ inline void forEachProtocolImplementingProtocol(Class cls, Protocol* target, voi
     ASSERT(cls);
     ASSERT(target);
 
-    WTF::Vector<Protocol*> worklist;
-    WTF::HashSet<void*> visited;
+    Vector<Protocol*> worklist;
+    HashSet<void*> visited;
 
     // Initially fill the worklist with the Class's protocols.
     unsigned protocolsCount;
     Protocol** protocols = class_copyProtocolList(cls, &protocolsCount);
-    if (protocolsCount) {
-        worklist.append(protocols, protocolsCount);
-        free(protocols);
-    }
+    worklist.append(protocols, protocolsCount);
+    free(protocols);
 
     while (!worklist.isEmpty()) {
         Protocol* protocol = worklist.last();
@@ -71,52 +69,44 @@ inline void forEachProtocolImplementingProtocol(Class cls, Protocol* target, voi
 
         // Add incorporated protocols to the worklist.
         protocols = protocol_copyProtocolList(protocol, &protocolsCount);
-        if (protocolsCount) {
-            worklist.append(protocols, protocolsCount);
-            free(protocols);
-        }
+        worklist.append(protocols, protocolsCount);
+        free(protocols);
     }
 }
 
-inline void forEachMethodInClass(Class cls, void (^callback)(Method method))
+inline void forEachMethodInClass(Class cls, void (^callback)(Method))
 {
     unsigned count;
     Method* methods = class_copyMethodList(cls, &count);
-    if (count) {
-        for (unsigned i = 0; i < count; ++i)
-            callback(methods[i]);
-        free(methods);
-    }
+    for (unsigned i = 0; i < count; ++i)
+        callback(methods[i]);
+    free(methods);
 }
 
 inline void forEachMethodInProtocol(Protocol* protocol, BOOL isRequiredMethod, BOOL isInstanceMethod, void (^callback)(SEL, const char*))
 {
     unsigned count;
     struct objc_method_description* methods = protocol_copyMethodDescriptionList(protocol, isRequiredMethod, isInstanceMethod, &count);
-    if (count) {
-        for (unsigned i = 0; i < count; ++i)
-            callback(methods[i].name, methods[i].types);
-        free(methods);
-    }
+    for (unsigned i = 0; i < count; ++i)
+        callback(methods[i].name, methods[i].types);
+    free(methods);
 }
 
 inline void forEachPropertyInProtocol(Protocol* protocol, void (^callback)(objc_property_t))
 {
     unsigned count;
     objc_property_t* properties = protocol_copyPropertyList(protocol, &count);
-    if (count) {
-        for (unsigned i = 0; i < count; ++i)
-            callback(properties[i]);
-        free(properties);
-    }
+    for (unsigned i = 0; i < count; ++i)
+        callback(properties[i]);
+    free(properties);
 }
 
 template<char open, char close>
 void skipPair(const char*& position)
 {
-    NSUInteger count = 1;
+    size_t count = 1;
     do {
-        char c = *(position++);
+        char c = *position++;
         if (!c)
             @throw [NSException exceptionWithName:NSInternalInconsistencyException reason:@"Malformed type encoding" userInfo:nil];
         if (c == open)
@@ -127,22 +117,43 @@ void skipPair(const char*& position)
 }
 
 class StringRange {
+    WTF_MAKE_NONCOPYABLE(StringRange);
 public:
     StringRange(const char* begin, const char* end) : m_ptr(strndup(begin, end - begin)) { }
     ~StringRange() { free(m_ptr); }
-    operator const char*() { return m_ptr; }
-    const char* get() { return m_ptr; }
+    operator const char*() const { return m_ptr; }
+    const char* get() const { return m_ptr; }
 
 private:
     char* m_ptr;
 };
 
+class StructBuffer {
+    WTF_MAKE_NONCOPYABLE(StructBuffer);
+public:
+    StructBuffer(const char* encodedType)
+    {
+        NSUInteger size, alignment;
+        NSGetSizeAndAlignment(encodedType, &size, &alignment);
+        --alignment;
+        m_allocation = static_cast<char*>(malloc(size + alignment));
+        m_buffer = reinterpret_cast<char*>((reinterpret_cast<intptr_t>(m_allocation) + alignment) & ~alignment);
+    }
+
+    ~StructBuffer() { free(m_allocation); }
+    operator void*() const { return m_buffer; }
+
+private:
+    void* m_allocation;
+    void* m_buffer;
+};
+
 template<typename DelegateType>
 typename DelegateType::ResultType parseObjCType(const char*& position)
 {
     ASSERT(*position);
 
-    switch (*(position++)) {
+    switch (*position++) {
     case 'c':
         return DelegateType::template typeInteger<char>();
     case 'i':
index 82a16d1..07f61fb 100644 (file)
@@ -48,7 +48,7 @@ static double nan(const char*)
 
 #endif
 
-#if PLATFORM(MAC)
+#if JS_OBJC_API_ENABLED
 void testObjectiveCAPI(void);
 #endif
 
@@ -1044,7 +1044,7 @@ int main(int argc, char* argv[])
     ::SetErrorMode(0);
 #endif
 
-#if PLATFORM(MAC)
+#if JS_OBJC_API_ENABLED
     testObjectiveCAPI();
 #endif
 
index 63b4157..464b33e 100644 (file)
@@ -124,17 +124,11 @@ static void checkResult(NSString *description, bool passed)
 
 static bool blockSignatureContainsClass()
 {
-    enum CheckResult {
-        CheckResultFalse,
-        CheckResultTrue,
-        CheckResultUnknown
-    };
-    static enum CheckResult check = CheckResultUnknown;
-    if (check == CheckResultUnknown) {
+    static bool containsClass = (bool)^{
         id block = ^(NSString *string){ return string; };
-        check = _Block_has_signature(block) && strstr(_Block_signature(block), "NSString") ? CheckResultTrue : CheckResultFalse;
-    }
-    return (bool)check;
+        return _Block_has_signature(block) && strstr(_Block_signature(block), "NSString");
+    };
+    return containsClass;
 }
 
 void testObjectiveCAPI()
@@ -144,7 +138,7 @@ void testObjectiveCAPI()
     @autoreleasepool {
         JSContext *context = [[[JSContext alloc] init] autorelease];
         JSValue *result = [context evaluateScript:@"2 + 2"];
-        checkResult(@"2 + 2", [result toInt32] == 4);
+        checkResult(@"2 + 2", [result isNumber] && [result toInt32] == 4);
     }
 
     @autoreleasepool {
@@ -157,12 +151,13 @@ void testObjectiveCAPI()
         JSContext *context = [[[JSContext alloc] init] autorelease];
         context[@"message"] = @"Hello";
         JSValue *result = [context evaluateScript:@"message + ', World!'"];
-        checkResult(@"Hello, World!", [[result toString] isEqual:@"Hello, World!"]);
+        checkResult(@"Hello, World!", [result isString] && [result isEqualToObject:@"Hello, World!"]);
     }
 
     @autoreleasepool {
         JSContext *context = [[[JSContext alloc] init] autorelease];
         JSValue *result = [context evaluateScript:@"({ x:42 })"];
+        checkResult(@"({ x:42 })", [result isObject] && [result[@"x"] isEqualToObject:@42]);
         id obj = [result toObject];
         checkResult(@"Check dictionary literal", [obj isKindOfClass:[NSDictionary class]]);
         id num = (NSDictionary*)obj[@"x"];
@@ -218,7 +213,7 @@ void testObjectiveCAPI()
             context.exception = [JSValue valueWithNewErrorFromMessage:@"Something went wrong." inContext:context];
         };
         JSValue *result = [context evaluateScript:@"var result; try { callback(); } catch (e) { result = 'Caught exception'; }"];
-        checkResult(@"Explicit throw in callback - was caught by JavaScript", [[result toString] isEqual:@"Caught exception"]);
+        checkResult(@"Explicit throw in callback - was caught by JavaScript", [result isEqualToObject:@"Caught exception"]);
         checkResult(@"Explicit throw in callback - not thrown to Objective-C", !context.exception);
     }
 
@@ -229,7 +224,7 @@ void testObjectiveCAPI()
             [context evaluateScript:@"!@#$%^&*() THIS IS NOT VALID JAVASCRIPT SYNTAX !@#$%^&*()"];
         };
         JSValue *result = [context evaluateScript:@"var result; try { callback(); } catch (e) { result = 'Caught exception'; }"];
-        checkResult(@"Implicit throw in callback - was caught by JavaScript", [[result toString] isEqual:@"Caught exception"]);
+        checkResult(@"Implicit throw in callback - was caught by JavaScript", [result isEqualToObject:@"Caught exception"]);
         checkResult(@"Implicit throw in callback - not thrown to Objective-C", !context.exception);
     }
 
@@ -258,7 +253,7 @@ void testObjectiveCAPI()
                 return result; \
             })"];
         JSValue *result = [mulAddFunction callWithArguments:@[ @[ @2, @4, @8 ], @{ @"x":@0.5, @"y":@42 } ]];
-        checkResult(@"mulAddFunction", [[result toString] isEqual:@"43,44,46"]);
+        checkResult(@"mulAddFunction", [result isObject] && [[result toString] isEqual:@"43,44,46"]);
     }
 
     @autoreleasepool {
@@ -288,7 +283,7 @@ void testObjectiveCAPI()
         [context evaluateScript:@"testXYZ.test('test')"];
         checkResult(@"TextXYZ - testXYZTested", testXYZTested);
         JSValue *result = [context evaluateScript:@"testXYZ.x + ',' + testXYZ.y + ',' + testXYZ.z"];
-        checkResult(@"TextXYZ - result", [[result toString] isEqual:@"13,4,undefined"]);
+        checkResult(@"TextXYZ - result", [result isEqualToObject:@"13,4,undefined"]);
     }
 
     @autoreleasepool {
@@ -321,8 +316,9 @@ void testObjectiveCAPI()
     @autoreleasepool {
         JSContext *context = [[[JSContext alloc] init] autorelease];
         context[@"foo"] = @YES;
+        checkResult(@"@YES is boolean", [context[@"foo"] isBoolean]);
         JSValue *result = [context evaluateScript:@"typeof foo"];
-        checkResult(@"@YES is boolean", [[result toString] isEqual:@"boolean"]);
+        checkResult(@"@YES is boolean", [result isEqualToObject:@"boolean"]);
     }
 
     @autoreleasepool {
@@ -330,7 +326,7 @@ void testObjectiveCAPI()
         TestObject* testObject = [TestObject testObject];
         context[@"testObject"] = testObject;
         JSValue *result = [context evaluateScript:@"String(testObject)"];
-        checkResult(@"String(testObject)", [[result toString] isEqual:@"[object TestObject]"]);
+        checkResult(@"String(testObject)", [result isEqualToObject:@"[object TestObject]"]);
     }
 
     @autoreleasepool {
@@ -338,14 +334,14 @@ void testObjectiveCAPI()
         TestObject* testObject = [TestObject testObject];
         context[@"testObject"] = testObject;
         JSValue *result = [context evaluateScript:@"String(testObject.__proto__)"];
-        checkResult(@"String(testObject.__proto__)", [[result toString] isEqual:@"[object TestObjectPrototype]"]);
+        checkResult(@"String(testObject.__proto__)", [result isEqualToObject:@"[object TestObjectPrototype]"]);
     }
 
     @autoreleasepool {
         JSContext *context = [[[JSContext alloc] init] autorelease];
         context[@"TestObject"] = [TestObject class];
         JSValue *result = [context evaluateScript:@"String(TestObject)"];
-        checkResult(@"String(TestObject)", [[result toString] isEqual:@"[object TestObjectConstructor]"]);
+        checkResult(@"String(TestObject)", [result isEqualToObject:@"[object TestObjectConstructor]"]);
     }
 
     @autoreleasepool {
@@ -367,7 +363,7 @@ void testObjectiveCAPI()
         context[@"testObjectA"] = testObject;
         context[@"testObjectB"] = testObject;
         JSValue *result = [context evaluateScript:@"testObjectA == testObjectB"];
-        checkResult(@"testObjectA == testObjectB", [result toBool]);
+        checkResult(@"testObjectA == testObjectB", [result isBoolean] && [result toBool]);
     }
 
     @autoreleasepool {
@@ -376,7 +372,7 @@ void testObjectiveCAPI()
         context[@"testObject"] = testObject;
         testObject.point = (CGPoint){3,4};
         JSValue *result = [context evaluateScript:@"var result = JSON.stringify(testObject.point); testObject.point = {x:12,y:14}; result"];
-        checkResult(@"testObject.point - result", [[result toString] isEqual:@"{\"x\":3,\"y\":4}"]);
+        checkResult(@"testObject.point - result", [result isEqualToObject:@"{\"x\":3,\"y\":4}"]);
         checkResult(@"testObject.point - {x:12,y:14}", testObject.point.x == 12 && testObject.point.y == 14);
     }
 
@@ -387,7 +383,7 @@ void testObjectiveCAPI()
         context[@"testObject"] = testObject;
         context[@"mul"] = ^(int x, int y){ return x * y; };
         JSValue *result = [context evaluateScript:@"mul(testObject.six, 7)"];
-        checkResult(@"mul(testObject.six, 7)", [result toInt32] == 42);
+        checkResult(@"mul(testObject.six, 7)", [result isNumber] && [result toInt32] == 42);
     }
 
     @autoreleasepool {
@@ -403,14 +399,14 @@ void testObjectiveCAPI()
         JSContext *context = [[[JSContext alloc] init] autorelease];
         context[@"point"] = @{ @"x":@6, @"y":@7 };
         JSValue *result = [context evaluateScript:@"point.x + ',' + point.y"];
-        checkResult(@"point.x + ',' + point.y", [[result toString] isEqual:@"6,7"]);
+        checkResult(@"point.x + ',' + point.y", [result isEqualToObject:@"6,7"]);
     }
 
     @autoreleasepool {
         JSContext *context = [[[JSContext alloc] init] autorelease];
         context[@"point"] = @{ @"x":@6, @"y":@7 };
         JSValue *result = [context evaluateScript:@"point.x + ',' + point.y"];
-        checkResult(@"point.x + ',' + point.y", [[result toString] isEqual:@"6,7"]);
+        checkResult(@"point.x + ',' + point.y", [result isEqualToObject:@"6,7"]);
     }
 
     @autoreleasepool {
@@ -418,7 +414,7 @@ void testObjectiveCAPI()
         TestObject* testObject = [TestObject testObject];
         context[@"testObject"] = testObject;
         JSValue *result = [context evaluateScript:@"testObject.getString()"];
-        checkResult(@"testObject.getString()", [result toInt32] == 42);
+        checkResult(@"testObject.getString()", [result isString] && [result toInt32] == 42);
     }
 
     @autoreleasepool {
@@ -434,7 +430,7 @@ void testObjectiveCAPI()
         TestObject* testObject = [TestObject testObject];
         context[@"testObject"] = testObject;
         JSValue *result = [context evaluateScript:@"testObject.getString.call(testObject)"];
-        checkResult(@"testObject.getString.call(testObject)", [result toInt32] == 42);
+        checkResult(@"testObject.getString.call(testObject)", [result isString] && [result toInt32] == 42);
     }
 
     @autoreleasepool {
@@ -451,7 +447,7 @@ void testObjectiveCAPI()
         TestObject* testObject = [TestObject testObject];
         context[@"testObject"] = testObject;
         JSValue *result = [context evaluateScript:@"var result = 0; testObject.callback(function(x){ result = x; }); result"];
-        checkResult(@"testObject.callback", [result toInt32] == 42);
+        checkResult(@"testObject.callback", [result isNumber] && [result toInt32] == 42);
     }
 
     @autoreleasepool {
index f6c5691..6f1318f 100644 (file)
@@ -1,3 +1,180 @@
+2013-01-02  Gavin Barraclough  <barraclough@apple.com>
+
+        Objective-C API for JavaScriptCore
+        https://bugs.webkit.org/show_bug.cgi?id=105889
+
+        Reviewed by Geoff Garen.
+
+        Fixes for a number of issues raised by Darin.
+
+        * API/APIJSValue.h:
+            - Fix typos in comment
+            - Add newline before NS_CLASS_AVAILABLE(10_9, NA)
+            - cls -> expectedClass
+            - key type for -setObject:forKeyedSubscript: is now NSObject <NSCopying> *
+        * API/JSBase.h:
+            - JS_OBJC_API_ENABLED no longer implies __OBJC__
+        * API/JSBlockAdaptor.mm:
+        (BlockArgumentStruct::BlockArgumentStruct):
+        (BlockArgumentStruct):
+            - mark virtual functions as virtual, override, and private
+            - refactor out buffer allocation for struct types
+        (BlockArgumentTypeDelegate::typeVoid):
+        (BlockArgumentTypeDelegate::typeBlock):
+        (BlockArgumentTypeDelegate::typeStruct):
+            - return nil -> return 0
+        (BlockResultStruct::BlockResultStruct):
+        (BlockResultStruct):
+            - mark virtual functions as virtual, override, and private
+            - refactor out buffer allocation for struct types
+        (buildBlockSignature):
+            - %lu is not an appropriate format specifier for NSInteger
+        (-[JSBlockAdaptor initWithBlockSignatureFromProtocol:]):
+            - nil check [super init]
+        (-[JSBlockAdaptor blockMatchesSignature:]):
+        (-[JSBlockAdaptor blockFromValue:inContext:withException:]):
+            - ctx -> contextRef
+        * API/JSContext.h:
+            - Fix typos in comment
+            - Add newline before NS_CLASS_AVAILABLE(10_9, NA)
+            - key type for -setObject:forKeyedSubscript: is now NSObject <NSCopying> *
+        * API/JSContext.mm:
+        (-[JSContext initWithVirtualMachine:]):
+            - nil check [super init]
+        (+[JSContext currentArguments]):
+            - args -> argumentArray
+        (-[JSContext setObject:forKeyedSubscript:]):
+            - key type for -setObject:forKeyedSubscript: is now NSObject <NSCopying> *
+        (-[JSContext dealloc]):
+        (-[JSContext protect:]):
+        (-[JSContext unprotect:]):
+            - m_protected -> m_protectCounts
+        * API/JSValue.mm:
+        (-[JSValue toObjectOfClass:]):
+            - cls -> expectedClass
+        (-[JSValue toBool]):
+        (-[JSValue deleteProperty:]):
+        (-[JSValue hasProperty:]):
+        (-[JSValue isUndefined]):
+        (-[JSValue isNull]):
+        (-[JSValue isBoolean]):
+        (-[JSValue isNumber]):
+        (-[JSValue isString]):
+        (-[JSValue isObject]):
+        (-[JSValue isEqualToObject:]):
+        (-[JSValue isEqualWithTypeCoercionToObject:]):
+        (-[JSValue isInstanceOf:]):
+            - removed ? YES : NO
+        (-[JSValue callWithArguments:]):
+        (-[JSValue constructWithArguments:]):
+        (-[JSValue invokeMethod:withArguments:]):
+            - args -> argumentArray
+        (+[JSValue valueWithPoint:inContext:]):
+        (+[JSValue valueWithRange:inContext:]):
+        (+[JSValue valueWithRect:inContext:]):
+        (+[JSValue valueWithSize:inContext:]):
+            - [NSNumber numberWithFloat:] -> @()
+        (-[JSValue objectForKeyedSubscript:]):
+        (-[JSValue setObject:forKeyedSubscript:]):
+            - key type for -setObject:forKeyedSubscript: is now NSObject <NSCopying> *
+        (JSContainerConvertor):
+        (JSContainerConvertor::isWorkListEmpty):
+        (JSContainerConvertor::convert):
+        (ObjcContainerConvertor):
+        (ObjcContainerConvertor::isWorkListEmpty):
+            - remove WTF::
+            - isWorkListEmpty is const
+        (objectToValue):
+            -  use fast enumeration
+        (-[JSValue initWithValue:inContext:]):
+            - nil check [super init]
+        (getStructTagHandler):
+            - m_structHandlers -> structHandlers
+        * API/JSVirtualMachine.h:
+            - Add newline before NS_CLASS_AVAILABLE(10_9, NA)
+        * API/JSVirtualMachine.mm:
+        (-[JSVirtualMachine init]):
+            - nil check [super init]
+        * API/JSWrapperMap.mm:
+        (selectorToPropertyName):
+        (copyPrototypeProperties):
+            - remove WTF::
+            - use static_cast
+        (-[JSObjCClassInfo initWithContext:forClass:superClassInfo:]):
+        (-[JSWrapperMap initWithContext:]):
+            - nil check [super init]
+        (-[JSWrapperMap wrapperForObject:]):
+        (tryUnwrapObjcObject):
+            - enable ASSERT
+        (getJSExportProtocol):
+        (getNSBlockClass):
+            - remove if check on initializing static
+        * API/JavaScriptCore.h:
+            - JS_OBJC_API_ENABLED no longer implies __OBJC__
+        * API/ObjCCallbackFunction.mm:
+        (CallbackArgumentOfClass):
+        (CallbackArgumentOfClass::~CallbackArgumentOfClass):
+        (CallbackArgumentStruct::CallbackArgumentStruct):
+        (CallbackArgumentStruct):
+        (CallbackArgumentBlockCallback):
+            - mark virtual functions as virtual, override, and private
+            - refactor out buffer allocation for struct types
+        (ArgumentTypeDelegate::typeVoid):
+        (ArgumentTypeDelegate::typeOfClass):
+        (ArgumentTypeDelegate::typeStruct):
+            - return nil -> return 0
+        (CallbackResultStruct::CallbackResultStruct):
+        (CallbackResultStruct):
+            - mark virtual functions as virtual, override, and private
+            - refactor out buffer allocation for struct types
+        (ResultTypeDelegate::typeStruct):
+            - return nil -> return 0
+        (ObjCCallbackFunction):
+            - remove WTF::
+        (objCCallbackFunctionFinalize):
+            - use static_cast
+        (objCCallbackFunctionCallAsFunction):
+            - Fix typos in comment
+        (createObjCCallbackFunctionClass):
+        (objCCallbackFunctionClass):
+            - Split out createObjCCallbackFunctionClass from objCCallbackFunctionClass
+        (ObjCCallbackFunction::call):
+            - ctx -> contextRef
+        (blockSignatureContainsClass):
+            - Remove tri-state enum.
+        (skipNumber):
+            - isdigit -> isASCIIDigit 
+        (objCCallbackFunctionForInvocation):
+            - clean up & comment blockSignatureContainsClass() usage
+        (tryUnwrapBlock):
+            - use static_cast
+        * API/ObjcRuntimeExtras.h:
+        (forEachProtocolImplementingProtocol):
+        (forEachMethodInClass):
+        (forEachMethodInProtocol):
+        (forEachPropertyInProtocol):
+            - Remove WTF::
+            - Remove if (count) checks
+        (skipPair):
+            - NSUInteger -> size_t
+        (StringRange):
+        (StringRange::operator const char*):
+        (StringRange::get):
+        (StructBuffer):
+        (StructBuffer::StructBuffer):
+        (StructBuffer::~StructBuffer):
+        (StructBuffer::operator void*):
+            - Added helper for creating an aligned buffer, used by struct conversion invocations.
+        (parseObjCType):
+            - *(position++) -> *position++
+        * API/tests/testapi.c:
+            - PLATFORM(MAC) -> JS_OBJC_API_ENABLED
+        * API/tests/testapi.m:
+        (blockSignatureContainsClass):
+            - Remove tri-state enum.
+        (testObjectiveCAPI):
+            - Added more result type checks.
+
 2013-01-02  Filip Pizlo  <fpizlo@apple.com>
 
         DFG should not use the InlineCallFrame's callee when it could have used the executable istead