Chromium Code Reviews| Index: ppapi/shared_impl/array_var.cc |
| diff --git a/ppapi/shared_impl/array_var.cc b/ppapi/shared_impl/array_var.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..9d8e779d96ae7353ee9dcf24e0e8cd9cf12b79db |
| --- /dev/null |
| +++ b/ppapi/shared_impl/array_var.cc |
| @@ -0,0 +1,81 @@ |
| +// Copyright (c) 2013 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/array_var.h" |
| + |
| +#include <limits> |
| + |
| +#include "base/logging.h" |
| +#include "base/memory/ref_counted.h" |
| +#include "ppapi/shared_impl/ppapi_globals.h" |
| +#include "ppapi/shared_impl/var_tracker.h" |
| + |
| +namespace ppapi { |
| + |
| +ArrayVar::ArrayVar() { |
| +} |
| + |
| +ArrayVar::~ArrayVar() { |
| +} |
| + |
| +// static |
| +ArrayVar* ArrayVar::FromPPVar(const PP_Var& var) { |
| + if (var.type != PP_VARTYPE_ARRAY) |
| + return NULL; |
| + |
| + scoped_refptr<Var> var_object( |
| + PpapiGlobals::Get()->GetVarTracker()->GetVar(var)); |
| + if (!var_object.get()) |
| + return NULL; |
| + return var_object->AsArrayVar(); |
| +} |
| + |
| +ArrayVar* ArrayVar::AsArrayVar() { |
| + return this; |
| +} |
| + |
| +PP_VarType ArrayVar::GetType() const { |
| + return PP_VARTYPE_ARRAY; |
| +} |
| + |
| +PP_Var ArrayVar::Get(uint32_t index) const { |
| + if (index >= elements_.size()) |
| + return PP_MakeUndefined(); |
| + |
| + const PP_Var& element = elements_[index].get(); |
| + PpapiGlobals::Get()->GetVarTracker()->AddRefVar(element); |
| + return element; |
| +} |
| + |
| +PP_Bool ArrayVar::Set(uint32_t index, const PP_Var& value) { |
| + if (index == std::numeric_limits<uint32_t>::max()) |
| + return PP_FALSE; |
| + |
| + if (index >= elements_.size()) { |
| + // Insert ScopedPPVars of type PP_VARTYPE_UNDEFINED to reach the new size |
| + // (index + 1). |
| + elements_.resize(index + 1); |
| + } |
| + |
| + elements_[index] = value; |
| + return PP_TRUE; |
| +} |
| + |
| +uint32_t ArrayVar::GetLength() const { |
| + if (elements_.size() > std::numeric_limits<uint32_t>::max()) { |
| + CHECK(false); |
| + return 0; |
| + } |
| + |
| + return static_cast<uint32_t>(elements_.size()); |
| +} |
| + |
| +PP_Bool ArrayVar::SetLength(uint32_t length) { |
| + // If |length| is larger than the current size, ScopedPPVars of type |
| + // PP_VARTYPE_UNDEFINED will be inserted to reach the new length. |
| + elements_.resize(length); |
|
raymes
2013/03/18 20:41:09
Probably need to add the check here too.
yzshen1
2013/03/18 20:50:42
Because the input type is uint32_t already, I thou
|
| + return PP_TRUE; |
| +} |
| + |
| +} // namespace ppapi |