From 441a56e451c701103b1ea6788f93d9bcc56c2d43 Mon Sep 17 00:00:00 2001 From: siema Date: Wed, 5 Apr 2017 16:26:17 +0200 Subject: [PATCH 1/4] Fixed size check in encoder for arrays and dictionaries --- Sources/SwiftMsgPack/Encoder.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Sources/SwiftMsgPack/Encoder.swift b/Sources/SwiftMsgPack/Encoder.swift index 5ca8d29..a54003b 100644 --- a/Sources/SwiftMsgPack/Encoder.swift +++ b/Sources/SwiftMsgPack/Encoder.swift @@ -380,7 +380,7 @@ public extension Data { @discardableResult private mutating func pack(array value: [Any?]) throws -> Data { - guard value.count < Int(bitPattern: UInt(UInt32.max)) else { + guard UInt32(bitPattern: Int32(value.count)) < UInt32.max else { //guard value.count < Int(UInt32.max) else { // Array is too large to be included in a MsgPack data throw MsgPackError.dataIsTooBig("Array is too big: \(value.count) items") @@ -405,7 +405,7 @@ public extension Data { @discardableResult private mutating func pack(dict value: [AnyHashable:Any?]) throws -> Data { - guard value.count < Int(bitPattern: UInt(UInt32.max)) else { + guard UInt32(bitPattern: Int32(value.count)) < UInt32.max else { // guard value.count < Int(UInt32.max) else { // Dictionary is too large to be contained in a MsgPack data throw MsgPackError.dataIsTooBig("Dictionary is too big: \(value.count) items") From e9a4df1f5f0efc8685be50deb9ba168bc9aee505 Mon Sep 17 00:00:00 2001 From: siema Date: Wed, 5 Apr 2017 16:27:23 +0200 Subject: [PATCH 2/4] Dropped unnecessarily high iOS version requirement in podspec to 8.0 --- SwiftMsgPack.podspec | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SwiftMsgPack.podspec b/SwiftMsgPack.podspec index 19fdc85..5d7915d 100644 --- a/SwiftMsgPack.podspec +++ b/SwiftMsgPack.podspec @@ -8,9 +8,9 @@ Pod::Spec.new do |spec| spec.social_media_url = 'http://twitter.com/danielemargutti' spec.source = { :git => 'https://github.com/malcommac/SwiftMsgPack.git', :tag => "#{spec.version}" } spec.source_files = 'Sources/**/*.swift' - spec.ios.deployment_target = '9.0' + spec.ios.deployment_target = '8.0' spec.osx.deployment_target = '10.10' spec.tvos.deployment_target = '9.0' spec.requires_arc = true spec.module_name = 'SwiftMsgPack' -end \ No newline at end of file +end From c06afd48072938e8ead1358a95e230dc68543de4 Mon Sep 17 00:00:00 2001 From: siema Date: Thu, 6 Apr 2017 12:56:48 +0200 Subject: [PATCH 3/4] Removed debug print from decoder --- Sources/SwiftMsgPack/Decoder.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/Sources/SwiftMsgPack/Decoder.swift b/Sources/SwiftMsgPack/Decoder.swift index a20decd..ea3cfc7 100644 --- a/Sources/SwiftMsgPack/Decoder.swift +++ b/Sources/SwiftMsgPack/Decoder.swift @@ -346,7 +346,6 @@ public extension Data { guard let key = try self.unpack(stream: &stream) as? AnyHashable else { throw MsgPackError.unsupportedValue("Invalid dict key") } - print(key) let val = try self.unpack(stream: &stream) dict[key] = val } From 2b3c8541aad15b7cdf9fd8de9659de90a9bdb4d7 Mon Sep 17 00:00:00 2001 From: Daniele Margutti Date: Thu, 14 Sep 2017 21:49:40 +0200 Subject: [PATCH 4/4] Swift 4 Compatibility --- .DS_Store | Bin 0 -> 10244 bytes .swift-version | 2 +- CHANGELOG.md | 14 +++++++++++++- README.md | 6 ++++-- Sources/SwiftMsgPack/Decoder.swift | 8 ++++---- SwiftMsgPack.podspec | 2 +- .../SwiftMsgPack.xcodeproj/project.pbxproj | 10 ++++++---- .../UserInterfaceState.xcuserstate | Bin 0 -> 22197 bytes 8 files changed, 29 insertions(+), 13 deletions(-) create mode 100644 .DS_Store create mode 100644 SwiftMsgPack/SwiftMsgPack.xcodeproj/project.xcworkspace/xcuserdata/dan.xcuserdatad/UserInterfaceState.xcuserstate diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..1b9a0631b40a6a4b85dcf4b529db3554a3ea1d69 GIT binary patch literal 10244 zcmeHMU2GIp6h5aEI@h*zKxjLZg@uM+3+$Gbg7UL;7o)?S$ExWoLF5 zs5RB7PlA#7pzxr^2LmMP13vfy8lzE6#D@~V#6*2DJ{gTBJ{ixQnO%0b-M*OkJ2#no z?%Z?E{rS!}bLZXx0PN1lK>$Ah2y}5N)=@T1;(C5fNmXu53rQq@&_;sMgpo{5vGgiD z1Uv*h1Uv*h1Uv-(DG1P-&67~;NH6yg@DT72C?LS!4}QA147qZ`k@l;DGJ6X^vYM*x zL}if|NcvqFa^-|0Nka)8SCWn^x?2o%+^OF0+J#&>;Yi0F(A|8X+cUa56tsJ%_Wiaw zV91eP?jhhIFcks5cdv%^Faj!ACHwaWUcOPROB#`goUsxBw{cmo-B7_VX~-3IsnMb{ zfhF&9#~O%&0U1a`0u(UgIWra4j5ujNi>EZzv;u)UST(D9_M93)5Nd_`+GEjCBNw$| zR>tg(rH|Nms;tD_a-U&ng>o!@NL6yf;)1ZDTQOBv(naP+2UJ})a@|Homrc8!gE4EA zd>LZ`8y1_##yU1_Zu18N!SOc#SXWn|&EK(c)A+a`G_443>p7l0b9U^>@uyz30RVL0 zM$q8g7xIf#Dx0QkCbT#Wl-rc4N^pnQewb=;AN|R@cRu1xl(%s|29+#IA_3DyA{$NX znxT(S>wIE$6sH{V;sjXG3np>oAjBwUCyOF>b4tVrN1%GsX@)mh8@yZUC2XtH&1%T zYNb6rd-n~CV#ZV+SG1U=W|c_HQp{no!K7!QCt>IZ(@K_@K9Df9Oj0M!yhKb(WXM?A zscBL5tYQvY%4v(24x2{W3fqQ*D*5udVR1h9KajFiLpKj8X_F*lSL+t~malv$(E0H8 z@MQhm265he#tswax}}~_m2`hjm95dCn3+&?S=C1dvZ|@ZHKk9FC6#&D#@J+IQ**tv zNLrj%mAeRHt1y^}tEV!mb;j;v$x?|Om1*R?hRl1B#rFheYg(5|(h;r+rxnU&L6{Wh zHq^7#(po0Qgg%pI;?%5T8<=RazLWHb+ci=<>kvel^=q-XqB&JvY>Oc7V*^=dx=!VM zwoPDzbaI)bNt$-IJ3^B51n+i#%(M=q6rG0jDfM07)Z7@MAq{cePFdyy5?Vv6Ikf<6 z3|d10=T77wH4?PJcGwMv>A}(Iae4vH!Fjj{Z^GMf4X(o{@Hu<|x8O^-2j9Z?@DuzD zzre5XJJ#R=Y{VvP#$~t;*W(7&_6p!IB9>)`CU<%V{;ut=Q z&*AgWw*6vt&fSbh{pCaBdy=SeBx|k ztYB+5b}%MZ6Qv#P<}IY1L*#XuVl8Y3>A~)Xt?-4JAYvsdRwUvZa0T9nkKrZ}@HTu6 z-@%XY8}{S4_D$UT!U+|4Lfm@OT!56#y!|WRE%Oj4&WdTVH{;5;s}o7 zDI#J9vzWsPd>Wr2N}j{>M9G)%0$#$`9jX-wxF=6NN8)9Y6$v=aS~!Dk{>!AWDps^D zSsyXQhf>kDY^9tHef&#?*2(|u*G$nA^NS&WeH2xfEPwD#W2v?%YWLVX9Nc2xqOX@} zw55^pm-&{(f@{6xA>bk4A>bh}69TgwrJtYw@2dR&f2Jlpori#jz`q;;td2w@-86~( zez1H#{H)zi*KxXd;&u~`v|T8(kK;+&$MJN-kK^r4G1a--VcRc6_1u5LkyN7em;Vg# S_WvCA!uHGC|11By{r?{rS%_)? literal 0 HcmV?d00001 diff --git a/.swift-version b/.swift-version index 9f55b2c..5186d07 100644 --- a/.swift-version +++ b/.swift-version @@ -1 +1 @@ -3.0 +4.0 diff --git a/CHANGELOG.md b/CHANGELOG.md index 5ff0be3..0520f91 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,11 +4,23 @@ ## CHANGELOG +* Version **[1.0.0](#100)** * Version **[0.9.0](#090)** + + +## SwiftMsgPack 1.0.0 +--- +- **Release Date**: 2017/09/14 +- **Zipped Version**: [Download 1.0.0](https://github.com/malcommac/SwiftMsgPack/releases/tag/1.0.0) + +Swift 4 compatible version + + + ## SwiftMsgPack 0.9.0 --- - **Release Date**: 2017/02/26 - **Zipped Version**: [Download 0.9.0](https://github.com/malcommac/SwiftMsgPack/releases/tag/0.9.0) -First release \ No newline at end of file +First release diff --git a/README.md b/README.md index 77f0d52..75ffe2b 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,9 @@ Take a look here: ## Current Release -Latest release is: 0.9.1 [Download here](https://github.com/malcommac/SwiftMsgPack/releases/tag/0.9.1). +* **Swift 4.x**: Latest is 1.0.0 [Download here](https://github.com/malcommac/SwiftMsgPack/releases/tag/1.0.0). +* **Swift 3.x**: Last is 0.9.1 [Download here](https://github.com/malcommac/SwiftMsgPack/releases/tag/0.9.1). + A complete list of changes for each release is available in the [CHANGELOG](CHANGELOG.md) file. @@ -136,7 +138,7 @@ Tests can also be runned with XCode using the SwiftMsgPack project. Current version is compatible with: -* Swift 3.0+ +* Swift 4.x+ (Swift 3.x up to 0.9.1) * iOS 9.0 or later * tvOS 9.0 or later * macOS 10.10 or later diff --git a/Sources/SwiftMsgPack/Decoder.swift b/Sources/SwiftMsgPack/Decoder.swift index ea3cfc7..826acb7 100644 --- a/Sources/SwiftMsgPack/Decoder.swift +++ b/Sources/SwiftMsgPack/Decoder.swift @@ -297,10 +297,10 @@ public extension Data { // STRING 32 BIT LENGTH // str 32 11011011 0xdb case 0xdb: - let len_data = Int(try stream.read8Bit()) << 24 + - Int(try stream.read8Bit()) << 16 + - Int(try stream.read8Bit()) << 8 + - Int(try stream.read8Bit()) + var len_data = Int(try stream.read8Bit()) << 24 + len_data += Int(try stream.read8Bit()) << 16 + len_data += Int(try stream.read8Bit()) << 8 + len_data += Int(try stream.read8Bit()) return try unpack(string: &stream, length: len_data) diff --git a/SwiftMsgPack.podspec b/SwiftMsgPack.podspec index 5d7915d..26b05c3 100644 --- a/SwiftMsgPack.podspec +++ b/SwiftMsgPack.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |spec| spec.name = 'SwiftMsgPack' - spec.version = '0.9.1' + spec.version = '1.0.0' spec.summary = 'MsgPack Encoder/Decoder in pure Swift' spec.homepage = 'https://github.com/malcommac/SwiftMsgPack' spec.license = { :type => 'MIT', :file => 'LICENSE' } diff --git a/SwiftMsgPack/SwiftMsgPack.xcodeproj/project.pbxproj b/SwiftMsgPack/SwiftMsgPack.xcodeproj/project.pbxproj index f90c798..0c1e398 100644 --- a/SwiftMsgPack/SwiftMsgPack.xcodeproj/project.pbxproj +++ b/SwiftMsgPack/SwiftMsgPack.xcodeproj/project.pbxproj @@ -309,6 +309,7 @@ SDKROOT = iphoneos; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = "1,2,3,4"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; @@ -354,6 +355,7 @@ MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = "1,2,3,4"; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; @@ -382,7 +384,7 @@ SKIP_INSTALL = YES; SUPPORTED_PLATFORMS = "iphonesimulator iphoneos macosx appletvsimulator appletvos"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 4.0; TVOS_DEPLOYMENT_TARGET = 9.0; }; name = Debug; @@ -407,7 +409,7 @@ PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; SUPPORTED_PLATFORMS = "iphonesimulator iphoneos macosx appletvsimulator appletvos"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 4.0; TVOS_DEPLOYMENT_TARGET = 9.0; }; name = Release; @@ -423,7 +425,7 @@ PRODUCT_BUNDLE_IDENTIFIER = com.mokasw.SwiftMsgPackTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 4.0; }; name = Debug; }; @@ -437,7 +439,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.mokasw.SwiftMsgPackTests; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 4.0; }; name = Release; }; diff --git a/SwiftMsgPack/SwiftMsgPack.xcodeproj/project.xcworkspace/xcuserdata/dan.xcuserdatad/UserInterfaceState.xcuserstate b/SwiftMsgPack/SwiftMsgPack.xcodeproj/project.xcworkspace/xcuserdata/dan.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..2c3cbe9cd4c5ac1296c52303e0b61e6aa31bb8e2 GIT binary patch literal 22197 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 l^H3g@=bR_Z^T-qDN%O+