Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(511)

Side by Side Diff: runtime/bin/filter.cc

Issue 130513003: [ZLIB] Add support for windowBits, memLevel, raw (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Add support for memLevel Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "bin/dartutils.h" 5 #include "bin/dartutils.h"
6 #include "bin/filter.h" 6 #include "bin/filter.h"
7 #include "bin/io_buffer.h" 7 #include "bin/io_buffer.h"
8 8
9 #include "include/dart_api.h" 9 #include "include/dart_api.h"
10 10
11 11
12 namespace dart { 12 namespace dart {
13 namespace bin { 13 namespace bin {
14 14
15 const int kZlibFlagMemUsage = 8;
16 const int kZLibFlagWindowBits = 15; 15 const int kZLibFlagWindowBits = 15;
17 const int kZLibFlagUseGZipHeader = 16; 16 const int kZLibFlagUseGZipHeader = 16;
18 const int kZLibFlagAcceptAnyHeader = 32; 17 const int kZLibFlagAcceptAnyHeader = 32;
19 18
20 static const int kFilterPointerNativeField = 0; 19 static const int kFilterPointerNativeField = 0;
21 20
22 Filter* GetFilter(Dart_Handle filter_obj) { 21 Filter* GetFilter(Dart_Handle filter_obj) {
23 Filter* filter; 22 Filter* filter;
24 Dart_Handle result = Filter::GetFilterPointerNativeField(filter_obj, &filter); 23 Dart_Handle result = Filter::GetFilterPointerNativeField(filter_obj, &filter);
25 if (Dart_IsError(result)) { 24 if (Dart_IsError(result)) {
26 Dart_PropagateError(result); 25 Dart_PropagateError(result);
27 } 26 }
28 if (filter == NULL) { 27 if (filter == NULL) {
29 Dart_ThrowException(DartUtils::NewInternalError("Filter destroyed")); 28 Dart_ThrowException(DartUtils::NewInternalError("Filter destroyed"));
30 } 29 }
31 return filter; 30 return filter;
32 } 31 }
33 32
34 void EndFilter(Dart_Handle filter_obj, Filter* filter) { 33 void EndFilter(Dart_Handle filter_obj, Filter* filter) {
35 Filter::SetFilterPointerNativeField(filter_obj, NULL); 34 Filter::SetFilterPointerNativeField(filter_obj, NULL);
36 delete filter; 35 delete filter;
37 } 36 }
38 37
39 void FUNCTION_NAME(Filter_CreateZLibInflate)(Dart_NativeArguments args) { 38 void FUNCTION_NAME(Filter_CreateZLibInflate)(Dart_NativeArguments args) {
40 Dart_Handle filter_obj = Dart_GetNativeArgument(args, 0); 39 Dart_Handle filter_obj = Dart_GetNativeArgument(args, 0);
41 Filter* filter = new ZLibInflateFilter(); 40 Dart_Handle wBits_obj = Dart_GetNativeArgument(args, 1);
41 int64_t windowBits;
42 if (Dart_IsError(Dart_IntegerToInt64(wBits_obj, &windowBits))) {
43 Dart_ThrowException(DartUtils::NewInternalError(
44 "Failed to get 'windowBits' parameter"));
45 }
46 Dart_Handle raw_obj = Dart_GetNativeArgument(args, 2);
47 bool raw;
48 if (Dart_IsError(Dart_BooleanValue(raw_obj, &raw))) {
49 Dart_ThrowException(DartUtils::NewInternalError(
50 "Failed to get 'raw' parameter"));
51 }
52 Filter* filter = new ZLibInflateFilter(windowBits, raw);
42 if (filter == NULL || !filter->Init()) { 53 if (filter == NULL || !filter->Init()) {
43 delete filter; 54 delete filter;
44 Dart_ThrowException(DartUtils::NewInternalError( 55 Dart_ThrowException(DartUtils::NewInternalError(
45 "Failed to create ZLibInflateFilter")); 56 "Failed to create ZLibInflateFilter"));
46 } 57 }
47 Dart_Handle result = Filter::SetFilterPointerNativeField(filter_obj, filter); 58 Dart_Handle result = Filter::SetFilterPointerNativeField(filter_obj, filter);
48 if (Dart_IsError(result)) { 59 if (Dart_IsError(result)) {
49 delete filter; 60 delete filter;
50 Dart_PropagateError(result); 61 Dart_PropagateError(result);
51 } 62 }
52 } 63 }
53 64
54 void FUNCTION_NAME(Filter_CreateZLibDeflate)(Dart_NativeArguments args) { 65 void FUNCTION_NAME(Filter_CreateZLibDeflate)(Dart_NativeArguments args) {
55 Dart_Handle filter_obj = Dart_GetNativeArgument(args, 0); 66 Dart_Handle filter_obj = Dart_GetNativeArgument(args, 0);
56 Dart_Handle gzip_obj = Dart_GetNativeArgument(args, 1); 67 Dart_Handle gzip_obj = Dart_GetNativeArgument(args, 1);
57 Dart_Handle level_obj = Dart_GetNativeArgument(args, 2);
58 bool gzip; 68 bool gzip;
59 if (Dart_IsError(Dart_BooleanValue(gzip_obj, &gzip))) { 69 if (Dart_IsError(Dart_BooleanValue(gzip_obj, &gzip))) {
60 Dart_ThrowException(DartUtils::NewInternalError( 70 Dart_ThrowException(DartUtils::NewInternalError(
61 "Failed to get 'gzip' parameter")); 71 "Failed to get 'gzip' parameter"));
62 } 72 }
73 Dart_Handle level_obj = Dart_GetNativeArgument(args, 2);
63 int64_t level; 74 int64_t level;
64 if (Dart_IsError(Dart_IntegerToInt64(level_obj, &level))) { 75 if (Dart_IsError(Dart_IntegerToInt64(level_obj, &level))) {
65 Dart_ThrowException(DartUtils::NewInternalError( 76 Dart_ThrowException(DartUtils::NewInternalError(
66 "Failed to get 'level' parameter")); 77 "Failed to get 'level' parameter"));
67 } 78 }
68 Filter* filter = new ZLibDeflateFilter(gzip, level); 79 Dart_Handle wBits_obj = Dart_GetNativeArgument(args, 3);
80 int64_t windowBits;
81 if (Dart_IsError(Dart_IntegerToInt64(wBits_obj, &windowBits))) {
82 Dart_ThrowException(DartUtils::NewInternalError(
83 "Failed to get 'windowBits' parameter"));
84 }
85 Dart_Handle raw_obj = Dart_GetNativeArgument(args, 4);
86 bool raw;
87 if (Dart_IsError(Dart_BooleanValue(raw_obj, &raw))) {
88 Dart_ThrowException(DartUtils::NewInternalError(
89 "Failed to get 'raw' parameter"));
90 }
91 Dart_Handle mLevel_obj = Dart_GetNativeArgument(args, 5);
92 int64_t memLevel;
93 if (Dart_IsError(Dart_IntegerToInt64(mLevel_obj, &memLevel))) {
94 Dart_ThrowException(DartUtils::NewInternalError(
95 "Failed to get 'memLevel' parameter"));
96 }
97 Filter* filter = new ZLibDeflateFilter(gzip, level, windowBits, raw,
98 memLevel);
69 if (filter == NULL || !filter->Init()) { 99 if (filter == NULL || !filter->Init()) {
70 delete filter; 100 delete filter;
71 Dart_ThrowException(DartUtils::NewInternalError( 101 Dart_ThrowException(DartUtils::NewInternalError(
72 "Failed to create ZLibDeflateFilter")); 102 "Failed to create ZLibDeflateFilter"));
73 } 103 }
74 Dart_Handle result = Filter::SetFilterPointerNativeField(filter_obj, filter); 104 Dart_Handle result = Filter::SetFilterPointerNativeField(filter_obj, filter);
75 if (Dart_IsError(result)) { 105 if (Dart_IsError(result)) {
76 delete filter; 106 delete filter;
77 Dart_PropagateError(result); 107 Dart_PropagateError(result);
78 } 108 }
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
183 } 213 }
184 214
185 215
186 ZLibDeflateFilter::~ZLibDeflateFilter() { 216 ZLibDeflateFilter::~ZLibDeflateFilter() {
187 delete[] current_buffer_; 217 delete[] current_buffer_;
188 if (initialized()) deflateEnd(&stream_); 218 if (initialized()) deflateEnd(&stream_);
189 } 219 }
190 220
191 221
192 bool ZLibDeflateFilter::Init() { 222 bool ZLibDeflateFilter::Init() {
223 int windowBits = windowBits_;
224 if (raw_) {
225 windowBits *= -1;
226 } else if (gzip_) {
227 windowBits += kZLibFlagUseGZipHeader;
228 }
193 stream_.zalloc = Z_NULL; 229 stream_.zalloc = Z_NULL;
194 stream_.zfree = Z_NULL; 230 stream_.zfree = Z_NULL;
195 stream_.opaque = Z_NULL; 231 stream_.opaque = Z_NULL;
196 int result = deflateInit2( 232 int result = deflateInit2(&stream_, level_, Z_DEFLATED, windowBits, memLevel_,
197 &stream_, 233 Z_DEFAULT_STRATEGY);
198 level_,
199 Z_DEFLATED,
200 kZLibFlagWindowBits | (gzip_ ? kZLibFlagUseGZipHeader : 0),
201 kZlibFlagMemUsage,
202 Z_DEFAULT_STRATEGY);
203 if (result == Z_OK) { 234 if (result == Z_OK) {
204 set_initialized(true); 235 set_initialized(true);
205 return true; 236 return true;
206 } 237 }
207 return false; 238 return false;
208 } 239 }
209 240
210 241
211 bool ZLibDeflateFilter::Process(uint8_t* data, intptr_t length) { 242 bool ZLibDeflateFilter::Process(uint8_t* data, intptr_t length) {
212 if (current_buffer_ != NULL) return false; 243 if (current_buffer_ != NULL) return false;
(...skipping 10 matching lines...) Expand all
223 stream_.next_out = buffer; 254 stream_.next_out = buffer;
224 switch (deflate(&stream_, 255 switch (deflate(&stream_,
225 end ? Z_FINISH : flush ? Z_SYNC_FLUSH : Z_NO_FLUSH)) { 256 end ? Z_FINISH : flush ? Z_SYNC_FLUSH : Z_NO_FLUSH)) {
226 case Z_STREAM_END: 257 case Z_STREAM_END:
227 case Z_BUF_ERROR: 258 case Z_BUF_ERROR:
228 case Z_OK: { 259 case Z_OK: {
229 intptr_t processed = length - stream_.avail_out; 260 intptr_t processed = length - stream_.avail_out;
230 if (processed == 0) { 261 if (processed == 0) {
231 delete[] current_buffer_; 262 delete[] current_buffer_;
232 current_buffer_ = NULL; 263 current_buffer_ = NULL;
233 return 0;
234 } else {
235 // We processed data, should be called again.
236 return processed;
237 } 264 }
265 return processed;
238 } 266 }
239 267
240 default: 268 default:
241 case Z_STREAM_ERROR: 269 case Z_STREAM_ERROR:
242 // An error occoured. 270 // An error occurred.
243 delete[] current_buffer_; 271 delete[] current_buffer_;
244 current_buffer_ = NULL; 272 current_buffer_ = NULL;
245 return -1; 273 return -1;
246 } 274 }
247 } 275 }
248 276
249 277
250 ZLibInflateFilter::~ZLibInflateFilter() { 278 ZLibInflateFilter::~ZLibInflateFilter() {
251 delete[] current_buffer_; 279 delete[] current_buffer_;
252 if (initialized()) inflateEnd(&stream_); 280 if (initialized()) inflateEnd(&stream_);
253 } 281 }
254 282
255 283
256 bool ZLibInflateFilter::Init() { 284 bool ZLibInflateFilter::Init() {
285 int windowBits = raw_ ?
286 -1 * windowBits_ :
287 windowBits_ | kZLibFlagAcceptAnyHeader;
288
257 stream_.zalloc = Z_NULL; 289 stream_.zalloc = Z_NULL;
258 stream_.zfree = Z_NULL; 290 stream_.zfree = Z_NULL;
259 stream_.opaque = Z_NULL; 291 stream_.opaque = Z_NULL;
260 int result = inflateInit2(&stream_, 292 int result = inflateInit2(&stream_, windowBits);
261 kZLibFlagWindowBits | kZLibFlagAcceptAnyHeader);
262 if (result == Z_OK) { 293 if (result == Z_OK) {
263 set_initialized(true); 294 set_initialized(true);
264 return true; 295 return true;
265 } 296 }
266 return false; 297 return false;
267 } 298 }
268 299
269 300
270 bool ZLibInflateFilter::Process(uint8_t* data, intptr_t length) { 301 bool ZLibInflateFilter::Process(uint8_t* data, intptr_t length) {
271 if (current_buffer_ != NULL) return false; 302 if (current_buffer_ != NULL) return false;
(...skipping 11 matching lines...) Expand all
283 stream_.next_out = buffer; 314 stream_.next_out = buffer;
284 switch (inflate(&stream_, 315 switch (inflate(&stream_,
285 end ? Z_FINISH : flush ? Z_SYNC_FLUSH : Z_NO_FLUSH)) { 316 end ? Z_FINISH : flush ? Z_SYNC_FLUSH : Z_NO_FLUSH)) {
286 case Z_STREAM_END: 317 case Z_STREAM_END:
287 case Z_BUF_ERROR: 318 case Z_BUF_ERROR:
288 case Z_OK: { 319 case Z_OK: {
289 intptr_t processed = length - stream_.avail_out; 320 intptr_t processed = length - stream_.avail_out;
290 if (processed == 0) { 321 if (processed == 0) {
291 delete[] current_buffer_; 322 delete[] current_buffer_;
292 current_buffer_ = NULL; 323 current_buffer_ = NULL;
293 return 0;
294 } else {
295 // We processed data, should be called again.
296 return processed;
297 } 324 }
325 return processed;
298 } 326 }
299 327
300 default: 328 default:
301 case Z_MEM_ERROR: 329 case Z_MEM_ERROR:
302 case Z_NEED_DICT: 330 case Z_NEED_DICT:
303 case Z_DATA_ERROR: 331 case Z_DATA_ERROR:
304 case Z_STREAM_ERROR: 332 case Z_STREAM_ERROR:
305 // An error occoured. 333 // An error occoured.
306 delete[] current_buffer_; 334 delete[] current_buffer_;
307 current_buffer_ = NULL; 335 current_buffer_ = NULL;
308 return -1; 336 return -1;
309 } 337 }
310 } 338 }
311 339
312 } // namespace bin 340 } // namespace bin
313 } // namespace dart 341 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698