|  | // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "ppapi/shared_impl/scoped_pp_var.h" | 
|  |  | 
|  | #include <stdint.h> | 
|  |  | 
|  | #include "ppapi/c/dev/ppb_memory_dev.h" | 
|  | #include "ppapi/shared_impl/ppapi_globals.h" | 
|  | #include "ppapi/shared_impl/var_tracker.h" | 
|  | #include "ppapi/thunk/thunk.h" | 
|  |  | 
|  | namespace ppapi { | 
|  |  | 
|  | namespace { | 
|  |  | 
|  | void CallAddRef(const PP_Var& v) { | 
|  | PpapiGlobals::Get()->GetVarTracker()->AddRefVar(v); | 
|  | } | 
|  |  | 
|  | void CallRelease(const PP_Var& v) { | 
|  | PpapiGlobals::Get()->GetVarTracker()->ReleaseVar(v); | 
|  | } | 
|  |  | 
|  | }  // namespace | 
|  |  | 
|  | ScopedPPVar::ScopedPPVar() : var_(PP_MakeUndefined()) {} | 
|  |  | 
|  | ScopedPPVar::ScopedPPVar(const PP_Var& v) : var_(v) { CallAddRef(var_); } | 
|  |  | 
|  | ScopedPPVar::ScopedPPVar(const PassRef&, const PP_Var& v) : var_(v) {} | 
|  |  | 
|  | ScopedPPVar::ScopedPPVar(const ScopedPPVar& other) : var_(other.var_) { | 
|  | CallAddRef(var_); | 
|  | } | 
|  |  | 
|  | ScopedPPVar::~ScopedPPVar() { CallRelease(var_); } | 
|  |  | 
|  | ScopedPPVar& ScopedPPVar::operator=(const PP_Var& v) { | 
|  | CallAddRef(v); | 
|  | CallRelease(var_); | 
|  | var_ = v; | 
|  | return *this; | 
|  | } | 
|  |  | 
|  | PP_Var ScopedPPVar::Release() { | 
|  | PP_Var result = var_; | 
|  | var_ = PP_MakeUndefined(); | 
|  | return result; | 
|  | } | 
|  |  | 
|  | ScopedPPVarArray::ScopedPPVarArray(const PassPPBMemoryAllocatedArray&, | 
|  | PP_Var* array, | 
|  | size_t size) | 
|  | : array_(array), | 
|  | size_(size) {} | 
|  |  | 
|  | ScopedPPVarArray::ScopedPPVarArray(size_t size) | 
|  | : size_(size) { | 
|  | if (size > 0) { | 
|  | array_ = static_cast<PP_Var*>( | 
|  | thunk::GetPPB_Memory_Dev_0_1_Thunk()->MemAlloc( | 
|  | static_cast<uint32_t>(sizeof(PP_Var) * size))); | 
|  | } | 
|  | for (size_t i = 0; i < size_; ++i) | 
|  | array_[i] = PP_MakeUndefined(); | 
|  | } | 
|  |  | 
|  | ScopedPPVarArray::~ScopedPPVarArray() { | 
|  | for (size_t i = 0; i < size_; ++i) | 
|  | CallRelease(array_[i]); | 
|  | if (size_ > 0) | 
|  | thunk::GetPPB_Memory_Dev_0_1_Thunk()->MemFree(array_); | 
|  |  | 
|  | } | 
|  |  | 
|  | PP_Var* ScopedPPVarArray::Release(const PassPPBMemoryAllocatedArray&) { | 
|  | PP_Var* result = array_; | 
|  | array_ = NULL; | 
|  | size_ = 0; | 
|  | return result; | 
|  | } | 
|  |  | 
|  | void ScopedPPVarArray::Set(size_t index, const ScopedPPVar& var) { | 
|  | DCHECK(index < size_); | 
|  | CallAddRef(var.get()); | 
|  | CallRelease(array_[index]); | 
|  | array_[index] = var.get(); | 
|  | } | 
|  |  | 
|  | }  // namespace ppapi |