12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/shared_impl/array_var.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <limits> 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/logging.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/ref_counted.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/shared_impl/ppapi_globals.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/shared_impl/var_tracker.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace ppapi { 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ArrayVar::ArrayVar() { 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ArrayVar::~ArrayVar() { 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ArrayVar* ArrayVar::FromPPVar(const PP_Var& var) { 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (var.type != PP_VARTYPE_ARRAY) 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<Var> var_object( 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PpapiGlobals::Get()->GetVarTracker()->GetVar(var)); 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!var_object.get()) 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return var_object->AsArrayVar(); 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ArrayVar* ArrayVar::AsArrayVar() { 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return this; 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PP_VarType ArrayVar::GetType() const { 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_VARTYPE_ARRAY; 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PP_Var ArrayVar::Get(uint32_t index) const { 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (index >= elements_.size()) 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_MakeUndefined(); 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const PP_Var& element = elements_[index].get(); 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (PpapiGlobals::Get()->GetVarTracker()->AddRefVar(element)) 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return element; 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_MakeUndefined(); 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PP_Bool ArrayVar::Set(uint32_t index, const PP_Var& value) { 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (index == std::numeric_limits<uint32_t>::max()) 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_FALSE; 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (index >= elements_.size()) { 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Insert ScopedPPVars of type PP_VARTYPE_UNDEFINED to reach the new size 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // (index + 1). 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elements_.resize(index + 1); 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elements_[index] = value; 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_TRUE; 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)uint32_t ArrayVar::GetLength() const { 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (elements_.size() > std::numeric_limits<uint32_t>::max()) { 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(false); 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 0; 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return static_cast<uint32_t>(elements_.size()); 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PP_Bool ArrayVar::SetLength(uint32_t length) { 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If |length| is larger than the current size, ScopedPPVars of type 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // PP_VARTYPE_UNDEFINED will be inserted to reach the new length. 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elements_.resize(length); 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_TRUE; 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace ppapi 84