| Index: src/core/SkValue.cpp
 | 
| diff --git a/src/core/SkValue.cpp b/src/core/SkValue.cpp
 | 
| index 8f58dd6ef9a0da4b12a0afa5a6464c54a4fb77ee..787cdf58df8f01c89b06bd47105a7aec01e80fa2 100644
 | 
| --- a/src/core/SkValue.cpp
 | 
| +++ b/src/core/SkValue.cpp
 | 
| @@ -135,6 +135,11 @@ void SkValue::set(SkValue::Key k, SkValue v) {
 | 
|      fObject->set(k, std::move(v));
 | 
|  }
 | 
|  
 | 
| +const SkValue* SkValue::get(Key k) const {
 | 
| +    SkASSERT(this->isObject());
 | 
| +    return fObject->get(k);
 | 
| +}
 | 
| +
 | 
|  void SkValue::foreach(std::function<void(Key, const SkValue&)> fn) const {
 | 
|      SkASSERT(this->isObject());
 | 
|      fObject->foreach(fn);
 | 
| @@ -182,6 +187,8 @@ SkValue SkValue::FromF32s(SkData* d) { return FromTs<   float>(F32s, d); }
 | 
|  
 | 
|  ////////////////////////////////////////////////////////////////////////////////
 | 
|  
 | 
| +#define REQUIRE(cond) do { if (!(cond)) { SkASSERT(false); return false; } } while (false)
 | 
| +
 | 
|  template<> SkValue SkToValue<SkMatrix>(const SkMatrix& mat) {
 | 
|      auto val = SkValue::Object(SkValue::Matrix);
 | 
|      for (int i = 0; i < 9; ++i) {
 | 
| @@ -192,26 +199,22 @@ template<> SkValue SkToValue<SkMatrix>(const SkMatrix& mat) {
 | 
|      return val;
 | 
|  }
 | 
|  
 | 
| +template<> bool SkFromValue<float>(const SkValue& val, float* f) {
 | 
| +    REQUIRE(val.type() == SkValue::F32);
 | 
| +    *f = val.f32();
 | 
| +    return true;
 | 
| +}
 | 
| +
 | 
|  template<> bool SkFromValue<SkMatrix>(const SkValue& val, SkMatrix* m){
 | 
| -    SkASSERT(val.type() == SkValue::Matrix);
 | 
| -    if (val.type() != SkValue::Matrix) {
 | 
| -        return false;
 | 
| -    }
 | 
| +    REQUIRE(val.type() == SkValue::Matrix);
 | 
| +
 | 
|      *m = SkMatrix::I();
 | 
| -    bool good = true;
 | 
| -    auto fn = [&](SkValue::Key key, const SkValue& v) {
 | 
| -        if (key < 9) {
 | 
| -            if (v.type() != SkValue::F32) {
 | 
| -                SkASSERT(false);
 | 
| -                good = false;
 | 
| -            } else {
 | 
| -                (*m)[key] = v.f32();
 | 
| -            }
 | 
| -        } else {
 | 
| -            SkASSERT(false);
 | 
| -            good = false;
 | 
| +    for (int i = 0; i < 9; i++) {
 | 
| +        if (auto v = val.get(i)) {
 | 
| +            REQUIRE(SkFromValue(*v, &(*m)[i]));
 | 
|          }
 | 
| -    };
 | 
| -    val.foreach(fn);
 | 
| -    return good;
 | 
| +    }
 | 
| +    return true;
 | 
|  }
 | 
| +
 | 
| +#undef REQUIRE
 | 
| 
 |