| Index: src/ports/SkMemory_malloc.cpp
 | 
| diff --git a/src/ports/SkMemory_malloc.cpp b/src/ports/SkMemory_malloc.cpp
 | 
| index 73b56079a619e9db7f9dd012ab1328c2067df8f3..6db65a8524524831aaf3402ea9e49cec4e75051c 100644
 | 
| --- a/src/ports/SkMemory_malloc.cpp
 | 
| +++ b/src/ports/SkMemory_malloc.cpp
 | 
| @@ -9,6 +9,14 @@
 | 
|  #include <stdio.h>
 | 
|  #include <stdlib.h>
 | 
|  
 | 
| +static inline void* throwOnFailure(size_t size, void* p) {
 | 
| +    if (size > 0 && p == NULL) {
 | 
| +        // If we've got a NULL here, the only reason we should have failed is running out of RAM.
 | 
| +        sk_out_of_memory();
 | 
| +    }
 | 
| +    return p;
 | 
| +}
 | 
| +
 | 
|  void sk_throw() {
 | 
|      SkDEBUGFAIL("sk_throw");
 | 
|      abort();
 | 
| @@ -24,14 +32,7 @@ void* sk_malloc_throw(size_t size) {
 | 
|  }
 | 
|  
 | 
|  void* sk_realloc_throw(void* addr, size_t size) {
 | 
| -    void* p = realloc(addr, size);
 | 
| -    if (size == 0) {
 | 
| -        return p;
 | 
| -    }
 | 
| -    if (p == NULL) {
 | 
| -        sk_throw();
 | 
| -    }
 | 
| -    return p;
 | 
| +    return throwOnFailure(size, realloc(addr, size));
 | 
|  }
 | 
|  
 | 
|  void sk_free(void* p) {
 | 
| @@ -42,10 +43,17 @@ void sk_free(void* p) {
 | 
|  
 | 
|  void* sk_malloc_flags(size_t size, unsigned flags) {
 | 
|      void* p = malloc(size);
 | 
| -    if (p == NULL) {
 | 
| -        if (flags & SK_MALLOC_THROW) {
 | 
| -            sk_throw();
 | 
| -        }
 | 
| +    if (flags & SK_MALLOC_THROW) {
 | 
| +        return throwOnFailure(size, p);
 | 
| +    } else {
 | 
| +        return p;
 | 
|      }
 | 
| -    return p;
 | 
| +}
 | 
| +
 | 
| +void* sk_calloc(size_t size) {
 | 
| +    return calloc(size, 1);
 | 
| +}
 | 
| +
 | 
| +void* sk_calloc_throw(size_t size) {
 | 
| +    return throwOnFailure(size, sk_calloc(size));
 | 
|  }
 | 
| 
 |