All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.python.core.PyObject Maven / Gradle / Ivy

Go to download

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.

There is a newer version: 2.7.4
Show newest version
// Copyright (c) Corporation for National Research Initiatives
package org.python.core;

import java.io.Serializable;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.python.expose.ExposedDelete;
import org.python.expose.ExposedGet;
import org.python.expose.ExposedMethod;
import org.python.expose.ExposedNew;
import org.python.expose.ExposedSet;
import org.python.expose.ExposedType;
import org.python.util.Generic;

/**
 * All objects known to the Jython runtime system are represented by an instance
 * of the class PyObject or one of its subclasses.
 */
@ExposedType(name = "object")
public class PyObject implements Serializable {

    public static final PyType TYPE = PyType.fromClass(PyObject.class);

    /** The type of this object. */
    PyType objtype;

    /**
     * An underlying Java instance that this object is wrapping or is a subclass
     * of. Anything attempting to use the proxy should go through {@link #getJavaProxy()}
     * which ensures that it's initialized.
     */
    protected Object javaProxy;

    /** Primitives classes their wrapper classes. */
    private static final Map, Class> primitiveMap = Generic.map();

    static {
        primitiveMap.put(Character.TYPE, Character.class);
        primitiveMap.put(Boolean.TYPE, Boolean.class);
        primitiveMap.put(Byte.TYPE, Byte.class);
        primitiveMap.put(Short.TYPE, Short.class);
        primitiveMap.put(Integer.TYPE, Integer.class);
        primitiveMap.put(Long.TYPE, Long.class);
        primitiveMap.put(Float.TYPE, Float.class);
        primitiveMap.put(Double.TYPE, Double.class);

        if (Py.BOOTSTRAP_TYPES.size() > 0) {
            Py.writeWarning("init", "Bootstrap types weren't encountered in bootstrapping: "
                            + Py.BOOTSTRAP_TYPES);

        }
    }

    public PyObject(PyType objtype) {
        this.objtype = objtype;
    }

    /**
     * The standard constructor for a PyObject. It will set the objtype
     * field to correspond to the specific subclass of PyObject being instantiated.
     **/
    public PyObject() {
        objtype = PyType.fromClass(getClass());
    }

    /**
     * Creates the PyObject for the base type. The argument only exists to make the constructor
     * distinct.
     */
    PyObject(boolean ignored) {
        objtype = (PyType)this;
    }

    //XXX: in CPython object.__new__ has a doc string...
    @ExposedNew
    @ExposedMethod(doc = BuiltinDocs.object___init___doc)
    final void object___init__(PyObject[] args, String[] keywords) {
        // XXX: attempted fix for object(foo=1), etc
        // XXX: this doesn't work for metaclasses, for some reason
        /*
        if (args.length > 0) {
            throw Py.TypeError("default __new__ takes no parameters");
        }
        */
    }

    @ExposedGet(name = "__class__")
    public PyType getType() {
        return objtype;
    }

    @ExposedSet(name = "__class__")
    public void setType(PyType type) {
        if (type.builtin || getType().builtin) {
            throw Py.TypeError("__class__ assignment: only for heap types");
        }
        type.compatibleForAssignment(getType(), "__class__");
        objtype = type;
    }

    @ExposedDelete(name = "__class__")
    public void delType() {
        throw Py.TypeError("can't delete __class__ attribute");
    }

    // xxx
    public PyObject fastGetClass() {
        return objtype;
    }

    //XXX: needs doc
    @ExposedGet(name = "__doc__")
    public PyObject getDoc() {
        PyObject d = fastGetDict();
        if (d != null) {
            PyObject doc = d.__finditem__("__doc__");
            if(doc != null) {
                return doc;
            }
        }
        return Py.None;
    }

    /**
     * Dispatch __init__ behavior
     */
    public void dispatch__init__(PyType type, PyObject[] args, String[] keywords) {}

    /**
     * Attempts to automatically initialize our Java proxy if we have one and it wasn't initialized
     * by our __init__.
     */
    protected void proxyInit() {
        Class c = getType().getProxyType();
        if (javaProxy != null || c == null) {
            return;
        }
        if (!PyProxy.class.isAssignableFrom(c)) {
            throw Py.SystemError("Automatic proxy initialization should only occur on proxy classes");
        }
        PyProxy proxy;
        ThreadState ts = Py.getThreadState();
        try {
            ts.pushInitializingProxy(this);
            try {
                proxy = (PyProxy)c.newInstance();
            } catch (java.lang.InstantiationException e) {
                Class sup = c.getSuperclass();
                String msg = "Default constructor failed for Java superclass";
                if (sup != null) {
                    msg += " " + sup.getName();
                }
                throw Py.TypeError(msg);
            } catch (NoSuchMethodError nsme) {
                throw Py.TypeError("constructor requires arguments");
            } catch (Exception exc) {
                throw Py.JavaError(exc);
            }
        } finally {
            ts.popInitializingProxy();
        }
        if (javaProxy != null && javaProxy != proxy) {
            throw Py.TypeError("Proxy instance already initialized");
        }
        PyObject proxyInstance = proxy._getPyInstance();
        if (proxyInstance != null && proxyInstance != this) {
            throw Py.TypeError("Proxy initialized with another instance");
        }
        javaProxy = proxy;
    }

    /**
     * Equivalent to the standard Python __repr__ method.  This method
     * should not typically need to be overrriden.  The easiest way to
     * configure the string representation of a PyObject is to
     * override the standard Java toString method.
     **/
    // counter-intuitively exposing this as __str__, otherwise stack overflow
    // occurs during regression testing.  XXX: more detail for this comment
    // is needed.
    @ExposedMethod(names = "__str__", doc = BuiltinDocs.object___str___doc)
    public PyString __repr__() {
        return new PyString(toString());
    }

    public String toString() {
        return object_toString();
    }

    @ExposedMethod(names = "__repr__", doc = BuiltinDocs.object___repr___doc)
    final String object_toString() {
        if (getType() == null) {
            return "unknown object";
        }

        String name = getType().getName();
        if (name == null) {
            return "unknown object";
        }

        PyObject module = getType().getModule();
        if (module instanceof PyString && !module.toString().equals("__builtin__")) {
            return String.format("<%s.%s object at %s>", module.toString(), name, Py.idstr(this));
        }
        return String.format("<%s object at %s>", name, Py.idstr(this));
    }

    /**
     * Equivalent to the standard Python __str__ method.  This method
     * should not typically need to be overridden.  The easiest way to
     * configure the string representation of a PyObject is to
     * override the standard Java toString method.
     **/
    public PyString __str__() {
        return __repr__();
    }

    public PyUnicode __unicode__() {
        return new PyUnicode(__str__());
    }

    /**
     * Equivalent to the standard Python __hash__ method.  This method can
     * not be overridden.  Instead, you should override the standard Java
     * hashCode method to return an appropriate hash code for
     * the PyObject.
     **/
    public final PyInteger __hash__() {
        return new PyInteger(hashCode());
    }

    public int hashCode() {
        return object___hash__();
    }

    @ExposedMethod(doc = BuiltinDocs.object___hash___doc)
    final int object___hash__() {
        return System.identityHashCode(this);
    }

    /**
     * Should almost never be overridden.
     * If overridden, it is the subclasses responsibility to ensure that
     * a.equals(b) == true iff cmp(a,b) == 0
     **/
    public boolean equals(Object ob_other) {
        if(ob_other == this) {
            return true;
        }
        return (ob_other instanceof PyObject) && _eq((PyObject)ob_other).__nonzero__();
    }

    /**
     * Equivalent to the standard Python __nonzero__ method. Returns whether of
     * not a given PyObject is considered true.
     */
    public boolean __nonzero__() {
        return true;
    }

    /**
     * Equivalent to the Jython __tojava__ method.
     * Tries to coerce this object to an instance of the requested Java class.
     * Returns the special object Py.NoConversion
     * if this PyObject can not be converted to the
     * desired Java class.
     *
     * @param c the Class to convert this PyObject to.
     **/
    public Object __tojava__(Class c) {
        if ((c == Object.class || c == Serializable.class) && getJavaProxy() != null) {
            return javaProxy;
        }
        if (c.isInstance(this)) {
            return this;
        }
        if (c.isPrimitive()) {
            Class tmp = primitiveMap.get(c);
            if (tmp != null) {
                c = tmp;
            }
        }
        if (c.isInstance(getJavaProxy())) {
            return javaProxy;
        }

        // convert faux floats
        // XXX: should also convert faux ints, but that breaks test_java_visibility
        // (ReflectedArgs resolution)
        if (c == Double.TYPE || c == Double.class || c == Float.TYPE || c == Float.class) {
            try {
                return __float__().getValue();
            } catch (PyException pye) {
                if (!pye.match(Py.AttributeError)) {
                    throw pye;
                }
            }
        }

        return Py.NoConversion;
    }

    protected Object getJavaProxy() {
        if (javaProxy == null) {
            proxyInit();
        }
        return javaProxy;
    }

    /**
     * The basic method to override when implementing a callable object.
     *
     * The first len(args)-len(keywords) members of args[] are plain
     * arguments.  The last len(keywords) arguments are the values of the
     * keyword arguments.
     *
     * @param args     all arguments to the function (including
     *                 keyword arguments).
     * @param keywords the keywords used for all keyword arguments.
     **/
    public PyObject __call__(PyObject args[], String keywords[]) {
        throw Py.TypeError(String.format("'%s' object is not callable", getType().fastGetName()));
    }

    public PyObject __call__(ThreadState state, PyObject args[], String keywords[]) {
        return __call__(args, keywords);
    }

    /**
     * A variant of the __call__ method with one extra initial argument.
     * This variant is used to allow method invocations to be performed
     * efficiently.
     *
     * The default behavior is to invoke __call__(args,
     * keywords) with the appropriate arguments.  The only reason to
     * override this function would be for improved performance.
     *
     * @param arg1     the first argument to the function.
     * @param args     the last arguments to the function (including
     *                 keyword arguments).
     * @param keywords the keywords used for all keyword arguments.
     **/
    public PyObject __call__(PyObject arg1, PyObject args[], String keywords[]) {
        PyObject[] newArgs = new PyObject[args.length + 1];
        System.arraycopy(args, 0, newArgs, 1, args.length);
        newArgs[0] = arg1;
        return __call__(newArgs, keywords);
    }

    public PyObject __call__(ThreadState state, PyObject arg1, PyObject args[], String keywords[]) {
        return __call__(arg1, args, keywords);
    }

    /**
     * A variant of the __call__ method when no keywords are passed.  The
     * default behavior is to invoke __call__(args, keywords)
     * with the appropriate arguments.  The only reason to override this
     * function would be for improved performance.
     *
     * @param args     all arguments to the function.
     **/
    public PyObject __call__(PyObject args[]) {
        return __call__(args, Py.NoKeywords);
    }

    public PyObject __call__(ThreadState state, PyObject args[]) {
        return __call__(args);
    }

    /**
     * A variant of the __call__ method with no arguments.  The default
     * behavior is to invoke __call__(args, keywords) with the
     * appropriate arguments.  The only reason to override this function
     * would be for improved performance.
     **/
    public PyObject __call__() {
        return __call__(Py.EmptyObjects, Py.NoKeywords);
    }

    public PyObject __call__(ThreadState state) {
        return __call__();
    }

    /**
     * A variant of the __call__ method with one argument.  The default
     * behavior is to invoke __call__(args, keywords) with the
     * appropriate arguments.  The only reason to override this function
     * would be for improved performance.
     *
     * @param arg0     the single argument to the function.
     **/
    public PyObject __call__(PyObject arg0) {
        return __call__(new PyObject[] { arg0 }, Py.NoKeywords);
    }

    public PyObject __call__(ThreadState state, PyObject arg0) {
        return __call__(arg0);
    }

    /**
     * A variant of the __call__ method with two arguments.  The default
     * behavior is to invoke __call__(args, keywords) with the
     * appropriate arguments.  The only reason to override this function
     * would be for improved performance.
     *
     * @param arg0     the first argument to the function.
     * @param arg1     the second argument to the function.
     **/
    public PyObject __call__(PyObject arg0, PyObject arg1) {
        return __call__(new PyObject[] { arg0, arg1 }, Py.NoKeywords);
    }

    public PyObject __call__(ThreadState state, PyObject arg0, PyObject arg1) {
        return __call__(arg0, arg1);
    }

    /**
     * A variant of the __call__ method with three arguments.  The default
     * behavior is to invoke __call__(args, keywords) with the
     * appropriate arguments.  The only reason to override this function
     * would be for improved performance.
     *
     * @param arg0     the first argument to the function.
     * @param arg1     the second argument to the function.
     * @param arg2     the third argument to the function.
     **/
    public PyObject __call__(PyObject arg0, PyObject arg1, PyObject arg2) {
        return __call__(new PyObject[] { arg0, arg1, arg2 }, Py.NoKeywords);
    }

    public PyObject __call__(ThreadState state, PyObject arg0, PyObject arg1, PyObject arg2) {
        return __call__(arg0, arg1, arg2);
    }

    /**
     * A variant of the __call__ method with four arguments.  The default
     * behavior is to invoke __call__(args, keywords) with the
     * appropriate arguments.  The only reason to override this function
     * would be for improved performance.
     *
     * @param arg0     the first argument to the function.
     * @param arg1     the second argument to the function.
     * @param arg2     the third argument to the function.
     * @param arg3     the fourth argument to the function.
     **/
    public PyObject __call__(PyObject arg0, PyObject arg1, PyObject arg2, PyObject arg3) {
        return __call__(
            new PyObject[] { arg0, arg1, arg2, arg3 },
            Py.NoKeywords);
    }

    public PyObject __call__(ThreadState state, PyObject arg0, PyObject arg1, PyObject arg2, PyObject arg3) {
        return __call__(arg0, arg1, arg2, arg3);
    }

    public PyObject _callextra(PyObject[] args,
                               String[] keywords,
                               PyObject starargs,
                               PyObject kwargs) {

        int argslen = args.length;

        String name;
        if (this instanceof PyFunction) {
            name = ((PyFunction) this).__name__ + "() ";
        } else if (this instanceof PyBuiltinCallable) {
            name = ((PyBuiltinCallable)this).fastGetName().toString() + "() ";
        } else {
            name = getType().fastGetName() + " ";
        }
        if (kwargs != null) {
            PyObject keys = kwargs.__findattr__("keys");
            if(keys == null)
                throw Py.TypeError(name
                        + "argument after ** must be a mapping");
            for (String keyword : keywords)
                if (kwargs.__finditem__(keyword) != null)
                    throw Py.TypeError(
                        name
                            + "got multiple values for "
                            + "keyword argument '"
                            + keyword
                            + "'");
            argslen += kwargs.__len__();
        }
        List starObjs = null;
        if (starargs != null) {
            starObjs = new ArrayList();
            PyObject iter = Py.iter(starargs, name + "argument after * must be a sequence");
            for (PyObject cur = null; ((cur = iter.__iternext__()) != null); ) {
                starObjs.add(cur);
            }
            argslen += starObjs.size();
        }
        PyObject[] newargs = new PyObject[argslen];
        int argidx = args.length - keywords.length;
        System.arraycopy(args, 0, newargs, 0, argidx);
        if(starObjs != null) {
            Iterator it = starObjs.iterator();
            while(it.hasNext()) {
                newargs[argidx++] = it.next();
            }
        }
        System.arraycopy(args,
                         args.length - keywords.length,
                         newargs,
                         argidx,
                         keywords.length);
        argidx += keywords.length;

        if (kwargs != null) {
            String[] newkeywords =
                new String[keywords.length + kwargs.__len__()];
            System.arraycopy(keywords, 0, newkeywords, 0, keywords.length);

            PyObject keys = kwargs.invoke("keys");
            PyObject key;
            for (int i = 0;(key = keys.__finditem__(i)) != null; i++) {
                if (!(key instanceof PyString))
                    throw Py.TypeError(name + "keywords must be strings");
                newkeywords[keywords.length + i] =
                    ((PyString) key).internedString();
                newargs[argidx++] = kwargs.__finditem__(key);
            }
            keywords = newkeywords;
        }

        if (newargs.length != argidx) {
            args = new PyObject[argidx];
            System.arraycopy(newargs, 0, args, 0, argidx);
        } else
            args = newargs;
        return __call__(args, keywords);
    }

    /* xxx fix these around */

    public boolean isCallable() {
        return getType().lookup("__call__") != null;
    }

    public boolean isMappingType() {
        return true;
    }
    public boolean isNumberType() {
        return true;
    }
    public boolean isSequenceType() {
        return true;
    }

    /**
     * Determine if this object can act as an index (implements __index__).
     *
     * @return true if the object can act as an index
     */
    public boolean isIndex() {
        return getType().lookup("__index__") != null;
    }

    /* The basic functions to implement a mapping */

    /**
     * Equivalent to the standard Python __len__ method.
     * Part of the mapping discipline.
     *
     * @return the length of the object
     **/
    public int __len__() {
        throw Py.AttributeError("__len__");
    }

    /**
     * Very similar to the standard Python __getitem__ method.
     * Instead of throwing a KeyError if the item isn't found,
     * this just returns null.
     *
     * Classes that wish to implement __getitem__ should
     * override this method instead (with the appropriate
     * semantics.
     *
     * @param key the key to lookup in this container
     *
     * @return the value corresponding to key or null if key is not found
     **/
    public PyObject __finditem__(PyObject key) {
        throw Py.TypeError(String.format("'%.200s' object is unsubscriptable",
                                         getType().fastGetName()));
    }

    /**
     * A variant of the __finditem__ method which accepts a primitive
     * int as the key.  By default, this method will call
     * __finditem__(PyObject key) with the appropriate args.
     * The only reason to override this method is for performance.
     *
     * @param key the key to lookup in this sequence.
     * @return the value corresponding to key or null if key is not found.
     *
     * @see #__finditem__(PyObject)
     **/
    public PyObject __finditem__(int key) {
        return __finditem__(new PyInteger(key));
    }

    /**
     * A variant of the __finditem__ method which accepts a Java
     * String as the key.  By default, this method will call
     * __finditem__(PyObject key) with the appropriate args.
     * The only reason to override this method is for performance.
     *
     * Warning: key must be an interned string!!!!!!!!
     *
     * @param key the key to lookup in this sequence -
     *             must be an interned string .
     * @return the value corresponding to key or null if key is not found.
     *
     * @see #__finditem__(PyObject)
     **/
    public PyObject __finditem__(String key) {
        return __finditem__(new PyString(key));
    }

    /**
     * Equivalent to the standard Python __getitem__ method.
     * This variant takes a primitive int as the key.
     * This method should not be overridden.
     * Override the __finditem__ method instead.
     *
     * @param key the key to lookup in this container.
     * @return the value corresponding to that key.
     * @exception Py.KeyError if the key is not found.
     *
     * @see #__finditem__(int)
     **/
    public PyObject __getitem__(int key) {
        PyObject ret = __finditem__(key);
        if (ret == null)
            throw Py.KeyError("" + key);
        return ret;
    }

    /**
     * Equivalent to the standard Python __getitem__ method.
     * This method should not be overridden.
     * Override the __finditem__ method instead.
     *
     * @param key the key to lookup in this container.
     * @return the value corresponding to that key.
     * @exception Py.KeyError if the key is not found.
     *
     * @see #__finditem__(PyObject)
     **/
    public PyObject __getitem__(PyObject key) {
        PyObject ret = __finditem__(key);
        if (ret == null) {
            throw Py.KeyError(key);
        }
        return ret;
    }

    /**
     * Equivalent to the standard Python __setitem__ method.
     *
     * @param key the key whose value will be set
     * @param value the value to set this key to
     **/
    public void __setitem__(PyObject key, PyObject value) {
        throw Py.TypeError(String.format("'%.200s' object does not support item assignment",
                                         getType().fastGetName()));
    }

    /**
     * A variant of the __setitem__ method which accepts a String
     * as the key.  This String must be interned.
     * By default, this will call
     * __setitem__(PyObject key, PyObject value)
     * with the appropriate args.
     * The only reason to override this method is for performance.
     *
     * @param key the key whose value will be set -
     *             must be an interned string .
     * @param value the value to set this key to
     *
     * @see #__setitem__(PyObject, PyObject)
     **/
    public void __setitem__(String key, PyObject value) {
        __setitem__(new PyString(key), value);
    }

    /**
     * A variant of the __setitem__ method which accepts a primitive
     * int as the key.
     * By default, this will call
     * __setitem__(PyObject key, PyObject value)
     * with the appropriate args.
     * The only reason to override this method is for performance.
     *
     * @param key the key whose value will be set
     * @param value the value to set this key to
     *
     * @see #__setitem__(PyObject, PyObject)
     **/
    public void __setitem__(int key, PyObject value) {
        __setitem__(new PyInteger(key), value);
    }

    /**
     * Equivalent to the standard Python __delitem__ method.
     *
     * @param key the key to be removed from the container
     * @exception Py.KeyError if the key is not found in the container
     **/
    public void __delitem__(PyObject key) {
        throw Py.TypeError(String.format("'%.200s' object doesn't support item deletion",
                                         getType().fastGetName()));
    }

    /**
     * A variant of the __delitem__ method which accepts a String
     * as the key.  This String must be interned.
     * By default, this will call
     * __delitem__(PyObject key)
     * with the appropriate args.
     * The only reason to override this method is for performance.
     *
     * @param key the key who will be removed -
     *             must be an interned string .
     * @exception Py.KeyError if the key is not found in the container
     *
     * @see #__delitem__(PyObject)
     **/
    public void __delitem__(String key) {
        __delitem__(new PyString(key));
    }

    public PyObject __getslice__(
        PyObject s_start,
        PyObject s_stop,
        PyObject s_step) {
        PySlice s = new PySlice(s_start, s_stop, s_step);
        return __getitem__(s);
    }

    public void __setslice__(
        PyObject s_start,
        PyObject s_stop,
        PyObject s_step,
        PyObject value) {
        PySlice s = new PySlice(s_start, s_stop, s_step);
        __setitem__(s, value);
    }

    public void __delslice__(
        PyObject s_start,
        PyObject s_stop,
        PyObject s_step) {
        PySlice s = new PySlice(s_start, s_stop, s_step);
        __delitem__(s);
    }

    public PyObject __getslice__(PyObject start, PyObject stop) {
        return __getslice__(start, stop, null);
    }

    public void __setslice__(PyObject start, PyObject stop, PyObject value) {
        __setslice__(start, stop, null, value);
    }

    public void __delslice__(PyObject start, PyObject stop) {
        __delslice__(start, stop, null);
    }

    /*The basic functions to implement an iterator */

    /**
     * Return an iterator that is used to iterate the element of this sequence. From version 2.2,
     * this method is the primary protocol for looping over sequences.
     * 

* If a PyObject subclass should support iteration based in the __finditem__() method, it must * supply an implementation of __iter__() like this: * *

     * public PyObject __iter__() {
     *     return new PySequenceIter(this);
     * }
     * 
* * When iterating over a python sequence from java code, it should be done with code like this: * *
     * for (PyObject item : seq.asIterable()) {
     *     // Do somting with item
     * }
     * 
* * @since 2.2 */ public PyObject __iter__() { throw Py.TypeError(String.format("'%.200s' object is not iterable", getType().fastGetName())); } /** * Returns an Iterable over the Python iterator returned by __iter__ on this object. If this * object doesn't support __iter__, a TypeException will be raised when iterator is called on * the returned Iterable. */ public Iterable asIterable() { return new Iterable() { public Iterator iterator() { return new WrappedIterIterator(__iter__()) { public PyObject next() { return getNext(); } }; } }; } /** * Return the next element of the sequence that this is an iterator * for. Returns null when the end of the sequence is reached. * * @since 2.2 */ public PyObject __iternext__() { return null; } /*The basic functions to implement a namespace*/ /** * Very similar to the standard Python __getattr__ method. Instead of * throwing a AttributeError if the item isn't found, this just returns * null. * * By default, this method will call * __findattr__(name.internedString) with the appropriate * args. * * @param name the name to lookup in this namespace * * @return the value corresponding to name or null if name is not found */ public final PyObject __findattr__(PyString name) { if (name == null) { return null; } return __findattr__(name.internedString()); } /** * A variant of the __findattr__ method which accepts a Java * String as the name. * * Warning: name must be an interned string! * * @param name the name to lookup in this namespace * must be an interned string . * @return the value corresponding to name or null if name is not found **/ public final PyObject __findattr__(String name) { try { return __findattr_ex__(name); } catch (PyException exc) { if (exc.match(Py.AttributeError)) { return null; } throw exc; } } /** * Attribute lookup hook. If the attribute is not found, null may be * returned or a Py.AttributeError can be thrown, whatever is more * correct, efficient and/or convenient for the implementing class. * * Client code should use {@link #__getattr__(String)} or * {@link #__findattr__(String)}. Both methods have a clear policy for * failed lookups. * * @return The looked up value. May return null if the attribute is not found * @throws PyException(AttributeError) if the attribute is not found. This * is not mandatory, null can be returned if it fits the implementation * better, or for performance reasons. */ public PyObject __findattr_ex__(String name) { return object___findattr__(name); } /** * Equivalent to the standard Python __getattr__ method. * * By default, this method will call * __getattr__(name.internedString) with the appropriate * args. * * @param name the name to lookup in this namespace * @return the value corresponding to name * @exception Py.AttributeError if the name is not found. * * @see #__findattr_ex__(String) **/ public final PyObject __getattr__(PyString name) { return __getattr__(name.internedString()); } /** * A variant of the __getattr__ method which accepts a Java * String as the name. * This method can not be overridden. * Override the __findattr_ex__ method instead. * * Warning: name must be an interned string!!!!!!!! * * @param name the name to lookup in this namespace * must be an interned string . * @return the value corresponding to name * @exception Py.AttributeError if the name is not found. * * @see #__findattr__(java.lang.String) **/ public final PyObject __getattr__(String name) { PyObject ret = __findattr_ex__(name); if (ret == null) noAttributeError(name); return ret; } public void noAttributeError(String name) { throw Py.AttributeError(String.format("'%.50s' object has no attribute '%.400s'", getType().fastGetName(), name)); } public void readonlyAttributeError(String name) { // XXX: Should be an AttributeError but CPython throws TypeError for read only // member descriptors (in structmember.c::PyMember_SetOne), which is expected by a // few tests. fixed in py3k: http://bugs.python.org/issue1687163 throw Py.TypeError("readonly attribute"); } /** * Equivalent to the standard Python __setattr__ method. * This method can not be overridden. * * @param name the name to lookup in this namespace * @exception Py.AttributeError if the name is not found. * * @see #__setattr__(java.lang.String, PyObject) **/ public final void __setattr__(PyString name, PyObject value) { __setattr__(name.internedString(), value); } /** * A variant of the __setattr__ method which accepts a String * as the key. This String must be interned. * * @param name the name whose value will be set - * must be an interned string . * @param value the value to set this name to * * @see #__setattr__(PyString, PyObject) **/ public void __setattr__(String name, PyObject value) { object___setattr__(name, value); } /** * Equivalent to the standard Python __delattr__ method. * This method can not be overridden. * * @param name the name to which will be removed * @exception Py.AttributeError if the name doesn't exist * * @see #__delattr__(java.lang.String) **/ public final void __delattr__(PyString name) { __delattr__(name.internedString()); } /** * A variant of the __delattr__ method which accepts a String * as the key. This String must be interned. * By default, this will call * __delattr__(PyString name) * with the appropriate args. * The only reason to override this method is for performance. * * @param name the name which will be removed - * must be an interned string . * @exception Py.AttributeError if the name doesn't exist * * @see #__delattr__(PyString) **/ public void __delattr__(String name) { object___delattr__(name); } // Used by import logic. protected PyObject impAttr(String name) { return __findattr__(name); } protected void mergeListAttr(PyDictionary accum, String attr) { PyObject obj = __findattr__(attr); if (obj == null) { return; } if (obj instanceof PyList) { for (PyObject name : obj.asIterable()) { accum.__setitem__(name, Py.None); } } } protected void mergeDictAttr(PyDictionary accum, String attr) { PyObject obj = __findattr__(attr); if (obj == null) { return; } if (obj instanceof PyDictionary || obj instanceof PyStringMap || obj instanceof PyDictProxy) { accum.update(obj); } } protected void mergeClassDict(PyDictionary accum, PyObject aClass) { // Merge in the type's dict (if any) aClass.mergeDictAttr(accum, "__dict__"); // Recursively merge in the base types' (if any) dicts PyObject bases = aClass.__findattr__("__bases__"); if (bases == null) { return; } // We have no guarantee that bases is a real tuple int len = bases.__len__(); for (int i = 0; i < len; i++) { mergeClassDict(accum, bases.__getitem__(i)); } } protected void __rawdir__(PyDictionary accum) { mergeDictAttr(accum, "__dict__"); mergeListAttr(accum, "__methods__"); mergeListAttr(accum, "__members__"); // Class dict is a slower, more manual merge to match CPython PyObject itsClass = __findattr__("__class__"); if (itsClass != null) { mergeClassDict(accum, itsClass); } } /** * Equivalent to the standard Python __dir__ method. * * @return a list of names defined by this object. **/ public PyObject __dir__() { PyDictionary accum = new PyDictionary(); __rawdir__(accum); PyList ret = accum.keys(); ret.sort(); return ret; } public PyObject _doget(PyObject container) { return this; } public PyObject _doget(PyObject container, PyObject wherefound) { return _doget(container); } public boolean _doset(PyObject container, PyObject value) { return false; } boolean jdontdel() { return false; } /* Numeric coercion */ /** * Implements numeric coercion * * @param o the other object involved in the coercion * @return null if coercion is not implemented * Py.None if coercion was not possible * a single PyObject to use to replace o if this is unchanged; * or a PyObject[2] consisting of replacements for this and o. **/ public Object __coerce_ex__(PyObject o) { return null; } /** * Implements coerce(this,other), result as PyObject[] * @param other * @return PyObject[] */ PyObject[] _coerce(PyObject other) { Object result; if (this.getType() == other.getType() && !(this instanceof PyInstance)) { return new PyObject[] {this, other}; } result = this.__coerce_ex__(other); if (result != null && result != Py.None) { if (result instanceof PyObject[]) { return (PyObject[])result; } else { return new PyObject[] {this, (PyObject)result}; } } result = other.__coerce_ex__(this); if (result != null && result != Py.None) { if (result instanceof PyObject[]) { return (PyObject[])result; } else { return new PyObject[] {(PyObject)result, other}; } } return null; } /** * Equivalent to the standard Python __coerce__ method. * * This method can not be overridden. * To implement __coerce__ functionality, override __coerce_ex__ instead. * * Also, do not call this method from exposed 'coerce' methods. * Instead, Use adaptToCoerceTuple over the result of the overriden * __coerce_ex__. * * @param pyo the other object involved in the coercion. * @return a tuple of this object and pyo coerced to the same type * or Py.NotImplemented if no coercion is possible. * @see org.python.core.PyObject#__coerce_ex__(org.python.core.PyObject) **/ public final PyObject __coerce__(PyObject pyo) { Object o = __coerce_ex__(pyo); if (o == null) { throw Py.AttributeError("__coerce__"); } return adaptToCoerceTuple(o); } /** * Adapts the result of __coerce_ex__ to a tuple of two elements, with the * resulting coerced values, or to Py.NotImplemented, if o is Py.None. * * This is safe to be used from subclasses exposing '__coerce__' * (as opposed to {@link #__coerce__(PyObject)}, which calls the virtual * method {@link #__coerce_ex__(PyObject)}) * * @param o either a PyObject[2] or a PyObject, as given by * {@link #__coerce_ex__(PyObject)}. */ protected final PyObject adaptToCoerceTuple(Object o) { if (o == Py.None) { return Py.NotImplemented; } if (o instanceof PyObject[]) { return new PyTuple((PyObject[]) o); } else { return new PyTuple(this, (PyObject) o ); } } /* The basic comparision operations */ /** * Equivalent to the standard Python __cmp__ method. * * @param other the object to compare this with. * @return -1 if this < o; 0 if this == o; +1 if this > o; -2 if no * comparison is implemented **/ public int __cmp__(PyObject other) { return -2; } /** * Equivalent to the standard Python __eq__ method. * * @param other the object to compare this with. * @return the result of the comparison. **/ public PyObject __eq__(PyObject other) { return null; } /** * Equivalent to the standard Python __ne__ method. * * @param other the object to compare this with. * @return the result of the comparison. **/ public PyObject __ne__(PyObject other) { return null; } /** * Equivalent to the standard Python __le__ method. * * @param other the object to compare this with. * @return the result of the comparison. **/ public PyObject __le__(PyObject other) { return null; } /** * Equivalent to the standard Python __lt__ method. * * @param other the object to compare this with. * @return the result of the comparison. **/ public PyObject __lt__(PyObject other) { return null; } /** * Equivalent to the standard Python __ge__ method. * * @param other the object to compare this with. * @return the result of the comparison. **/ public PyObject __ge__(PyObject other) { return null; } /** * Equivalent to the standard Python __gt__ method. * * @param other the object to compare this with. * @return the result of the comparison. **/ public PyObject __gt__(PyObject other) { return null; } /** * Implements cmp(this, other) * * @param o the object to compare this with. * @return -1 if this < 0; 0 if this == o; +1 if this > o **/ public final int _cmp(PyObject o) { if (this == o) { return 0; } PyObject token = null; ThreadState ts = Py.getThreadState(); try { if (++ts.compareStateNesting > 500) { if ((token = check_recursion(ts, this, o)) == null) return 0; } PyObject result; result = __eq__(o); if (result == null) { result = o.__eq__(this); } if (result != null && result.__nonzero__()) { return 0; } result = __lt__(o); if (result == null) { result = o.__gt__(this); } if (result != null && result.__nonzero__()) { return -1; } result = __gt__(o); if (result == null) { result = o.__lt__(this); } if (result != null && result.__nonzero__()) { return 1; } return _cmp_unsafe(o); } finally { delete_token(ts, token); ts.compareStateNesting--; } } private PyObject make_pair(PyObject o) { if (System.identityHashCode(this) < System.identityHashCode(o)) return new PyIdentityTuple(new PyObject[] { this, o }); else return new PyIdentityTuple(new PyObject[] { o, this }); } private final int _default_cmp(PyObject other) { int result; if (this._is(other).__nonzero__()) return 0; /* None is smaller than anything */ if (this == Py.None) return -1; if (other == Py.None) return 1; // No rational way to compare these, so ask their classes to compare PyType this_type = this.getType(); PyType other_type = other.getType(); if (this_type == other_type) { return Py.id(this) < Py.id(other)? -1: 1; } result = this_type.fastGetName().compareTo(other_type.fastGetName()); if (result == 0) return Py.id(this_type) *
  • this.__cmp__(other) *
  • other.__cmp__(this) *
  • this._coerce(other) followed by coerced_this.__cmp__(coerced_other) * * @return -1, 0, -1 or -2, according to the {@link #__cmp__} protocol. */ private int _try__cmp__(PyObject other) { int result; result = this.__cmp__(other); if (result != -2) return result; if (!(this instanceof PyInstance)) { result = other.__cmp__(this); if (result != -2) return -result; } // Final attempt: coerce both arguments and compare that. We are doing // this the same point where CPython 2.5 does. (See // at // the end of try_3way_compare). // // This is not exactly was is specified on // , where coercion is // supposed to happen before trying __cmp__. PyObject[] coerced = _coerce(other); if (coerced != null) { result = coerced[0].__cmp__(coerced[1]); if (result != -2) { return result; } } return -2; } private final static PyObject check_recursion( ThreadState ts, PyObject o1, PyObject o2) { PyDictionary stateDict = ts.getCompareStateDict(); PyObject pair = o1.make_pair(o2); if (stateDict.__finditem__(pair) != null) return null; stateDict.__setitem__(pair, pair); return pair; } private final static void delete_token(ThreadState ts, PyObject token) { if (token == null) return; PyDictionary stateDict = ts.getCompareStateDict(); stateDict.__delitem__(token); } /** * Implements the Python expression this == other. * * @param o the object to compare this with. * @return the result of the comparison **/ public final PyObject _eq(PyObject o) { PyObject token = null; PyType t1 = this.getType(); PyType t2 = o.getType(); if (t1 != t2 && t2.isSubType(t1)) { return o._eq(this); } ThreadState ts = Py.getThreadState(); try { if (++ts.compareStateNesting > 10) { if ((token = check_recursion(ts, this, o)) == null) return Py.True; } PyObject res = __eq__(o); if (res != null) return res; res = o.__eq__(this); if (res != null) return res; return _cmpeq_unsafe(o) == 0 ? Py.True : Py.False; } finally { delete_token(ts, token); ts.compareStateNesting--; } } /** * Implements the Python expression this != other. * * @param o the object to compare this with. * @return the result of the comparison **/ public final PyObject _ne(PyObject o) { PyObject token = null; PyType t1 = this.getType(); PyType t2 = o.getType(); if (t1 != t2 && t2.isSubType(t1)) { return o._ne(this); } ThreadState ts = Py.getThreadState(); try { if (++ts.compareStateNesting > 10) { if ((token = check_recursion(ts, this, o)) == null) return Py.False; } PyObject res = __ne__(o); if (res != null) return res; res = o.__ne__(this); if (res != null) return res; return _cmpeq_unsafe(o) != 0 ? Py.True : Py.False; } finally { delete_token(ts, token); ts.compareStateNesting--; } } /** * Implements the Python expression this <= other. * * @param o the object to compare this with. * @return the result of the comparison **/ public final PyObject _le(PyObject o) { PyObject token = null; PyType t1 = this.getType(); PyType t2 = o.getType(); if (t1 != t2 && t2.isSubType(t1)) { return o._ge(this); } ThreadState ts = Py.getThreadState(); try { if (++ts.compareStateNesting > 10) { if ((token = check_recursion(ts, this, o)) == null) throw Py.ValueError("can't order recursive values"); } PyObject res = __le__(o); if (res != null) return res; res = o.__ge__(this); if (res != null) return res; return _cmp_unsafe(o) <= 0 ? Py.True : Py.False; } finally { delete_token(ts, token); ts.compareStateNesting--; } } /** * Implements the Python expression this < other. * * @param o the object to compare this with. * @return the result of the comparison **/ public final PyObject _lt(PyObject o) { PyObject token = null; PyType t1 = this.getType(); PyType t2 = o.getType(); if (t1 != t2 && t2.isSubType(t1)) { return o._gt(this); } ThreadState ts = Py.getThreadState(); try { if (++ts.compareStateNesting > 10) { if ((token = check_recursion(ts, this, o)) == null) throw Py.ValueError("can't order recursive values"); } PyObject res = __lt__(o); if (res != null) return res; res = o.__gt__(this); if (res != null) return res; return _cmp_unsafe(o) < 0 ? Py.True : Py.False; } finally { delete_token(ts, token); ts.compareStateNesting--; } } /** * Implements the Python expression this >= other. * * @param o the object to compare this with. * @return the result of the comparison **/ public final PyObject _ge(PyObject o) { PyObject token = null; PyType t1 = this.getType(); PyType t2 = o.getType(); if (t1 != t2 && t2.isSubType(t1)) { return o._le(this); } ThreadState ts = Py.getThreadState(); try { if (++ts.compareStateNesting > 10) { if ((token = check_recursion(ts, this, o)) == null) throw Py.ValueError("can't order recursive values"); } PyObject res = __ge__(o); if (res != null) return res; res = o.__le__(this); if (res != null) return res; return _cmp_unsafe(o) >= 0 ? Py.True : Py.False; } finally { delete_token(ts, token); ts.compareStateNesting--; } } /** * Implements the Python expression this > other. * * @param o the object to compare this with. * @return the result of the comparison **/ public final PyObject _gt(PyObject o) { PyObject token = null; PyType t1 = this.getType(); PyType t2 = o.getType(); if (t1 != t2 && t2.isSubType(t1)) { return o._lt(this); } ThreadState ts = Py.getThreadState(); try { if (++ts.compareStateNesting > 10) { if ((token = check_recursion(ts, this, o)) == null) throw Py.ValueError("can't order recursive values"); } PyObject res = __gt__(o); if (res != null) return res; res = o.__lt__(this); if (res != null) return res; return _cmp_unsafe(o) > 0 ? Py.True : Py.False; } finally { delete_token(ts, token); ts.compareStateNesting--; } } /** * Implements is operator. * * @param o the object to compare this with. * @return the result of the comparison **/ public PyObject _is(PyObject o) { // Access javaProxy directly here as is is for object identity, and at best getJavaProxy // will initialize a new object with a different identity return this == o || (javaProxy != null && javaProxy == o.javaProxy) ? Py.True : Py.False; } /** * Implements is not operator. * * @param o the object to compare this with. * @return the result of the comparison **/ public PyObject _isnot(PyObject o) { // Access javaProxy directly here as is is for object identity, and at best getJavaProxy // will initialize a new object with a different identity return this != o && (javaProxy == null || javaProxy != o.javaProxy) ? Py.True : Py.False; } /** * Implements in operator. * * @param o the container to search for this element. * @return the result of the search. **/ public final PyObject _in(PyObject o) { return Py.newBoolean(o.__contains__(this)); } /** * Implements not in operator. * * @param o the container to search for this element. * @return the result of the search. **/ public final PyObject _notin(PyObject o) { return Py.newBoolean(!o.__contains__(this)); } /** * Equivalent to the standard Python __contains__ method. * * @param o the element to search for in this container. * @return the result of the search. **/ public boolean __contains__(PyObject o) { return object___contains__(o); } final boolean object___contains__(PyObject o) { for (PyObject item : asIterable()) { if (o.equals(item)) { return true; } } return false; } /** * Implements boolean not * * @return not this. **/ public PyObject __not__() { return __nonzero__() ? Py.False : Py.True; } /* The basic numeric operations */ /** * Equivalent to the standard Python __hex__ method * Should only be overridden by numeric objects that can be * reasonably represented as a hexadecimal string. * * @return a string representing this object as a hexadecimal number. **/ public PyString __hex__() { throw Py.TypeError("hex() argument can't be converted to hex"); } /** * Equivalent to the standard Python __oct__ method. * Should only be overridden by numeric objects that can be * reasonably represented as an octal string. * * @return a string representing this object as an octal number. **/ public PyString __oct__() { throw Py.TypeError("oct() argument can't be converted to oct"); } /** * Equivalent to the standard Python __int__ method. * Should only be overridden by numeric objects that can be * reasonably coerced into an integer. * * @return an integer corresponding to the value of this object. **/ public PyObject __int__() { throw Py.AttributeError("__int__"); } /** * Equivalent to the standard Python __long__ method. * Should only be overridden by numeric objects that can be * reasonably coerced into a python long. * * @return a PyLong or PyInteger corresponding to the value of this object. **/ public PyObject __long__() { throw Py.AttributeError("__long__"); } /** * Equivalent to the standard Python __float__ method. * Should only be overridden by numeric objects that can be * reasonably coerced into a python float. * * @return a float corresponding to the value of this object. **/ public PyFloat __float__() { throw Py.AttributeError("__float__"); } /** * Equivalent to the standard Python __complex__ method. * Should only be overridden by numeric objects that can be * reasonably coerced into a python complex number. * * @return a complex number corresponding to the value of this object. **/ public PyComplex __complex__() { throw Py.AttributeError("__complex__"); } /** * Equivalent to the standard Python __pos__ method. * * @return +this. **/ public PyObject __pos__() { throw Py.TypeError(String.format("bad operand type for unary +: '%.200s'", getType().fastGetName())); } /** * Equivalent to the standard Python __neg__ method. * * @return -this. **/ public PyObject __neg__() { throw Py.TypeError(String.format("bad operand type for unary -: '%.200s'", getType().fastGetName())); } /** * Equivalent to the standard Python __abs__ method. * * @return abs(this). **/ public PyObject __abs__() { throw Py.TypeError(String.format("bad operand type for abs(): '%.200s'", getType().fastGetName())); } /** * Equivalent to the standard Python __invert__ method. * * @return ~this. **/ public PyObject __invert__() { throw Py.TypeError(String.format("bad operand type for unary ~: '%.200s'", getType().fastGetName())); } /** * Equivalent to the standard Python __index__ method. * * @return a PyInteger or PyLong * @throws a Py.TypeError if not supported **/ public PyObject __index__() { throw Py.TypeError(String.format("'%.200s' object cannot be interpreted as an index", getType().fastGetName())); } /** * @param op the String form of the op (e.g. "+") * @param o2 the right operand */ protected final String _unsupportedop(String op, PyObject o2) { Object[] args = {op, getType().fastGetName(), o2.getType().fastGetName()}; String msg = unsupportedopMessage(op, o2); if (msg == null) { msg = o2.runsupportedopMessage(op, o2); } if (msg == null) { msg = "unsupported operand type(s) for {0}: ''{1}'' and ''{2}''"; } return MessageFormat.format(msg, args); } /** * Should return an error message suitable for substitution where. * * {0} is the op name. * {1} is the left operand type. * {2} is the right operand type. */ protected String unsupportedopMessage(String op, PyObject o2) { return null; } /** * Should return an error message suitable for substitution where. * * {0} is the op name. * {1} is the left operand type. * {2} is the right operand type. */ protected String runsupportedopMessage(String op, PyObject o2) { return null; } /** * Implements the three argument power function. * * @param o2 the power to raise this number to. * @param o3 the modulus to perform this operation in or null if no * modulo is to be used * @return this object raised to the given power in the given modulus **/ public PyObject __pow__(PyObject o2, PyObject o3) { return null; } /** * Determine if the binary op on types t1 and t2 is an add * operation dealing with a str/unicode and a str/unicode * subclass. * * This operation is special cased in _binop_rule to match * CPython's handling; CPython uses tp_as_number and * tp_as_sequence to allow string/unicode subclasses to override * the left side's __add__ when that left side is an actual str or * unicode object (see test_concat_jy for examples). * * @param t1 left side PyType * @param t2 right side PyType * @param op the binary operation's String * @return true if this is a special case */ private boolean isStrUnicodeSpecialCase(PyType t1, PyType t2, String op) { // XXX: We may need to generalize this rule to apply to other // situations // XXX: This method isn't expensive but could (and maybe // should?) be optimized for worst case scenarios return op == "+" && (t1 == PyString.TYPE || t1 == PyUnicode.TYPE) && (t2.isSubType(PyString.TYPE) || t2.isSubType(PyUnicode.TYPE)); } private PyObject _binop_rule(PyType t1, PyObject o2, PyType t2, String left, String right, String op) { /* * this is the general rule for binary operation dispatching try first * __xxx__ with this and then __rxxx__ with o2 unless o2 is an instance * of subclass of the type of this, and further __xxx__ and __rxxx__ are * unrelated ( checked here by looking at where in the hierarchy they * are defined), in that case try them in the reverse order. This is the * same formulation as used by PyPy, see also * test_descr.subclass_right_op. */ PyObject o1 = this; PyObject[] where = new PyObject[1]; PyObject where1 = null, where2 = null; PyObject impl1 = t1.lookup_where(left, where); where1 = where[0]; PyObject impl2 = t2.lookup_where(right, where); where2 = where[0]; if (impl2 != null && impl1 != null && where1 != where2 && (t2.isSubType(t1) && !Py.isSubClass(where1, where2) && !Py.isSubClass(t1, where2) || isStrUnicodeSpecialCase(t1, t2, op))) { PyObject tmp = o1; o1 = o2; o2 = tmp; tmp = impl1; impl1 = impl2; impl2 = tmp; PyType ttmp; ttmp = t1; t1 = t2; t2 = ttmp; } PyObject res = null; if (impl1 != null) { res = impl1.__get__(o1, t1).__call__(o2); if (res != Py.NotImplemented) { return res; } } if (impl2 != null) { res = impl2.__get__(o2, t2).__call__(o1); if (res != Py.NotImplemented) { return res; } } throw Py.TypeError(_unsupportedop(op, o2)); } // Generated by make_binops.py (Begin) /** * Equivalent to the standard Python __add__ method * @param other the object to perform this binary operation with * (the right-hand operand). * @return the result of the add, or null if this operation * is not defined **/ public PyObject __add__(PyObject other) { return null; } /** * Equivalent to the standard Python __radd__ method * @param other the object to perform this binary operation with * (the left-hand operand). * @return the result of the add, or null if this operation * is not defined. **/ public PyObject __radd__(PyObject other) { return null; } /** * Equivalent to the standard Python __iadd__ method * @param other the object to perform this binary operation with * (the right-hand operand). * @return the result of the iadd, or null if this operation * is not defined **/ public PyObject __iadd__(PyObject other) { return null; } /** * Implements the Python expression this + o2 * @param o2 the object to perform this binary operation with. * @return the result of the add. * @exception Py.TypeError if this operation can't be performed * with these operands. **/ public final PyObject _add(PyObject o2) { PyType t1=this.getType(); PyType t2=o2.getType(); if (t1==t2||t1.builtin&&t2.builtin) { return this._basic_add(o2); } return _binop_rule(t1,o2,t2,"__add__","__radd__","+"); } /** * Implements the Python expression this + o2 * when this and o2 have the same type or are builtin types. * @param o2 the object to perform this binary operation with. * @return the result of the add. * @exception Py.TypeError if this operation can't be performed * with these operands. **/ final PyObject _basic_add(PyObject o2) { PyObject x=__add__(o2); if (x!=null) { return x; } x=o2.__radd__(this); if (x!=null) { return x; } throw Py.TypeError(_unsupportedop("+",o2)); } /** * Implements the Python expression this += o2 * @param o2 the object to perform this inplace binary * operation with. * @return the result of the iadd. * @exception Py.TypeError if this operation can't be performed * with these operands. **/ public final PyObject _iadd(PyObject o2) { PyType t1=this.getType(); PyType t2=o2.getType(); if (t1==t2||t1.builtin&&t2.builtin) { return this._basic_iadd(o2); } PyObject impl=t1.lookup("__iadd__"); if (impl!=null) { PyObject res=impl.__get__(this,t1).__call__(o2); if (res!=Py.NotImplemented) { return res; } } return _binop_rule(t1,o2,t2,"__add__","__radd__","+"); } /** * Implements the Python expression this += o2 * when this and o2 have the same type or are builtin types. * @param o2 the object to perform this inplace binary * operation with. * @return the result of the iadd. * @exception Py.TypeError if this operation can't be performed * with these operands. **/ final PyObject _basic_iadd(PyObject o2) { PyObject x=__iadd__(o2); if (x!=null) { return x; } return this._basic_add(o2); } /** * Equivalent to the standard Python __sub__ method * @param other the object to perform this binary operation with * (the right-hand operand). * @return the result of the sub, or null if this operation * is not defined **/ public PyObject __sub__(PyObject other) { return null; } /** * Equivalent to the standard Python __rsub__ method * @param other the object to perform this binary operation with * (the left-hand operand). * @return the result of the sub, or null if this operation * is not defined. **/ public PyObject __rsub__(PyObject other) { return null; } /** * Equivalent to the standard Python __isub__ method * @param other the object to perform this binary operation with * (the right-hand operand). * @return the result of the isub, or null if this operation * is not defined **/ public PyObject __isub__(PyObject other) { return null; } /** * Implements the Python expression this - o2 * @param o2 the object to perform this binary operation with. * @return the result of the sub. * @exception Py.TypeError if this operation can't be performed * with these operands. **/ public final PyObject _sub(PyObject o2) { PyType t1=this.getType(); PyType t2=o2.getType(); if (t1==t2||t1.builtin&&t2.builtin) { return this._basic_sub(o2); } return _binop_rule(t1,o2,t2,"__sub__","__rsub__","-"); } /** * Implements the Python expression this - o2 * when this and o2 have the same type or are builtin types. * @param o2 the object to perform this binary operation with. * @return the result of the sub. * @exception Py.TypeError if this operation can't be performed * with these operands. **/ final PyObject _basic_sub(PyObject o2) { PyObject x=__sub__(o2); if (x!=null) { return x; } x=o2.__rsub__(this); if (x!=null) { return x; } throw Py.TypeError(_unsupportedop("-",o2)); } /** * Implements the Python expression this -= o2 * @param o2 the object to perform this inplace binary * operation with. * @return the result of the isub. * @exception Py.TypeError if this operation can't be performed * with these operands. **/ public final PyObject _isub(PyObject o2) { PyType t1=this.getType(); PyType t2=o2.getType(); if (t1==t2||t1.builtin&&t2.builtin) { return this._basic_isub(o2); } PyObject impl=t1.lookup("__isub__"); if (impl!=null) { PyObject res=impl.__get__(this,t1).__call__(o2); if (res!=Py.NotImplemented) { return res; } } return _binop_rule(t1,o2,t2,"__sub__","__rsub__","-"); } /** * Implements the Python expression this -= o2 * when this and o2 have the same type or are builtin types. * @param o2 the object to perform this inplace binary * operation with. * @return the result of the isub. * @exception Py.TypeError if this operation can't be performed * with these operands. **/ final PyObject _basic_isub(PyObject o2) { PyObject x=__isub__(o2); if (x!=null) { return x; } return this._basic_sub(o2); } /** * Equivalent to the standard Python __mul__ method * @param other the object to perform this binary operation with * (the right-hand operand). * @return the result of the mul, or null if this operation * is not defined **/ public PyObject __mul__(PyObject other) { return null; } /** * Equivalent to the standard Python __rmul__ method * @param other the object to perform this binary operation with * (the left-hand operand). * @return the result of the mul, or null if this operation * is not defined. **/ public PyObject __rmul__(PyObject other) { return null; } /** * Equivalent to the standard Python __imul__ method * @param other the object to perform this binary operation with * (the right-hand operand). * @return the result of the imul, or null if this operation * is not defined **/ public PyObject __imul__(PyObject other) { return null; } /** * Implements the Python expression this * o2 * @param o2 the object to perform this binary operation with. * @return the result of the mul. * @exception Py.TypeError if this operation can't be performed * with these operands. **/ public final PyObject _mul(PyObject o2) { PyType t1=this.getType(); PyType t2=o2.getType(); if (t1==t2||t1.builtin&&t2.builtin) { return this._basic_mul(o2); } return _binop_rule(t1,o2,t2,"__mul__","__rmul__","*"); } /** * Implements the Python expression this * o2 * when this and o2 have the same type or are builtin types. * @param o2 the object to perform this binary operation with. * @return the result of the mul. * @exception Py.TypeError if this operation can't be performed * with these operands. **/ final PyObject _basic_mul(PyObject o2) { PyObject x=__mul__(o2); if (x!=null) { return x; } x=o2.__rmul__(this); if (x!=null) { return x; } throw Py.TypeError(_unsupportedop("*",o2)); } /** * Implements the Python expression this *= o2 * @param o2 the object to perform this inplace binary * operation with. * @return the result of the imul. * @exception Py.TypeError if this operation can't be performed * with these operands. **/ public final PyObject _imul(PyObject o2) { PyType t1=this.getType(); PyType t2=o2.getType(); if (t1==t2||t1.builtin&&t2.builtin) { return this._basic_imul(o2); } PyObject impl=t1.lookup("__imul__"); if (impl!=null) { PyObject res=impl.__get__(this,t1).__call__(o2); if (res!=Py.NotImplemented) { return res; } } return _binop_rule(t1,o2,t2,"__mul__","__rmul__","*"); } /** * Implements the Python expression this *= o2 * when this and o2 have the same type or are builtin types. * @param o2 the object to perform this inplace binary * operation with. * @return the result of the imul. * @exception Py.TypeError if this operation can't be performed * with these operands. **/ final PyObject _basic_imul(PyObject o2) { PyObject x=__imul__(o2); if (x!=null) { return x; } return this._basic_mul(o2); } /** * Equivalent to the standard Python __div__ method * @param other the object to perform this binary operation with * (the right-hand operand). * @return the result of the div, or null if this operation * is not defined **/ public PyObject __div__(PyObject other) { return null; } /** * Equivalent to the standard Python __rdiv__ method * @param other the object to perform this binary operation with * (the left-hand operand). * @return the result of the div, or null if this operation * is not defined. **/ public PyObject __rdiv__(PyObject other) { return null; } /** * Equivalent to the standard Python __idiv__ method * @param other the object to perform this binary operation with * (the right-hand operand). * @return the result of the idiv, or null if this operation * is not defined **/ public PyObject __idiv__(PyObject other) { return null; } /** * Implements the Python expression this / o2 * @param o2 the object to perform this binary operation with. * @return the result of the div. * @exception Py.TypeError if this operation can't be performed * with these operands. **/ public final PyObject _div(PyObject o2) { if (Options.Qnew) return _truediv(o2); PyType t1=this.getType(); PyType t2=o2.getType(); if (t1==t2||t1.builtin&&t2.builtin) { return this._basic_div(o2); } return _binop_rule(t1,o2,t2,"__div__","__rdiv__","/"); } /** * Implements the Python expression this / o2 * when this and o2 have the same type or are builtin types. * @param o2 the object to perform this binary operation with. * @return the result of the div. * @exception Py.TypeError if this operation can't be performed * with these operands. **/ final PyObject _basic_div(PyObject o2) { PyObject x=__div__(o2); if (x!=null) { return x; } x=o2.__rdiv__(this); if (x!=null) { return x; } throw Py.TypeError(_unsupportedop("/",o2)); } /** * Implements the Python expression this /= o2 * @param o2 the object to perform this inplace binary * operation with. * @return the result of the idiv. * @exception Py.TypeError if this operation can't be performed * with these operands. **/ public final PyObject _idiv(PyObject o2) { if (Options.Qnew) return _itruediv(o2); PyType t1=this.getType(); PyType t2=o2.getType(); if (t1==t2||t1.builtin&&t2.builtin) { return this._basic_idiv(o2); } PyObject impl=t1.lookup("__idiv__"); if (impl!=null) { PyObject res=impl.__get__(this,t1).__call__(o2); if (res!=Py.NotImplemented) { return res; } } return _binop_rule(t1,o2,t2,"__div__","__rdiv__","/"); } /** * Implements the Python expression this /= o2 * when this and o2 have the same type or are builtin types. * @param o2 the object to perform this inplace binary * operation with. * @return the result of the idiv. * @exception Py.TypeError if this operation can't be performed * with these operands. **/ final PyObject _basic_idiv(PyObject o2) { PyObject x=__idiv__(o2); if (x!=null) { return x; } return this._basic_div(o2); } /** * Equivalent to the standard Python __floordiv__ method * @param other the object to perform this binary operation with * (the right-hand operand). * @return the result of the floordiv, or null if this operation * is not defined **/ public PyObject __floordiv__(PyObject other) { return null; } /** * Equivalent to the standard Python __rfloordiv__ method * @param other the object to perform this binary operation with * (the left-hand operand). * @return the result of the floordiv, or null if this operation * is not defined. **/ public PyObject __rfloordiv__(PyObject other) { return null; } /** * Equivalent to the standard Python __ifloordiv__ method * @param other the object to perform this binary operation with * (the right-hand operand). * @return the result of the ifloordiv, or null if this operation * is not defined **/ public PyObject __ifloordiv__(PyObject other) { return null; } /** * Implements the Python expression this // o2 * @param o2 the object to perform this binary operation with. * @return the result of the floordiv. * @exception Py.TypeError if this operation can't be performed * with these operands. **/ public final PyObject _floordiv(PyObject o2) { PyType t1=this.getType(); PyType t2=o2.getType(); if (t1==t2||t1.builtin&&t2.builtin) { return this._basic_floordiv(o2); } return _binop_rule(t1,o2,t2,"__floordiv__","__rfloordiv__","//"); } /** * Implements the Python expression this // o2 * when this and o2 have the same type or are builtin types. * @param o2 the object to perform this binary operation with. * @return the result of the floordiv. * @exception Py.TypeError if this operation can't be performed * with these operands. **/ final PyObject _basic_floordiv(PyObject o2) { PyObject x=__floordiv__(o2); if (x!=null) { return x; } x=o2.__rfloordiv__(this); if (x!=null) { return x; } throw Py.TypeError(_unsupportedop("//",o2)); } /** * Implements the Python expression this //= o2 * @param o2 the object to perform this inplace binary * operation with. * @return the result of the ifloordiv. * @exception Py.TypeError if this operation can't be performed * with these operands. **/ public final PyObject _ifloordiv(PyObject o2) { PyType t1=this.getType(); PyType t2=o2.getType(); if (t1==t2||t1.builtin&&t2.builtin) { return this._basic_ifloordiv(o2); } PyObject impl=t1.lookup("__ifloordiv__"); if (impl!=null) { PyObject res=impl.__get__(this,t1).__call__(o2); if (res!=Py.NotImplemented) { return res; } } return _binop_rule(t1,o2,t2,"__floordiv__","__rfloordiv__","//"); } /** * Implements the Python expression this //= o2 * when this and o2 have the same type or are builtin types. * @param o2 the object to perform this inplace binary * operation with. * @return the result of the ifloordiv. * @exception Py.TypeError if this operation can't be performed * with these operands. **/ final PyObject _basic_ifloordiv(PyObject o2) { PyObject x=__ifloordiv__(o2); if (x!=null) { return x; } return this._basic_floordiv(o2); } /** * Equivalent to the standard Python __truediv__ method * @param other the object to perform this binary operation with * (the right-hand operand). * @return the result of the truediv, or null if this operation * is not defined **/ public PyObject __truediv__(PyObject other) { return null; } /** * Equivalent to the standard Python __rtruediv__ method * @param other the object to perform this binary operation with * (the left-hand operand). * @return the result of the truediv, or null if this operation * is not defined. **/ public PyObject __rtruediv__(PyObject other) { return null; } /** * Equivalent to the standard Python __itruediv__ method * @param other the object to perform this binary operation with * (the right-hand operand). * @return the result of the itruediv, or null if this operation * is not defined **/ public PyObject __itruediv__(PyObject other) { return null; } /** * Implements the Python expression this / o2 * @param o2 the object to perform this binary operation with. * @return the result of the truediv. * @exception Py.TypeError if this operation can't be performed * with these operands. **/ public final PyObject _truediv(PyObject o2) { PyType t1=this.getType(); PyType t2=o2.getType(); if (t1==t2||t1.builtin&&t2.builtin) { return this._basic_truediv(o2); } return _binop_rule(t1,o2,t2,"__truediv__","__rtruediv__","/"); } /** * Implements the Python expression this / o2 * when this and o2 have the same type or are builtin types. * @param o2 the object to perform this binary operation with. * @return the result of the truediv. * @exception Py.TypeError if this operation can't be performed * with these operands. **/ final PyObject _basic_truediv(PyObject o2) { PyObject x=__truediv__(o2); if (x!=null) { return x; } x=o2.__rtruediv__(this); if (x!=null) { return x; } throw Py.TypeError(_unsupportedop("/",o2)); } /** * Implements the Python expression this /= o2 * @param o2 the object to perform this inplace binary * operation with. * @return the result of the itruediv. * @exception Py.TypeError if this operation can't be performed * with these operands. **/ public final PyObject _itruediv(PyObject o2) { PyType t1=this.getType(); PyType t2=o2.getType(); if (t1==t2||t1.builtin&&t2.builtin) { return this._basic_itruediv(o2); } PyObject impl=t1.lookup("__itruediv__"); if (impl!=null) { PyObject res=impl.__get__(this,t1).__call__(o2); if (res!=Py.NotImplemented) { return res; } } return _binop_rule(t1,o2,t2,"__truediv__","__rtruediv__","/"); } /** * Implements the Python expression this /= o2 * when this and o2 have the same type or are builtin types. * @param o2 the object to perform this inplace binary * operation with. * @return the result of the itruediv. * @exception Py.TypeError if this operation can't be performed * with these operands. **/ final PyObject _basic_itruediv(PyObject o2) { PyObject x=__itruediv__(o2); if (x!=null) { return x; } return this._basic_truediv(o2); } /** * Equivalent to the standard Python __mod__ method * @param other the object to perform this binary operation with * (the right-hand operand). * @return the result of the mod, or null if this operation * is not defined **/ public PyObject __mod__(PyObject other) { return null; } /** * Equivalent to the standard Python __rmod__ method * @param other the object to perform this binary operation with * (the left-hand operand). * @return the result of the mod, or null if this operation * is not defined. **/ public PyObject __rmod__(PyObject other) { return null; } /** * Equivalent to the standard Python __imod__ method * @param other the object to perform this binary operation with * (the right-hand operand). * @return the result of the imod, or null if this operation * is not defined **/ public PyObject __imod__(PyObject other) { return null; } /** * Implements the Python expression this % o2 * @param o2 the object to perform this binary operation with. * @return the result of the mod. * @exception Py.TypeError if this operation can't be performed * with these operands. **/ public final PyObject _mod(PyObject o2) { PyType t1=this.getType(); PyType t2=o2.getType(); if (t1==t2||t1.builtin&&t2.builtin) { return this._basic_mod(o2); } return _binop_rule(t1,o2,t2,"__mod__","__rmod__","%"); } /** * Implements the Python expression this % o2 * when this and o2 have the same type or are builtin types. * @param o2 the object to perform this binary operation with. * @return the result of the mod. * @exception Py.TypeError if this operation can't be performed * with these operands. **/ final PyObject _basic_mod(PyObject o2) { PyObject x=__mod__(o2); if (x!=null) { return x; } x=o2.__rmod__(this); if (x!=null) { return x; } throw Py.TypeError(_unsupportedop("%",o2)); } /** * Implements the Python expression this %= o2 * @param o2 the object to perform this inplace binary * operation with. * @return the result of the imod. * @exception Py.TypeError if this operation can't be performed * with these operands. **/ public final PyObject _imod(PyObject o2) { PyType t1=this.getType(); PyType t2=o2.getType(); if (t1==t2||t1.builtin&&t2.builtin) { return this._basic_imod(o2); } PyObject impl=t1.lookup("__imod__"); if (impl!=null) { PyObject res=impl.__get__(this,t1).__call__(o2); if (res!=Py.NotImplemented) { return res; } } return _binop_rule(t1,o2,t2,"__mod__","__rmod__","%"); } /** * Implements the Python expression this %= o2 * when this and o2 have the same type or are builtin types. * @param o2 the object to perform this inplace binary * operation with. * @return the result of the imod. * @exception Py.TypeError if this operation can't be performed * with these operands. **/ final PyObject _basic_imod(PyObject o2) { PyObject x=__imod__(o2); if (x!=null) { return x; } return this._basic_mod(o2); } /** * Equivalent to the standard Python __divmod__ method * @param other the object to perform this binary operation with * (the right-hand operand). * @return the result of the divmod, or null if this operation * is not defined **/ public PyObject __divmod__(PyObject other) { return null; } /** * Equivalent to the standard Python __rdivmod__ method * @param other the object to perform this binary operation with * (the left-hand operand). * @return the result of the divmod, or null if this operation * is not defined. **/ public PyObject __rdivmod__(PyObject other) { return null; } /** * Equivalent to the standard Python __idivmod__ method * @param other the object to perform this binary operation with * (the right-hand operand). * @return the result of the idivmod, or null if this operation * is not defined **/ public PyObject __idivmod__(PyObject other) { return null; } /** * Implements the Python expression this divmod o2 * @param o2 the object to perform this binary operation with. * @return the result of the divmod. * @exception Py.TypeError if this operation can't be performed * with these operands. **/ public final PyObject _divmod(PyObject o2) { PyType t1=this.getType(); PyType t2=o2.getType(); if (t1==t2||t1.builtin&&t2.builtin) { return this._basic_divmod(o2); } return _binop_rule(t1,o2,t2,"__divmod__","__rdivmod__","divmod"); } /** * Implements the Python expression this divmod o2 * when this and o2 have the same type or are builtin types. * @param o2 the object to perform this binary operation with. * @return the result of the divmod. * @exception Py.TypeError if this operation can't be performed * with these operands. **/ final PyObject _basic_divmod(PyObject o2) { PyObject x=__divmod__(o2); if (x!=null) { return x; } x=o2.__rdivmod__(this); if (x!=null) { return x; } throw Py.TypeError(_unsupportedop("divmod",o2)); } /** * Implements the Python expression this divmod= o2 * @param o2 the object to perform this inplace binary * operation with. * @return the result of the idivmod. * @exception Py.TypeError if this operation can't be performed * with these operands. **/ public final PyObject _idivmod(PyObject o2) { PyType t1=this.getType(); PyType t2=o2.getType(); if (t1==t2||t1.builtin&&t2.builtin) { return this._basic_idivmod(o2); } PyObject impl=t1.lookup("__idivmod__"); if (impl!=null) { PyObject res=impl.__get__(this,t1).__call__(o2); if (res!=Py.NotImplemented) { return res; } } return _binop_rule(t1,o2,t2,"__divmod__","__rdivmod__","divmod"); } /** * Implements the Python expression this divmod= o2 * when this and o2 have the same type or are builtin types. * @param o2 the object to perform this inplace binary * operation with. * @return the result of the idivmod. * @exception Py.TypeError if this operation can't be performed * with these operands. **/ final PyObject _basic_idivmod(PyObject o2) { PyObject x=__idivmod__(o2); if (x!=null) { return x; } return this._basic_divmod(o2); } /** * Equivalent to the standard Python __pow__ method * @param other the object to perform this binary operation with * (the right-hand operand). * @return the result of the pow, or null if this operation * is not defined **/ public PyObject __pow__(PyObject other) { return __pow__(other,null); } /** * Equivalent to the standard Python __rpow__ method * @param other the object to perform this binary operation with * (the left-hand operand). * @return the result of the pow, or null if this operation * is not defined. **/ public PyObject __rpow__(PyObject other) { return null; } /** * Equivalent to the standard Python __ipow__ method * @param other the object to perform this binary operation with * (the right-hand operand). * @return the result of the ipow, or null if this operation * is not defined **/ public PyObject __ipow__(PyObject other) { return null; } /** * Implements the Python expression this ** o2 * @param o2 the object to perform this binary operation with. * @return the result of the pow. * @exception Py.TypeError if this operation can't be performed * with these operands. **/ public final PyObject _pow(PyObject o2) { PyType t1=this.getType(); PyType t2=o2.getType(); if (t1==t2||t1.builtin&&t2.builtin) { return this._basic_pow(o2); } return _binop_rule(t1,o2,t2,"__pow__","__rpow__","**"); } /** * Implements the Python expression this ** o2 * when this and o2 have the same type or are builtin types. * @param o2 the object to perform this binary operation with. * @return the result of the pow. * @exception Py.TypeError if this operation can't be performed * with these operands. **/ final PyObject _basic_pow(PyObject o2) { PyObject x=__pow__(o2); if (x!=null) { return x; } x=o2.__rpow__(this); if (x!=null) { return x; } throw Py.TypeError(_unsupportedop("**",o2)); } /** * Implements the Python expression this **= o2 * @param o2 the object to perform this inplace binary * operation with. * @return the result of the ipow. * @exception Py.TypeError if this operation can't be performed * with these operands. **/ public final PyObject _ipow(PyObject o2) { PyType t1=this.getType(); PyType t2=o2.getType(); if (t1==t2||t1.builtin&&t2.builtin) { return this._basic_ipow(o2); } PyObject impl=t1.lookup("__ipow__"); if (impl!=null) { PyObject res=impl.__get__(this,t1).__call__(o2); if (res!=Py.NotImplemented) { return res; } } return _binop_rule(t1,o2,t2,"__pow__","__rpow__","**"); } /** * Implements the Python expression this **= o2 * when this and o2 have the same type or are builtin types. * @param o2 the object to perform this inplace binary * operation with. * @return the result of the ipow. * @exception Py.TypeError if this operation can't be performed * with these operands. **/ final PyObject _basic_ipow(PyObject o2) { PyObject x=__ipow__(o2); if (x!=null) { return x; } return this._basic_pow(o2); } /** * Equivalent to the standard Python __lshift__ method * @param other the object to perform this binary operation with * (the right-hand operand). * @return the result of the lshift, or null if this operation * is not defined **/ public PyObject __lshift__(PyObject other) { return null; } /** * Equivalent to the standard Python __rlshift__ method * @param other the object to perform this binary operation with * (the left-hand operand). * @return the result of the lshift, or null if this operation * is not defined. **/ public PyObject __rlshift__(PyObject other) { return null; } /** * Equivalent to the standard Python __ilshift__ method * @param other the object to perform this binary operation with * (the right-hand operand). * @return the result of the ilshift, or null if this operation * is not defined **/ public PyObject __ilshift__(PyObject other) { return null; } /** * Implements the Python expression this << o2 * @param o2 the object to perform this binary operation with. * @return the result of the lshift. * @exception Py.TypeError if this operation can't be performed * with these operands. **/ public final PyObject _lshift(PyObject o2) { PyType t1=this.getType(); PyType t2=o2.getType(); if (t1==t2||t1.builtin&&t2.builtin) { return this._basic_lshift(o2); } return _binop_rule(t1,o2,t2,"__lshift__","__rlshift__","<<"); } /** * Implements the Python expression this << o2 * when this and o2 have the same type or are builtin types. * @param o2 the object to perform this binary operation with. * @return the result of the lshift. * @exception Py.TypeError if this operation can't be performed * with these operands. **/ final PyObject _basic_lshift(PyObject o2) { PyObject x=__lshift__(o2); if (x!=null) { return x; } x=o2.__rlshift__(this); if (x!=null) { return x; } throw Py.TypeError(_unsupportedop("<<",o2)); } /** * Implements the Python expression this <<= o2 * @param o2 the object to perform this inplace binary * operation with. * @return the result of the ilshift. * @exception Py.TypeError if this operation can't be performed * with these operands. **/ public final PyObject _ilshift(PyObject o2) { PyType t1=this.getType(); PyType t2=o2.getType(); if (t1==t2||t1.builtin&&t2.builtin) { return this._basic_ilshift(o2); } PyObject impl=t1.lookup("__ilshift__"); if (impl!=null) { PyObject res=impl.__get__(this,t1).__call__(o2); if (res!=Py.NotImplemented) { return res; } } return _binop_rule(t1,o2,t2,"__lshift__","__rlshift__","<<"); } /** * Implements the Python expression this <<= o2 * when this and o2 have the same type or are builtin types. * @param o2 the object to perform this inplace binary * operation with. * @return the result of the ilshift. * @exception Py.TypeError if this operation can't be performed * with these operands. **/ final PyObject _basic_ilshift(PyObject o2) { PyObject x=__ilshift__(o2); if (x!=null) { return x; } return this._basic_lshift(o2); } /** * Equivalent to the standard Python __rshift__ method * @param other the object to perform this binary operation with * (the right-hand operand). * @return the result of the rshift, or null if this operation * is not defined **/ public PyObject __rshift__(PyObject other) { return null; } /** * Equivalent to the standard Python __rrshift__ method * @param other the object to perform this binary operation with * (the left-hand operand). * @return the result of the rshift, or null if this operation * is not defined. **/ public PyObject __rrshift__(PyObject other) { return null; } /** * Equivalent to the standard Python __irshift__ method * @param other the object to perform this binary operation with * (the right-hand operand). * @return the result of the irshift, or null if this operation * is not defined **/ public PyObject __irshift__(PyObject other) { return null; } /** * Implements the Python expression this >> o2 * @param o2 the object to perform this binary operation with. * @return the result of the rshift. * @exception Py.TypeError if this operation can't be performed * with these operands. **/ public final PyObject _rshift(PyObject o2) { PyType t1=this.getType(); PyType t2=o2.getType(); if (t1==t2||t1.builtin&&t2.builtin) { return this._basic_rshift(o2); } return _binop_rule(t1,o2,t2,"__rshift__","__rrshift__",">>"); } /** * Implements the Python expression this >> o2 * when this and o2 have the same type or are builtin types. * @param o2 the object to perform this binary operation with. * @return the result of the rshift. * @exception Py.TypeError if this operation can't be performed * with these operands. **/ final PyObject _basic_rshift(PyObject o2) { PyObject x=__rshift__(o2); if (x!=null) { return x; } x=o2.__rrshift__(this); if (x!=null) { return x; } throw Py.TypeError(_unsupportedop(">>",o2)); } /** * Implements the Python expression this >>= o2 * @param o2 the object to perform this inplace binary * operation with. * @return the result of the irshift. * @exception Py.TypeError if this operation can't be performed * with these operands. **/ public final PyObject _irshift(PyObject o2) { PyType t1=this.getType(); PyType t2=o2.getType(); if (t1==t2||t1.builtin&&t2.builtin) { return this._basic_irshift(o2); } PyObject impl=t1.lookup("__irshift__"); if (impl!=null) { PyObject res=impl.__get__(this,t1).__call__(o2); if (res!=Py.NotImplemented) { return res; } } return _binop_rule(t1,o2,t2,"__rshift__","__rrshift__",">>"); } /** * Implements the Python expression this >>= o2 * when this and o2 have the same type or are builtin types. * @param o2 the object to perform this inplace binary * operation with. * @return the result of the irshift. * @exception Py.TypeError if this operation can't be performed * with these operands. **/ final PyObject _basic_irshift(PyObject o2) { PyObject x=__irshift__(o2); if (x!=null) { return x; } return this._basic_rshift(o2); } /** * Equivalent to the standard Python __and__ method * @param other the object to perform this binary operation with * (the right-hand operand). * @return the result of the and, or null if this operation * is not defined **/ public PyObject __and__(PyObject other) { return null; } /** * Equivalent to the standard Python __rand__ method * @param other the object to perform this binary operation with * (the left-hand operand). * @return the result of the and, or null if this operation * is not defined. **/ public PyObject __rand__(PyObject other) { return null; } /** * Equivalent to the standard Python __iand__ method * @param other the object to perform this binary operation with * (the right-hand operand). * @return the result of the iand, or null if this operation * is not defined **/ public PyObject __iand__(PyObject other) { return null; } /** * Implements the Python expression this & o2 * @param o2 the object to perform this binary operation with. * @return the result of the and. * @exception Py.TypeError if this operation can't be performed * with these operands. **/ public final PyObject _and(PyObject o2) { PyType t1=this.getType(); PyType t2=o2.getType(); if (t1==t2||t1.builtin&&t2.builtin) { return this._basic_and(o2); } return _binop_rule(t1,o2,t2,"__and__","__rand__","&"); } /** * Implements the Python expression this & o2 * when this and o2 have the same type or are builtin types. * @param o2 the object to perform this binary operation with. * @return the result of the and. * @exception Py.TypeError if this operation can't be performed * with these operands. **/ final PyObject _basic_and(PyObject o2) { PyObject x=__and__(o2); if (x!=null) { return x; } x=o2.__rand__(this); if (x!=null) { return x; } throw Py.TypeError(_unsupportedop("&",o2)); } /** * Implements the Python expression this &= o2 * @param o2 the object to perform this inplace binary * operation with. * @return the result of the iand. * @exception Py.TypeError if this operation can't be performed * with these operands. **/ public final PyObject _iand(PyObject o2) { PyType t1=this.getType(); PyType t2=o2.getType(); if (t1==t2||t1.builtin&&t2.builtin) { return this._basic_iand(o2); } PyObject impl=t1.lookup("__iand__"); if (impl!=null) { PyObject res=impl.__get__(this,t1).__call__(o2); if (res!=Py.NotImplemented) { return res; } } return _binop_rule(t1,o2,t2,"__and__","__rand__","&"); } /** * Implements the Python expression this &= o2 * when this and o2 have the same type or are builtin types. * @param o2 the object to perform this inplace binary * operation with. * @return the result of the iand. * @exception Py.TypeError if this operation can't be performed * with these operands. **/ final PyObject _basic_iand(PyObject o2) { PyObject x=__iand__(o2); if (x!=null) { return x; } return this._basic_and(o2); } /** * Equivalent to the standard Python __or__ method * @param other the object to perform this binary operation with * (the right-hand operand). * @return the result of the or, or null if this operation * is not defined **/ public PyObject __or__(PyObject other) { return null; } /** * Equivalent to the standard Python __ror__ method * @param other the object to perform this binary operation with * (the left-hand operand). * @return the result of the or, or null if this operation * is not defined. **/ public PyObject __ror__(PyObject other) { return null; } /** * Equivalent to the standard Python __ior__ method * @param other the object to perform this binary operation with * (the right-hand operand). * @return the result of the ior, or null if this operation * is not defined **/ public PyObject __ior__(PyObject other) { return null; } /** * Implements the Python expression this | o2 * @param o2 the object to perform this binary operation with. * @return the result of the or. * @exception Py.TypeError if this operation can't be performed * with these operands. **/ public final PyObject _or(PyObject o2) { PyType t1=this.getType(); PyType t2=o2.getType(); if (t1==t2||t1.builtin&&t2.builtin) { return this._basic_or(o2); } return _binop_rule(t1,o2,t2,"__or__","__ror__","|"); } /** * Implements the Python expression this | o2 * when this and o2 have the same type or are builtin types. * @param o2 the object to perform this binary operation with. * @return the result of the or. * @exception Py.TypeError if this operation can't be performed * with these operands. **/ final PyObject _basic_or(PyObject o2) { PyObject x=__or__(o2); if (x!=null) { return x; } x=o2.__ror__(this); if (x!=null) { return x; } throw Py.TypeError(_unsupportedop("|",o2)); } /** * Implements the Python expression this |= o2 * @param o2 the object to perform this inplace binary * operation with. * @return the result of the ior. * @exception Py.TypeError if this operation can't be performed * with these operands. **/ public final PyObject _ior(PyObject o2) { PyType t1=this.getType(); PyType t2=o2.getType(); if (t1==t2||t1.builtin&&t2.builtin) { return this._basic_ior(o2); } PyObject impl=t1.lookup("__ior__"); if (impl!=null) { PyObject res=impl.__get__(this,t1).__call__(o2); if (res!=Py.NotImplemented) { return res; } } return _binop_rule(t1,o2,t2,"__or__","__ror__","|"); } /** * Implements the Python expression this |= o2 * when this and o2 have the same type or are builtin types. * @param o2 the object to perform this inplace binary * operation with. * @return the result of the ior. * @exception Py.TypeError if this operation can't be performed * with these operands. **/ final PyObject _basic_ior(PyObject o2) { PyObject x=__ior__(o2); if (x!=null) { return x; } return this._basic_or(o2); } /** * Equivalent to the standard Python __xor__ method * @param other the object to perform this binary operation with * (the right-hand operand). * @return the result of the xor, or null if this operation * is not defined **/ public PyObject __xor__(PyObject other) { return null; } /** * Equivalent to the standard Python __rxor__ method * @param other the object to perform this binary operation with * (the left-hand operand). * @return the result of the xor, or null if this operation * is not defined. **/ public PyObject __rxor__(PyObject other) { return null; } /** * Equivalent to the standard Python __ixor__ method * @param other the object to perform this binary operation with * (the right-hand operand). * @return the result of the ixor, or null if this operation * is not defined **/ public PyObject __ixor__(PyObject other) { return null; } /** * Implements the Python expression this ^ o2 * @param o2 the object to perform this binary operation with. * @return the result of the xor. * @exception Py.TypeError if this operation can't be performed * with these operands. **/ public final PyObject _xor(PyObject o2) { PyType t1=this.getType(); PyType t2=o2.getType(); if (t1==t2||t1.builtin&&t2.builtin) { return this._basic_xor(o2); } return _binop_rule(t1,o2,t2,"__xor__","__rxor__","^"); } /** * Implements the Python expression this ^ o2 * when this and o2 have the same type or are builtin types. * @param o2 the object to perform this binary operation with. * @return the result of the xor. * @exception Py.TypeError if this operation can't be performed * with these operands. **/ final PyObject _basic_xor(PyObject o2) { PyObject x=__xor__(o2); if (x!=null) { return x; } x=o2.__rxor__(this); if (x!=null) { return x; } throw Py.TypeError(_unsupportedop("^",o2)); } /** * Implements the Python expression this ^= o2 * @param o2 the object to perform this inplace binary * operation with. * @return the result of the ixor. * @exception Py.TypeError if this operation can't be performed * with these operands. **/ public final PyObject _ixor(PyObject o2) { PyType t1=this.getType(); PyType t2=o2.getType(); if (t1==t2||t1.builtin&&t2.builtin) { return this._basic_ixor(o2); } PyObject impl=t1.lookup("__ixor__"); if (impl!=null) { PyObject res=impl.__get__(this,t1).__call__(o2); if (res!=Py.NotImplemented) { return res; } } return _binop_rule(t1,o2,t2,"__xor__","__rxor__","^"); } /** * Implements the Python expression this ^= o2 * when this and o2 have the same type or are builtin types. * @param o2 the object to perform this inplace binary * operation with. * @return the result of the ixor. * @exception Py.TypeError if this operation can't be performed * with these operands. **/ final PyObject _basic_ixor(PyObject o2) { PyObject x=__ixor__(o2); if (x!=null) { return x; } return this._basic_xor(o2); } // Generated by make_binops.py (End) /** * A convenience function for PyProxys. */ public PyObject _jcallexc(Object[] args) throws Throwable { try { return __call__(Py.javas2pys(args)); } catch (PyException e) { if (e.value.getJavaProxy() != null) { Object t = e.value.__tojava__(Throwable.class); if (t != null && t != Py.NoConversion) { throw (Throwable) t; } } else { ThreadState ts = Py.getThreadState(); if (ts.frame == null) { Py.maybeSystemExit(e); } if (Options.showPythonProxyExceptions) { Py.stderr.println( "Exception in Python proxy returning to Java:"); Py.printException(e); } } throw e; } } public void _jthrow(Throwable t) { if (t instanceof RuntimeException) throw (RuntimeException) t; if (t instanceof Error) throw (Error) t; throw Py.JavaError(t); } public PyObject _jcall(Object[] args) { try { return _jcallexc(args); } catch (Throwable t) { _jthrow(t); return null; } } /* Shortcut methods for calling methods from Java */ /** * Shortcut for calling a method on a PyObject from Java. * This form is equivalent to o.__getattr__(name).__call__(args, keywords) * * @param name the name of the method to call. This must be an * interned string! * @param args an array of the arguments to the call. * @param keywords the keywords to use in the call. * @return the result of calling the method name with args and keywords. **/ public PyObject invoke(String name, PyObject[] args, String[] keywords) { PyObject f = __getattr__(name); return f.__call__(args, keywords); } public PyObject invoke(String name, PyObject[] args) { PyObject f = __getattr__(name); return f.__call__(args); } /** * Shortcut for calling a method on a PyObject with no args. * * @param name the name of the method to call. This must be an * interned string! * @return the result of calling the method name with no args **/ public PyObject invoke(String name) { PyObject f = __getattr__(name); return f.__call__(); } /** * Shortcut for calling a method on a PyObject with one arg. * * @param name the name of the method to call. This must be an * interned string! * @param arg1 the one argument of the method. * @return the result of calling the method name with arg1 **/ public PyObject invoke(String name, PyObject arg1) { PyObject f = __getattr__(name); return f.__call__(arg1); } /** * Shortcut for calling a method on a PyObject with two args. * * @param name the name of the method to call. This must be an * interned string! * @param arg1 the first argument of the method. * @param arg2 the second argument of the method. * @return the result of calling the method name with arg1 and arg2 **/ public PyObject invoke(String name, PyObject arg1, PyObject arg2) { PyObject f = __getattr__(name); return f.__call__(arg1, arg2); } /** * Shortcut for calling a method on a PyObject with one extra * initial argument. * * @param name the name of the method to call. This must be an * interned string! * @param arg1 the first argument of the method. * @param args an array of the arguments to the call. * @param keywords the keywords to use in the call. * @return the result of calling the method name with arg1 args * and keywords **/ public PyObject invoke(String name, PyObject arg1, PyObject[] args, String[] keywords) { PyObject f = __getattr__(name); return f.__call__(arg1, args, keywords); } /* descriptors and lookup protocols */ /** xxx implements where meaningful * @return internal object per instance dict or null */ public PyObject fastGetDict() { return null; } /** xxx implements where meaningful * @return internal object __dict__ or null */ public PyObject getDict() { return null; } public void setDict(PyObject newDict) { // fallback if setDict not implemented in subclass throw Py.TypeError("can't set attribute '__dict__' of instance of " + getType().fastGetName()); } public void delDict() { // fallback to error throw Py.TypeError("can't delete attribute '__dict__' of instance of '" + getType().fastGetName()+ "'"); } public boolean implementsDescrSet() { return objtype.has_set; } public boolean implementsDescrDelete() { return objtype.has_delete; } public boolean isDataDescr() { // implements either __set__ or __delete__ return objtype.has_set || objtype.has_delete; } // doc & xxx ok this way? // can return null meaning set-only or throw exception // backward comp impls. /** * Get descriptor for this PyObject. * * @param obj - * the instance accessing this descriptor. Can be null if this is * being accessed by a type. * @param type - * the type accessing this descriptor. Will be null if obj exists * as obj is of the type accessing the descriptor. * @return - the object defined for this descriptor for the given obj and * type. */ public PyObject __get__(PyObject obj, PyObject type) { return _doget(obj, type); } public void __set__(PyObject obj, PyObject value) { if (!_doset(obj, value)) { throw Py.AttributeError("object internal __set__ impl is abstract"); } } public void __delete__(PyObject obj) { throw Py.AttributeError("object internal __delete__ impl is abstract"); } @ExposedMethod(doc = BuiltinDocs.object___getattribute___doc) final PyObject object___getattribute__(PyObject arg0) { String name = asName(arg0); PyObject ret = object___findattr__(name); if(ret == null) noAttributeError(name); return ret; } // name must be interned final PyObject object___findattr__(String name) { PyObject descr = objtype.lookup(name); PyObject res; if (descr != null) { if (descr.isDataDescr()) { res = descr.__get__(this, objtype); if (res != null) return res; } } PyObject obj_dict = fastGetDict(); if (obj_dict != null) { res = obj_dict.__finditem__(name); if (res != null) return res; } if (descr != null) { return descr.__get__(this, objtype); } return null; } @ExposedMethod(doc = BuiltinDocs.object___setattr___doc) final void object___setattr__(PyObject name, PyObject value) { hackCheck("__setattr__"); object___setattr__(asName(name), value); } final void object___setattr__(String name, PyObject value) { PyObject descr = objtype.lookup(name); boolean set = false; if (descr != null) { set = descr.implementsDescrSet(); if (set && descr.isDataDescr()) { descr.__set__(this, value); return; } } PyObject obj_dict = fastGetDict(); if (obj_dict != null) { obj_dict.__setitem__(name, value); return; } if (set) { descr.__set__(this, value); } if (descr != null) { readonlyAttributeError(name); } noAttributeError(name); } @ExposedMethod(doc = BuiltinDocs.object___delattr___doc) final void object___delattr__(PyObject name) { hackCheck("__delattr__"); object___delattr__(asName(name)); } public static final String asName(PyObject obj) { try { return obj.asName(0); } catch(PyObject.ConversionException e) { throw Py.TypeError("attribute name must be a string"); } } final void object___delattr__(String name) { PyObject descr = objtype.lookup(name); boolean delete = false; if (descr != null) { delete = descr.implementsDescrDelete(); if (delete && descr.isDataDescr()) { descr.__delete__(this); return; } } PyObject obj_dict = fastGetDict(); if (obj_dict != null) { try { obj_dict.__delitem__(name); } catch (PyException exc) { if (exc.match(Py.KeyError)) noAttributeError(name); else throw exc; } return; } if (delete) { descr.__delete__(this); } if (descr != null) { readonlyAttributeError(name); } noAttributeError(name); } /** * Helper to check for object.__setattr__ or __delattr__ applied to a type (The Carlo * Verre hack). * * @param what String method name to check for */ private void hackCheck(String what) { if (this instanceof PyType && ((PyType)this).builtin) { throw Py.TypeError(String.format("can't apply this %s to %s object", what, objtype.fastGetName())); } } /** * Used for pickling. Default implementation calls object___reduce__. * * @return a tuple of (class, tuple) */ public PyObject __reduce__() { return object___reduce__(); } @ExposedMethod(doc = BuiltinDocs.object___reduce___doc) final PyObject object___reduce__() { return object___reduce_ex__(0); } /** Used for pickling. If the subclass specifies __reduce__, it will * override __reduce_ex__ in the base-class, even if __reduce_ex__ was * called with an argument. * * @param arg PyInteger specifying reduce algorithm (method without this * argument defaults to 0). * @return a tuple of (class, tuple) */ public PyObject __reduce_ex__(int arg) { return object___reduce_ex__(arg); } public PyObject __reduce_ex__() { return object___reduce_ex__(0); } @ExposedMethod(defaults = "0", doc = BuiltinDocs.object___reduce___doc) final PyObject object___reduce_ex__(int arg) { PyObject res; PyObject clsreduce = this.getType().__findattr__("__reduce__"); PyObject objreduce = (new PyObject()).getType().__findattr__("__reduce__"); if (clsreduce != objreduce) { res = this.__reduce__(); } else if (arg >= 2) { res = reduce_2(); } else { PyObject copyreg = __builtin__.__import__("copy_reg", null, null, Py.EmptyTuple); PyObject copyreg_reduce = copyreg.__findattr__("_reduce_ex"); res = copyreg_reduce.__call__(this, new PyInteger(arg)); } return res; } private static PyObject slotnames(PyObject cls) { PyObject slotnames; slotnames = cls.fastGetDict().__finditem__("__slotnames__"); if (null != slotnames) { return slotnames; } PyObject copyreg = __builtin__.__import__("copy_reg", null, null, Py.EmptyTuple); PyObject copyreg_slotnames = copyreg.__findattr__("_slotnames"); slotnames = copyreg_slotnames.__call__(cls); if (null != slotnames && Py.None != slotnames && (!(slotnames instanceof PyList))) { throw Py.TypeError("copy_reg._slotnames didn't return a list or None"); } return slotnames; } private PyObject reduce_2() { PyObject args, state; PyObject res = null; int n,i; PyObject cls = this.__findattr__("__class__"); PyObject getnewargs = this.__findattr__("__getnewargs__"); if (null != getnewargs) { args = getnewargs.__call__(); if (null != args && !(args instanceof PyTuple)) { throw Py.TypeError("__getnewargs__ should return a tuple"); } } else { args = Py.EmptyTuple; } PyObject getstate = this.__findattr__("__getstate__"); if (null != getstate) { state = getstate.__call__(); if (null == state) { return res; } } else { state = this.__findattr__("__dict__"); if (null == state) { state = Py.None; } PyObject names = slotnames(cls); if (null == names) { return res; } if (names != Py.None) { if (!(names instanceof PyList)) { throw Py.AssertionError("slots not a list"); } PyObject slots = new PyDictionary(); n = 0; for (i = 0; i < ((PyList)names).size(); i++) { PyObject name = ((PyList)names).pyget(i); PyObject value = this.__findattr__(name.toString()); if (null == value) { // do nothing } else { slots.__setitem__(name, value); n++; } } if (n > 0) { state = new PyTuple(state, slots); } } } PyObject listitems; PyObject dictitems; if (!(this instanceof PyList)) { listitems = Py.None; } else { listitems = ((PyList)this).__iter__(); } if (!(this instanceof PyDictionary)) { dictitems = Py.None; } else { dictitems = invoke("iteritems"); } PyObject copyreg = __builtin__.__import__("copy_reg", null, null, Py.EmptyTuple); PyObject newobj = copyreg.__findattr__("__newobj__"); n = ((PyTuple)args).size(); PyObject args2[] = new PyObject[n+1]; args2[0] = cls; for(i = 0; i < n; i++) { args2[i+1] = ((PyTuple)args).pyget(i); } return new PyTuple(newobj, new PyTuple(args2), state, listitems, dictitems); } public PyTuple __getnewargs__() { //default is empty tuple return new PyTuple(); } /* arguments' conversion helpers */ public static class ConversionException extends Exception { public int index; public ConversionException(int index) { this.index = index; } } public String asString(int index) throws ConversionException { throw new ConversionException(index); } public String asString(){ throw Py.TypeError("expected a str"); } public String asStringOrNull(int index) throws ConversionException { return asString(index); } public String asStringOrNull(){ return asString(); } // TODO - remove when all asName users are moved to the @Exposed annotation public String asName(int index) throws ConversionException { throw new ConversionException(index); } // TODO - remove when all generated users are migrated to @Exposed and asInt() public int asInt(int index) throws ConversionException { throw new ConversionException(index); } public int asInt() { PyObject intObj; try { intObj = __int__(); } catch (PyException pye) { if (pye.match(Py.AttributeError)) { throw Py.TypeError("an integer is required"); } throw pye; } if (!(intObj instanceof PyInteger) && !(intObj instanceof PyLong)) { // Shouldn't happen except with buggy builtin types throw Py.TypeError("nb_int should return int object"); } return intObj.asInt(); } public long asLong(int index) throws ConversionException { throw new ConversionException(index); } /** * Convert this object into a double. Throws a PyException on failure. * * @return a double value */ public double asDouble() { PyFloat floatObj; try { floatObj = __float__(); } catch (PyException pye) { if (pye.match(Py.AttributeError)) { throw Py.TypeError("a float is required"); } throw pye; } return floatObj.asDouble(); } /** * Convert this object into an index-sized integer. Throws a PyException on failure. * * @return an index-sized int */ public int asIndex() { return asIndex(null); } /** * Convert this object into an index-sized integer. * * Throws a Python exception on Overflow if specified an exception type for err. * * @param err the Python exception to raise on OverflowErrors * @return an index-sized int */ public int asIndex(PyObject err) { // OverflowErrors are handled in PyLong.asIndex return __index__().asInt(); } } /* * A very specialized tuple-like class used when detecting cycles during * object comparisons. This classes is different from an normal tuple * by hashing and comparing its elements by identity. */ class PyIdentityTuple extends PyObject { PyObject[] list; public PyIdentityTuple(PyObject elements[]) { list = elements; } public int hashCode() { int x, y; int len = list.length; x = 0x345678; for (len--; len >= 0; len--) { y = System.identityHashCode(list[len]); x = (x + x + x) ^ y; } x ^= list.length; return x; } public boolean equals(Object o) { if (!(o instanceof PyIdentityTuple)) return false; PyIdentityTuple that = (PyIdentityTuple) o; if (list.length != that.list.length) return false; for (int i = 0; i < list.length; i++) { if (list[i] != that.list[i]) return false; } return true; } }




  • © 2015 - 2024 Weber Informatics LLC | Privacy Policy