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

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

Issue 12812006: Avoid massive stack frames by allocating 64k buffers in the heap. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Allocate buffer as part of filter and fix code style Created 7 years, 9 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
« no previous file with comments | « runtime/bin/filter.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 const int kZlibFlagMemUsage = 8; 11 const int kZlibFlagMemUsage = 8;
12 const int kZLibFlagWindowBits = 15; 12 const int kZLibFlagWindowBits = 15;
13 const int kZLibFlagUseGZipHeader = 16; 13 const int kZLibFlagUseGZipHeader = 16;
14 const int kZLibFlagAcceptAnyHeader = 32; 14 const int kZLibFlagAcceptAnyHeader = 32;
15 15
16 const intptr_t kFilterBufferLength = 64 * KB;
17
18 static const int kFilterPointerNativeField = 0; 16 static const int kFilterPointerNativeField = 0;
19 17
20 Filter* GetFilter(Dart_Handle filter_obj) { 18 Filter* GetFilter(Dart_Handle filter_obj) {
21 Filter* filter; 19 Filter* filter;
22 Dart_Handle result = Filter::GetFilterPointerNativeField(filter_obj, &filter); 20 Dart_Handle result = Filter::GetFilterPointerNativeField(filter_obj, &filter);
23 if (Dart_IsError(result)) { 21 if (Dart_IsError(result)) {
24 Dart_PropagateError(result); 22 Dart_PropagateError(result);
25 } 23 }
26 if (filter == NULL) { 24 if (filter == NULL) {
27 Dart_ThrowException(DartUtils::NewInternalError("Filter destroyed")); 25 Dart_ThrowException(DartUtils::NewInternalError("Filter destroyed"));
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
126 void FUNCTION_NAME(Filter_Processed)(Dart_NativeArguments args) { 124 void FUNCTION_NAME(Filter_Processed)(Dart_NativeArguments args) {
127 Dart_EnterScope(); 125 Dart_EnterScope();
128 Dart_Handle filter_obj = Dart_GetNativeArgument(args, 0); 126 Dart_Handle filter_obj = Dart_GetNativeArgument(args, 0);
129 Filter* filter = GetFilter(filter_obj); 127 Filter* filter = GetFilter(filter_obj);
130 Dart_Handle flush_obj = Dart_GetNativeArgument(args, 1); 128 Dart_Handle flush_obj = Dart_GetNativeArgument(args, 1);
131 bool flush; 129 bool flush;
132 if (Dart_IsError(Dart_BooleanValue(flush_obj, &flush))) { 130 if (Dart_IsError(Dart_BooleanValue(flush_obj, &flush))) {
133 Dart_ThrowException(DartUtils::NewInternalError( 131 Dart_ThrowException(DartUtils::NewInternalError(
134 "Failed to get 'flush' parameter")); 132 "Failed to get 'flush' parameter"));
135 } 133 }
136 uint8_t buffer[kFilterBufferLength]; 134 intptr_t read = filter->Processed(filter->processed_buffer(),
137 intptr_t read = filter->Processed(buffer, kFilterBufferLength, flush); 135 filter->processed_buffer_size(),
136 flush);
138 if (read < 0) { 137 if (read < 0) {
139 // Error, end filter. 138 // Error, end filter.
140 EndFilter(filter_obj, filter); 139 EndFilter(filter_obj, filter);
141 Dart_ThrowException(DartUtils::NewInternalError( 140 Dart_ThrowException(DartUtils::NewInternalError(
142 "Filter error, bad data")); 141 "Filter error, bad data"));
143 } else if (read == 0) { 142 } else if (read == 0) {
144 Dart_SetReturnValue(args, Dart_Null()); 143 Dart_SetReturnValue(args, Dart_Null());
145 } else { 144 } else {
146 uint8_t* io_buffer; 145 uint8_t* io_buffer;
147 Dart_Handle result = IOBuffer::Allocate(read, &io_buffer); 146 Dart_Handle result = IOBuffer::Allocate(read, &io_buffer);
148 memmove(io_buffer, buffer, read); 147 memmove(io_buffer, filter->processed_buffer(), read);
149 Dart_SetReturnValue(args, result); 148 Dart_SetReturnValue(args, result);
150 } 149 }
151 Dart_ExitScope(); 150 Dart_ExitScope();
152 } 151 }
153 152
154 153
155 void FUNCTION_NAME(Filter_End)(Dart_NativeArguments args) { 154 void FUNCTION_NAME(Filter_End)(Dart_NativeArguments args) {
156 Dart_EnterScope(); 155 Dart_EnterScope();
157 Dart_Handle filter_obj = Dart_GetNativeArgument(args, 0); 156 Dart_Handle filter_obj = Dart_GetNativeArgument(args, 0);
158 Filter* filter = GetFilter(filter_obj); 157 Filter* filter = GetFilter(filter_obj);
(...skipping 13 matching lines...) Expand all
172 Dart_Handle Filter::GetFilterPointerNativeField(Dart_Handle filter, 171 Dart_Handle Filter::GetFilterPointerNativeField(Dart_Handle filter,
173 Filter** filter_pointer) { 172 Filter** filter_pointer) {
174 return Dart_GetNativeInstanceField( 173 return Dart_GetNativeInstanceField(
175 filter, 174 filter,
176 kFilterPointerNativeField, 175 kFilterPointerNativeField,
177 reinterpret_cast<intptr_t*>(filter_pointer)); 176 reinterpret_cast<intptr_t*>(filter_pointer));
178 } 177 }
179 178
180 179
181 ZLibDeflateFilter::~ZLibDeflateFilter() { 180 ZLibDeflateFilter::~ZLibDeflateFilter() {
182 delete[] current_buffer; 181 delete[] current_buffer_;
183 if (initialized) deflateEnd(&stream); 182 if (initialized()) deflateEnd(&stream_);
184 } 183 }
185 184
186 185
187 bool ZLibDeflateFilter::Init() { 186 bool ZLibDeflateFilter::Init() {
188 stream.zalloc = Z_NULL; 187 stream_.zalloc = Z_NULL;
189 stream.zfree = Z_NULL; 188 stream_.zfree = Z_NULL;
190 stream.opaque = Z_NULL; 189 stream_.opaque = Z_NULL;
191 int result = deflateInit2( 190 int result = deflateInit2(
192 &stream, 191 &stream_,
193 level, 192 level_,
194 Z_DEFLATED, 193 Z_DEFLATED,
195 kZLibFlagWindowBits | (gZip ? kZLibFlagUseGZipHeader : 0), 194 kZLibFlagWindowBits | (gzip_ ? kZLibFlagUseGZipHeader : 0),
196 kZlibFlagMemUsage, 195 kZlibFlagMemUsage,
197 Z_DEFAULT_STRATEGY); 196 Z_DEFAULT_STRATEGY);
198 if (result == Z_OK) { 197 if (result == Z_OK) {
199 initialized = true; 198 set_initialized(true);
200 return true; 199 return true;
201 } 200 }
202 return false; 201 return false;
203 } 202 }
204 203
205 204
206 bool ZLibDeflateFilter::Process(uint8_t* data, intptr_t length) { 205 bool ZLibDeflateFilter::Process(uint8_t* data, intptr_t length) {
207 if (current_buffer != NULL) return false; 206 if (current_buffer_ != NULL) return false;
208 stream.avail_in = length; 207 stream_.avail_in = length;
209 stream.next_in = current_buffer = data; 208 stream_.next_in = current_buffer_ = data;
210 return true; 209 return true;
211 } 210 }
212 211
213 intptr_t ZLibDeflateFilter::Processed(uint8_t* buffer, 212 intptr_t ZLibDeflateFilter::Processed(uint8_t* buffer,
214 intptr_t length, 213 intptr_t length,
215 bool flush) { 214 bool flush) {
216 stream.avail_out = length; 215 stream_.avail_out = length;
217 stream.next_out = buffer; 216 stream_.next_out = buffer;
218 switch (deflate(&stream, flush ? Z_SYNC_FLUSH : Z_NO_FLUSH)) { 217 switch (deflate(&stream_, flush ? Z_SYNC_FLUSH : Z_NO_FLUSH)) {
219 case Z_OK: { 218 case Z_OK: {
220 intptr_t processed = length - stream.avail_out; 219 intptr_t processed = length - stream_.avail_out;
221 if (processed == 0) { 220 if (processed == 0) {
222 delete[] current_buffer; 221 delete[] current_buffer_;
223 current_buffer = NULL; 222 current_buffer_ = NULL;
224 return 0; 223 return 0;
225 } else { 224 } else {
226 // We processed data, should be called again. 225 // We processed data, should be called again.
227 return processed; 226 return processed;
228 } 227 }
229 } 228 }
230 229
231 case Z_STREAM_END: 230 case Z_STREAM_END:
232 case Z_BUF_ERROR: 231 case Z_BUF_ERROR:
233 // We processed all available input data. 232 // We processed all available input data.
234 delete[] current_buffer; 233 delete[] current_buffer_;
235 current_buffer = NULL; 234 current_buffer_ = NULL;
236 return 0; 235 return 0;
237 236
238 default: 237 default:
239 case Z_STREAM_ERROR: 238 case Z_STREAM_ERROR:
240 // An error occoured. 239 // An error occoured.
241 delete[] current_buffer; 240 delete[] current_buffer_;
242 current_buffer = NULL; 241 current_buffer_ = NULL;
243 return -1; 242 return -1;
244 } 243 }
245 } 244 }
246 245
247 246
248 ZLibInflateFilter::~ZLibInflateFilter() { 247 ZLibInflateFilter::~ZLibInflateFilter() {
249 delete[] current_buffer; 248 delete[] current_buffer_;
250 if (initialized) inflateEnd(&stream); 249 if (initialized()) inflateEnd(&stream_);
251 } 250 }
252 251
253 252
254 bool ZLibInflateFilter::Init() { 253 bool ZLibInflateFilter::Init() {
255 stream.zalloc = Z_NULL; 254 stream_.zalloc = Z_NULL;
256 stream.zfree = Z_NULL; 255 stream_.zfree = Z_NULL;
257 stream.opaque = Z_NULL; 256 stream_.opaque = Z_NULL;
258 int result = inflateInit2(&stream, 257 int result = inflateInit2(&stream_,
259 kZLibFlagWindowBits | kZLibFlagAcceptAnyHeader); 258 kZLibFlagWindowBits | kZLibFlagAcceptAnyHeader);
260 if (result == Z_OK) { 259 if (result == Z_OK) {
261 initialized = true; 260 set_initialized(true);
262 return true; 261 return true;
263 } 262 }
264 return false; 263 return false;
265 } 264 }
266 265
267 266
268 bool ZLibInflateFilter::Process(uint8_t* data, intptr_t length) { 267 bool ZLibInflateFilter::Process(uint8_t* data, intptr_t length) {
269 if (current_buffer != NULL) return false; 268 if (current_buffer_ != NULL) return false;
270 stream.avail_in = length; 269 stream_.avail_in = length;
271 stream.next_in = current_buffer = data; 270 stream_.next_in = current_buffer_ = data;
272 return true; 271 return true;
273 } 272 }
274 273
275 274
276 intptr_t ZLibInflateFilter::Processed(uint8_t* buffer, 275 intptr_t ZLibInflateFilter::Processed(uint8_t* buffer,
277 intptr_t length, 276 intptr_t length,
278 bool flush) { 277 bool flush) {
279 stream.avail_out = length; 278 stream_.avail_out = length;
280 stream.next_out = buffer; 279 stream_.next_out = buffer;
281 switch (inflate(&stream, flush ? Z_SYNC_FLUSH : Z_NO_FLUSH)) { 280 switch (inflate(&stream_, flush ? Z_SYNC_FLUSH : Z_NO_FLUSH)) {
282 case Z_OK: { 281 case Z_OK: {
283 intptr_t processed = length - stream.avail_out; 282 intptr_t processed = length - stream_.avail_out;
284 if (processed == 0) { 283 if (processed == 0) {
285 delete[] current_buffer; 284 delete[] current_buffer_;
286 current_buffer = NULL; 285 current_buffer_ = NULL;
287 return 0; 286 return 0;
288 } else { 287 } else {
289 // We processed data, should be called again. 288 // We processed data, should be called again.
290 return processed; 289 return processed;
291 } 290 }
292 } 291 }
293 292
294 case Z_STREAM_END: 293 case Z_STREAM_END:
295 case Z_BUF_ERROR: 294 case Z_BUF_ERROR:
296 // We processed all available input data. 295 // We processed all available input data.
297 delete[] current_buffer; 296 delete[] current_buffer_;
298 current_buffer = NULL; 297 current_buffer_ = NULL;
299 return 0; 298 return 0;
300 299
301 default: 300 default:
302 case Z_MEM_ERROR: 301 case Z_MEM_ERROR:
303 case Z_NEED_DICT: 302 case Z_NEED_DICT:
304 case Z_DATA_ERROR: 303 case Z_DATA_ERROR:
305 case Z_STREAM_ERROR: 304 case Z_STREAM_ERROR:
306 // An error occoured. 305 // An error occoured.
307 delete[] current_buffer; 306 delete[] current_buffer_;
308 current_buffer = NULL; 307 current_buffer_ = NULL;
309 return -1; 308 return -1;
310 } 309 }
311 } 310 }
312 311
OLDNEW
« no previous file with comments | « runtime/bin/filter.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698