// Copyright (c) 2009 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. package org.chromium.debug.core.model; import java.util.Collections; import java.util.Set; import java.util.concurrent.atomic.AtomicReference; import org.chromium.sdk.JsArray; import org.eclipse.debug.core.DebugException; import org.eclipse.debug.core.model.IIndexedValue; import org.eclipse.debug.core.model.IVariable; /** * An IIndexedValue implementation for an array element range using a JsArray * instance. */ public class ArrayValue extends Value implements IIndexedValue { private final AtomicReference<IVariable[]> elementsRef = new AtomicReference<IVariable[]>(null); public ArrayValue(EvaluateContext evaluateContext, JsArray array, ValueBase.ValueAsHostObject hostObject) { super(evaluateContext, array, hostObject); } private IVariable[] createElements() { JsArray jsArray = (JsArray) getJsValue(); return StackFrame.wrapVariables(getEvaluateContext(), jsArray.getProperties(), ARRAY_HIDDEN_PROPERTY_NAMES, // Do not show internal properties for arrays (this may be an option). null, getHostObject(), null); } private IVariable[] getElements() { IVariable[] result = elementsRef.get(); if (result == null) { result = createElements(); elementsRef.compareAndSet(null, result); return elementsRef.get(); } else { return result; } } public int getInitialOffset() { return 0; } public int getSize() throws DebugException { return getElements().length; } public IVariable getVariable(int offset) throws DebugException { return getElements()[offset]; } public IVariable[] getVariables(int offset, int length) throws DebugException { IVariable[] result = new IVariable[length]; System.arraycopy(getElements(), offset, result, 0, length); return result; } @Override public IVariable[] getVariables() throws DebugException { return getElements(); } @Override public boolean hasVariables() throws DebugException { return getElements().length > 0; } private static final Set<String> ARRAY_HIDDEN_PROPERTY_NAMES = Collections.singleton("length"); }