From bcfb4b447766a6b7a142bfc3de370451085460eb Mon Sep 17 00:00:00 2001 From: achen Date: Wed, 6 Jul 2016 10:15:27 +0800 Subject: [PATCH] JSONKit usage here may cause serious crash hard to debug(I found the crash on simulator, on device I got nothing but app freezed)! My app has an old version of JSONKit which is still using MRC. I think JSONKit is not needed if system version is available. Kicking out of JSONKit will make react native stronger. Crash stack: * thread #11: tid = 0xbd672f, 0x000000010a10edeb imobii-waiqin`jk_encode_add_atom_to_buffer(encodeState=0x00007f9b820a1000, objectPtr=22 key/value pairs) + 16971 at JSONKit.m:2807, name = 'com.facebook.React.JavaScript', stop reason = EXC_BAD_ACCESS (code=EXC_I386_GPFLT) frame #0: 0x000000010a10edeb imobii-waiqin`jk_encode_add_atom_to_buffer(encodeState=0x00007f9b820a1000, objectPtr=22 key/value pairs) + 16971 at JSONKit.m:2807 frame #1: 0x000000010a10ef67 imobii-waiqin`jk_encode_add_atom_to_buffer(encodeState=0x00007f9b820a1000, objectPtr=2 key/value pairs) + 17351 at JSONKit.m:2811 frame #2: 0x000000010a10ef67 imobii-waiqin`jk_encode_add_atom_to_buffer(encodeState=0x00007f9b820a1000, objectPtr=25 key/value pairs) + 17351 at JSONKit.m:2811 frame #3: 0x000000010a10e768 imobii-waiqin`jk_encode_add_atom_to_buffer(encodeState=0x00007f9b820a1000, objectPtr=@"3 elements") + 15304 at JSONKit.m:2778 * frame #4: 0x000000010a10a26a imobii-waiqin`-[JKSerializer serializeObject:options:encodeOption:block:delegate:selector:error:](self=0x00007f9b831fbc80, _cmd="serializeObject:options:encodeOption:block:delegate:selector:error:", object=@"3 elements", optionFlags=0, encodeOption=10, block=0x0000000000000000, delegate=0x0000000000000000, selector=, error=domain: class name = NSInvocation - code: 0) + 2250 at JSONKit.m:2876 frame #5: 0x000000010a109992 imobii-waiqin`+[JKSerializer serializeObject:options:encodeOption:block:delegate:selector:error:](self=JKSerializer, _cmd="serializeObject:options:encodeOption:block:delegate:selector:error:", object=@"3 elements", optionFlags=0, encodeOption=10, block=0x0000000000000000, delegate=0x0000000000000000, selector=, error=domain: class name = NSInvocation - code: 0) + 178 at JSONKit.m:2831 frame #6: 0x000000010a10f700 imobii-waiqin`-[NSArray(self=@"3 elements", _cmd="JSONStringWithOptions:error:", serializeOptions=0, error=domain: class name = NSInvocation - code: 0) JSONStringWithOptions:error:] + 112 at JSONKit.m:2985 frame #7: 0x000000010ac13c02 imobii-waiqin`_RCTJSONStringifyNoRetry(jsonObject=@"3 elements", error=domain: class name = NSInvocation - code: 0) + 338 at RCTUtils.m:49 frame #8: 0x000000010ac13990 imobii-waiqin`RCTJSONStringify(jsonObject=@"3 elements", error=0x0000000000000000) + 128 at RCTUtils.m:77 frame #9: 0x000000010ab5fdfa imobii-waiqin`__27-[RCTContextExecutor setUp]_block_invoke_2(.block_descriptor=, moduleName=@"UIManager") + 218 at RCTContextExecutor.m:363 frame #10: 0x00000001134495cc CoreFoundation`__invoking___ + 140 frame #11: 0x000000011344941e CoreFoundation`-[NSInvocation invoke] + 286 frame #12: 0x000000010db13db3 JavaScriptCore`JSC::ObjCCallbackFunctionImpl::call(JSContext*, OpaqueJSValue*, unsigned long, OpaqueJSValue const* const*, OpaqueJSValue const**) + 451 frame #13: 0x000000010db13926 JavaScriptCore`JSC::objCCallbackFunctionCallAsFunction(OpaqueJSContext const*, OpaqueJSValue*, OpaqueJSValue*, unsigned long, OpaqueJSValue const* const*, OpaqueJSValue const**) + 262 frame #14: 0x000000010db14bad JavaScriptCore`long long JSC::APICallbackFunction::call(JSC::ExecState*) + 573 frame #15: 0x000000010dade340 JavaScriptCore`JSC::LLInt::setUpCall(JSC::ExecState*, JSC::Instruction*, JSC::CodeSpecializationKind, JSC::JSValue, JSC::LLIntCallLinkInfo*) + 528 frame #16: 0x000000010dae535d JavaScriptCore`llint_entry + 22900 frame #17: 0x000000010dadf7d9 JavaScriptCore`vmEntryToJavaScript + 326 frame #18: 0x000000010d9b1959 JavaScriptCore`JSC::JITCode::execute(JSC::VM*, JSC::ProtoCallFrame*) + 169 frame #19: 0x000000010d9985ad JavaScriptCore`JSC::Interpreter::executeCall(JSC::ExecState*, JSC::JSObject*, JSC::CallType, JSC::CallData const&, JSC::JSValue, JSC::ArgList const&) + 493 frame #20: 0x000000010d76cb7e JavaScriptCore`JSC::call(JSC::ExecState*, JSC::JSValue, JSC::CallType, JSC::CallData const&, JSC::JSValue, JSC::ArgList const&) + 62 frame #21: 0x000000010d929a55 JavaScriptCore`JSC::callGetter(JSC::ExecState*, JSC::JSValue, JSC::JSValue) + 149 frame #22: 0x000000010dad49fb JavaScriptCore`llint_slow_path_get_by_id + 2203 frame #23: 0x000000010dae22f0 JavaScriptCore`llint_entry + 10503 frame #24: 0x000000010dae5368 JavaScriptCore`llint_entry + 22911 frame #25: 0x000000010dae52fd JavaScriptCore`llint_entry + 22804 frame #26: 0x000000010dae5368 JavaScriptCore`llint_entry + 22911 frame #27: 0x000000010dae5368 JavaScriptCore`llint_entry + 22911 frame #28: 0x000000010dae52fd JavaScriptCore`llint_entry + 22804 frame #29: 0x000000010dae5368 JavaScriptCore`llint_entry + 22911 frame #30: 0x000000010dae5368 JavaScriptCore`llint_entry + 22911 frame #31: 0x000000010dae5368 JavaScriptCore`llint_entry + 22911 frame #32: 0x000000010dae552a JavaScriptCore`llint_entry + 23361 frame #33: 0x000000010dae5368 JavaScriptCore`llint_entry + 22911 frame #34: 0x000000010dae5368 JavaScriptCore`llint_entry + 22911 frame #35: 0x000000010dadf7d9 JavaScriptCore`vmEntryToJavaScript + 326 frame #36: 0x000000010d9b1959 JavaScriptCore`JSC::JITCode::execute(JSC::VM*, JSC::ProtoCallFrame*) + 169 frame #37: 0x000000010d998264 JavaScriptCore`JSC::Interpreter::execute(JSC::ProgramExecutable*, JSC::ExecState*, JSC::JSObject*) + 10404 frame #38: 0x000000010d7a8786 JavaScriptCore`JSC::evaluate(JSC::ExecState*, JSC::SourceCode const&, JSC::JSValue, WTF::NakedPtr&) + 470 frame #39: 0x000000010d9f6fb8 JavaScriptCore`JSEvaluateScript + 424 frame #40: 0x000000010ab6379e imobii-waiqin`__68-[RCTContextExecutor executeApplicationScript:sourceURL:onComplete:]_block_invoke.264(.block_descriptor=) + 414 at RCTContextExecutor.m:589 frame #41: 0x000000010ab63262 imobii-waiqin`__68-[RCTContextExecutor executeApplicationScript:sourceURL:onComplete:]_block_invoke(.block_descriptor=) + 498 at RCTContextExecutor.m:589 frame #42: 0x000000010ab63df8 imobii-waiqin`-[RCTContextExecutor executeBlockOnJavaScriptQueue:](self=0x00007f9b832f6040, _cmd="executeBlockOnJavaScriptQueue:", block=0x00007f9b80c92970) + 248 at RCTContextExecutor.m:627 frame #43: 0x000000010eb1d7a7 Foundation`__NSThreadPerformPerform + 283 frame #44: 0x0000000113486301 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17 frame #45: 0x000000011347c22c CoreFoundation`__CFRunLoopDoSources0 + 556 frame #46: 0x000000011347b6e3 CoreFoundation`__CFRunLoopRun + 867 frame #47: 0x000000011347b0f8 CoreFoundation`CFRunLoopRunSpecific + 488 frame #48: 0x000000010ab5e41b imobii-waiqin`+[RCTContextExecutor runRunLoopThread](self=RCTContextExecutor, _cmd="runRunLoopThread") + 363 at RCTContextExecutor.m:284 frame #49: 0x000000010ebc012b Foundation`__NSThread__start__ + 1198 frame #50: 0x00000001140869b1 libsystem_pthread.dylib`_pthread_body + 131 frame #51: 0x000000011408692e libsystem_pthread.dylib`_pthread_start + 168 frame #52: 0x0000000114084385 libsystem_pthread.dylib`thread_start + 13 --- React/Base/RCTUtils.m | 47 ------------------------------------------- 1 file changed, 47 deletions(-) diff --git a/React/Base/RCTUtils.m b/React/Base/RCTUtils.m index 398f137b0b09af..dfd36a1e4b858a 100644 --- a/React/Base/RCTUtils.m +++ b/React/Base/RCTUtils.m @@ -30,26 +30,7 @@ return nil; } - static SEL JSONKitSelector = NULL; - static NSSet *collectionTypes; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - SEL selector = NSSelectorFromString(@"JSONStringWithOptions:error:"); - if ([NSDictionary instancesRespondToSelector:selector]) { - JSONKitSelector = selector; - collectionTypes = [NSSet setWithObjects: - [NSArray class], [NSMutableArray class], - [NSDictionary class], [NSMutableDictionary class], nil]; - } - }); - @try { - - // Use JSONKit if available and object is not a fragment - if (JSONKitSelector && [collectionTypes containsObject:[jsonObject classForCoder]]) { - return ((NSString *(*)(id, SEL, int, NSError **))objc_msgSend)(jsonObject, JSONKitSelector, 0, error); - } - // Use Foundation JSON method NSData *jsonData = [NSJSONSerialization dataWithJSONObject:jsonObject options:(NSJSONWritingOptions)NSJSONReadingAllowFragments @@ -89,35 +70,7 @@ static id __nullable _RCTJSONParse(NSString *__nullable jsonString, BOOL mutable, NSError **error) { - static SEL JSONKitSelector = NULL; - static SEL JSONKitMutableSelector = NULL; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - SEL selector = NSSelectorFromString(@"objectFromJSONStringWithParseOptions:error:"); - if ([NSString instancesRespondToSelector:selector]) { - JSONKitSelector = selector; - JSONKitMutableSelector = NSSelectorFromString(@"mutableObjectFromJSONStringWithParseOptions:error:"); - } - }); - if (jsonString) { - - // Use JSONKit if available and string is not a fragment - if (JSONKitSelector) { - NSInteger length = jsonString.length; - for (NSInteger i = 0; i < length; i++) { - unichar c = [jsonString characterAtIndex:i]; - if (strchr("{[", c)) { - static const int options = (1 << 2); // loose unicode - SEL selector = mutable ? JSONKitMutableSelector : JSONKitSelector; - return ((id (*)(id, SEL, int, NSError **))objc_msgSend)(jsonString, selector, options, error); - } - if (!strchr(" \r\n\t", c)) { - break; - } - } - } - // Use Foundation JSON method NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding]; if (!jsonData) {