nsSMILValue
nsSVGTransformSMILAttr::GetBaseValue() const
{
  // To benefit from Return Value Optimization and avoid copy constructor calls
  // due to our use of return-by-value, we must return the exact same object
  // from ALL return points. This function must only return THIS variable:
  nsSMILValue val(&nsSVGTransformSMILType::sSingleton);

  nsIDOMSVGTransformList *list = mVal->mBaseVal.get();

  PRUint32 numItems = 0;
  list->GetNumberOfItems(&numItems);
  for (PRUint32 i = 0; i < numItems; i++) {
    nsCOMPtr<nsIDOMSVGTransform> transform;
    nsresult rv = list->GetItem(i, getter_AddRefs(transform));
    if (NS_SUCCEEDED(rv) && transform) {
      rv = AppendSVGTransformToSMILValue(transform.get(), val);
      if (NS_FAILED(rv)) {   // Appending to |val| failed (OOM?)
        val = nsSMILValue();
        break;
      }
    }
  }

  return val;
}
nsSMILValue
nsSVGTransformSMILAttr::GetBaseValue() const
{
  nsSMILValue val(&nsSVGTransformSMILType::sSingleton);
  if (val.IsNull())
    return val; // Initialization failed

  nsIDOMSVGTransformList *list = mVal->mBaseVal.get();

  PRUint32 numItems = 0;
  list->GetNumberOfItems(&numItems);
  for (PRUint32 i = 0; i < numItems; i++) {
    nsCOMPtr<nsIDOMSVGTransform> transform;
    nsresult rv = list->GetItem(i, getter_AddRefs(transform));
    if (NS_SUCCEEDED(rv) && transform) {
      rv = AppendSVGTransformToSMILValue(transform.get(), val);
      NS_ENSURE_SUCCESS(rv, nsSMILValue());
    }
  }

  return val;
}