| Index: sdk/lib/io/common.dart
 | 
| diff --git a/sdk/lib/io/common.dart b/sdk/lib/io/common.dart
 | 
| index 31ce72b6c9232096c18104b1a907dc6bc4204972..ba5f07d9908b39f1ef811a97624ec53c3b1ac38d 100644
 | 
| --- a/sdk/lib/io/common.dart
 | 
| +++ b/sdk/lib/io/common.dart
 | 
| @@ -100,7 +100,7 @@ class _BufferAndStart {
 | 
|  // Only builtin Lists can be serialized through. If user-defined Lists
 | 
|  // get here, the contents is copied to a Uint8List. This has the added
 | 
|  // benefit that it is faster to access from the C code as well.
 | 
| -_BufferAndStart _ensureFastAndSerializableBuffer(
 | 
| +_BufferAndStart _ensureFastAndSerializableData(
 | 
|      List buffer, int start, int end) {
 | 
|    if (buffer is Uint8List ||
 | 
|        buffer is Int8List ||
 | 
| @@ -131,6 +131,28 @@ _BufferAndStart _ensureFastAndSerializableBuffer(
 | 
|  }
 | 
|  
 | 
|  
 | 
| +_BufferAndStart _ensureFastAndSerializableByteData(
 | 
| +    List buffer, int start, int end) {
 | 
| +  if (buffer is Uint8List) {
 | 
| +    return new _BufferAndStart(buffer, start);
 | 
| +  }
 | 
| +  int length = end - start;
 | 
| +  var newBuffer = new Uint8List(length);
 | 
| +  int j = start;
 | 
| +  for (int i = 0; i < length; i++) {
 | 
| +    int value = buffer[j];
 | 
| +    if (value is! int ||
 | 
| +        value < 0 || 255 < value) {
 | 
| +      throw new ArgumentError(
 | 
| +          "List element is not a byte value (value $value at index $j)");
 | 
| +    }
 | 
| +    newBuffer[i] = value;
 | 
| +    j++;
 | 
| +  }
 | 
| +  return new _BufferAndStart(newBuffer, 0);
 | 
| +}
 | 
| +
 | 
| +
 | 
|  // TODO(ager): The only reason for the class here is that
 | 
|  // we cannot patch a top-level function.
 | 
|  class _BufferUtils {
 | 
| 
 |