-
Notifications
You must be signed in to change notification settings - Fork 1.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Testing #197
Open
johnnyduo
wants to merge
28
commits into
johnezang:experimental
Choose a base branch
from
johnnyduo:master
base: experimental
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Testing #197
Conversation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
…n progress edits made it in to the commit. This change backs them out.
…ry is implemented using a hash table that uses linear probing, the removal function needs to "re-add" items that follow the removed item so that linear probe hash collisions are not "lost". Closes johnezang#17
Pull Xcode 4.1 update.
…ang#23. For issue johnezang#23, the code in the collection classes `+load` was removed and placed in a function with the `__attribute__ ((constructor))` attribute. This is to work around an apparent bug when building JSONKit as a static library for iOS targets. @ohhorob also opened a bug with apple- # 9461567.
…meInitialization(). Missed the JSONDecoder +load stuff on the last commit. Related to issue johnezang#23.
…able> constructions to the easier Markdown extra tables to see if the new github markdown processor accepts them. Also changed some <pre> items to ```objective-c / ``` fenced code style.
…some preprocessor-foo to JSONKit.m to check if JSONKit is being compiled with ARC / `-fobjc-arc` and #error if it is.
In the rare case when a hash collision occurs between two values, the object cache's bucket-probing code needs to go as far as comparing the bytes content of the candidate bucket with the bytes content of the current token. For numeric values, 'bytes' refers to the raw bytes of the number. These byte representations may contain leading '\0' values. strncmp() is only designed for comparing strings, so characters appearing after a '\0' are not compared. Therefore, if a hash collision occurs between two numeric values that only differ in their lower bytes, they will be assigned to the same bucket, and the cache will return the first token's object for the second token's value. memcmp() is binary-safe and considers all of the numbers' bytes, avoiding this problem. This is a rare case indeed, but here is an example that reproduces the problem: JSON Input: [ 1734.75, 417.75 ] Identical Types: double (8 bytes) Identical DJB Hashes: 2510392872 JSONKit (strncmp): [ 1734.75, 1734.75 ] (boo!) JSONKit (memcmp): [ 1734.75, 417.75 ] (yay!)
Fix compilation errors under Clang 3.0
Use memcmp() instead of strncmp() to compare cache buckets.
… 64-bit Lion / 10.7 ABI". This commit implements a work around for a bug in 10.7 that was caused by a 10.7 64-bit ABI breaking change. Technically, this is not a bug in JSONKit, but with Mac OS X. When making changes to the ABI, it is (at least de facto) required to bump the "major version" of a shared library so that code designed around and built against the "guarantees" provided by previous versions ABI / API are not violated. Not only was this not done in 10.7, the ABI breaking change isn't even officially documented (to the best of my knowledge). It's certainly not mentioned in the 10.7 release notes.
I realize that `collection` won't always be an NSArray, but the cast will let the compiler know to expect a NSUInteger return type instead of `size_t` which is also a return type a method named `count` inside of JSONKit.
Surpress "multiple methods named" error
Hashing was changed slightly to exploit the fact that a significant amount of real world JSON strings / keys will have a high percentage of ASCII characters. Cache aging was modified to use an AIMD (additive increase, multiplicative decrease) policy. When an item is found in the cache, its age is incremented by one using saturating arithmetic. Ages are "quasi-randomly" aged using unsigned right shifts, or in other words its age is divided in half. Since ages decrease far more quickly than they increase, the cache can quickly adapt and converge on the "hot set".
…n about. 1. Some of the string format argument specifiers used `%lu` to display `NSUInteger` values. `%lu` specifies a type of `unsigned long`, and `NSUInteger` maps to either `unsigned int` or `unsigned long`, depending on whether or not you're targeting a 32-bit or 64-bit ABI, respectively. On a 32-bit architecture (at least for the architectures / compilers that JSONKit will be used on), `unsigned long` and `unsigned int` just so happen to use the same primitive type- a 4 byte 32-bit value. On a 64-bit architecture (again, for the architectures / compilers that JSONKit will be used on), `unsigned int` stays the same at 4 bytes, however `unsigned long` grows to 64-bits / 8 bytes. The long and the short of it is this that using `%lu` allows you to easily support 32-bit and 64-bits with out a lot of effort. However, technically, the C standard says that `int` and `long` are strictly different ranks, and it's generally considered poor form to take advantage of platform specific details in this case. The proper fix is to add explicit type casts to `unsigned long`. This makes the implied behavior explicit, and eliminates the warnings from newer versions of the compiler. FYI, `gcc` did this for a long time and seems to be something that is either new or enabled by default in `clang` / `Xcode`. Other good warning flags you should consider enabling by default (from Xcode 4.3): Implicit Conversion to 32 Bit Type Suspicious Implicit Conversions Hidden Local Variables 2. Newer compiler warns about deprecated `id` `isa` usage. I found jwz's commentary about breaking API's pretty funny: http://www.jwz.org/blog/2012/06/i-have-ported-xscreensaver-to-the-iphone/
…rning. The current (at the time of this writing) version of the `clang` static analyzer is complaing that the `objects` pointer is `NULL`. This is a false positive warning from the analyzer.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
No description provided.