/* This file is part of jpcsp. Jpcsp is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Jpcsp is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Jpcsp. If not, see <http://www.gnu.org/licenses/>. */ package jpcsp.format.rco.vsmx.interpreter; import jpcsp.format.rco.vsmx.INativeFunction; import jpcsp.format.rco.vsmx.objects.NativeFunctionFactory; public class VSMXReference extends VSMXBaseObject { private VSMXObject refObject; private String refProperty; private int refIndex; public VSMXReference(VSMXInterpreter interpreter, VSMXObject refObject, String refProperty) { super(interpreter); this.refObject = refObject; this.refProperty = refProperty; } public VSMXReference(VSMXInterpreter interpreter, VSMXObject refObject, int refIndex) { super(interpreter); this.refObject = refObject; this.refIndex = refIndex; } public void assign(VSMXBaseObject value) { if (refProperty == null) { refObject.setPropertyValue(refIndex, value.getValue()); } else { refObject.setPropertyValue(refProperty, value.getValue()); } } public String getRefProperty() { if (refProperty == null) { return Integer.toString(refIndex); } return refProperty; } protected VSMXBaseObject getRef() { return getRef(0); } protected VSMXBaseObject getRef(int numberOfArguments) { if (refProperty == null) { return refObject.getPropertyValue(refIndex); } if (!refObject.hasPropertyValue(refProperty) && refObject instanceof VSMXNativeObject) { VSMXNativeObject nativeObject = (VSMXNativeObject) refObject; INativeFunction nativeFunction = NativeFunctionFactory.getInstance().getNativeFunction(nativeObject, refProperty, numberOfArguments); if (nativeFunction != null) { return new VSMXNativeFunction(interpreter, nativeFunction); } } return refObject.getPropertyValue(refProperty); } @Override public VSMXBaseObject getValue() { return getRef(); } @Override public VSMXBaseObject getValueWithArguments(int numberOfArguments) { return getRef(numberOfArguments); } @Override public float getFloatValue() { return getRef().getFloatValue(); } @Override public int getIntValue() { return getRef().getIntValue(); } @Override public boolean getBooleanValue() { return getRef().getBooleanValue(); } @Override public String getStringValue() { return getRef().getStringValue(); } @Override public boolean equals(VSMXBaseObject value) { return getRef().equals(value); } @Override public VSMXBaseObject getPropertyValue(String name) { return getRef().getPropertyValue(name); } @Override public void setPropertyValue(String name, VSMXBaseObject value) { getRef().setPropertyValue(name, value); } @Override public void deletePropertyValue(String name) { getRef().deletePropertyValue(name); } @Override public void setFloatValue(float value) { getRef().setFloatValue(value); } @Override public String typeOf() { return getRef().typeOf(); } @Override public String getClassName() { return getRef().getClassName(); } @Override public String toString() { if (refProperty == null) { return String.format("@OBJ[%d]=%s", refIndex, getRef()); } return String.format("@OBJ.%s=%s", refProperty, getRef()); } }