org.python.modules.jffi.StringCData Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jython-slim Show documentation
Show all versions of jython-slim Show documentation
Jython is an implementation of the high-level, dynamic, object-oriented
language Python written in 100% Pure Java, and seamlessly integrated with
the Java platform. It thus allows you to run Python on any Java platform.
package org.python.modules.jffi;
import org.python.core.Py;
import org.python.core.PyNewWrapper;
import org.python.core.PyObject;
import org.python.core.PyType;
import org.python.expose.ExposedClassMethod;
import org.python.expose.ExposedGet;
import org.python.expose.ExposedNew;
import org.python.expose.ExposedSet;
import org.python.expose.ExposedType;
@ExposedType(name = "jffi.StringCData", base = CData.class)
public class StringCData extends AbstractMemoryCData {
public static final PyType TYPE = PyType.fromClass(StringCData.class);
public StringCData(PyType pytype, CType ctype, DirectMemory m) {
super(pytype, ctype, m);
}
@ExposedNew
public static PyObject StringCData_new(PyNewWrapper new_, boolean init, PyType subtype,
PyObject[] args, String[] keywords) {
// No args == create NULL pointer
if (args.length == 0) {
return new StringCData(subtype, CType.typeOf(subtype), NullMemory.INSTANCE);
}
byte[] str = args[0].asString().getBytes();
DirectMemory m = AllocatedNativeMemory.allocate(str.length + 1, false);
m.putZeroTerminatedByteArray(0, str, 0, str.length);
return new StringCData(subtype, CType.typeOf(subtype), m);
}
@ExposedClassMethod(names= { "from_address" })
public static final PyObject from_address(PyType subtype, PyObject address) {
DirectMemory m = Util.getMemoryForAddress(address);
StringCData cdata = new StringCData(subtype, CType.typeOf(subtype), m.getMemory(0));
cdata.setReferenceMemory(m);
return cdata;
}
@ExposedGet(name = "value")
public PyObject getValue() {
Memory m = getMemory();
return !m.isNull()
? Py.newString(new String(m.getZeroTerminatedByteArray(0)))
: Py.None;
}
@ExposedSet(name = "value")
public void setValue(PyObject value) {
byte[] str = value.asString().getBytes();
DirectMemory m = AllocatedNativeMemory.allocate(str.length + 1, false);
m.putZeroTerminatedByteArray(0, str, 0, str.length);
this.memory = m;
if (hasReferenceMemory()) {
getReferenceMemory().putAddress(0, m);
}
}
@Override
public final String toString() {
return getType().getName() + "(" + getValue().toString() + ")";
}
@Override
public String asString() {
Memory m = getMemory();
return !m.isNull()
? new String(m.getZeroTerminatedByteArray(0))
: null;
}
}