package org.python.core;
public class PySuper extends PyObject implements PyType.Newstyle {
//~ BEGIN GENERATED REGION -- DO NOT EDIT SEE gexpose.py
/* type info */
public static final String exposed_name = "super";
public static void typeSetup(PyObject dict, PyType.Newstyle marker) {
dict.__setitem__("__thisclass__", new PyGetSetDescr("__thisclass__", PySuper.class, "getThisClass", null, null));
dict.__setitem__("__self__", new PyGetSetDescr("__self__", PySuper.class, "getSelf", null, null));
dict.__setitem__("__self_class__", new PyGetSetDescr("__self_class__", PySuper.class, "getSelfClass", null,
null));
class exposed___getattribute__ extends PyBuiltinMethodNarrow {
exposed___getattribute__(PyObject self, PyBuiltinFunction.Info info) {
super(self, info);
}
public PyBuiltinFunction bind(PyObject self) {
return new exposed___getattribute__(self, info);
}
public PyObject __call__(PyObject arg0) {
try {
String name = (arg0.asName(0));
PyObject ret = ((PySuper) self).super___findattr__(name);
if (ret == null)
((PySuper) self).noAttributeError(name);
return ret;
} catch (PyObject.ConversionException e) {
String msg;
switch (e.index) {
case 0:
msg = "attribute name must be a string";
break;
default:
msg = "xxx";
}
throw Py.TypeError(msg);
}
}
}
dict.__setitem__("__getattribute__", new PyMethodDescr("__getattribute__", PySuper.class, 1, 1,
new exposed___getattribute__(null, null)));
class exposed___get__ extends PyBuiltinMethodNarrow {
exposed___get__(PyObject self, PyBuiltinFunction.Info info) {
super(self, info);
}
public PyBuiltinFunction bind(PyObject self) {
return new exposed___get__(self, info);
}
public PyObject __call__(PyObject arg0, PyObject arg1) {
PyObject obj = (arg0 == Py.None) ? null : arg1;
PyObject type = (arg1 == Py.None) ? null : arg0;
return ((PySuper) self).super___get__(obj, type);
}
public PyObject __call__(PyObject arg0) {
PyObject obj = (arg0 == Py.None) ? null : (null);
PyObject type = ((null) == Py.None) ? null : arg0;
return ((PySuper) self).super___get__(obj, type);
}
}
dict.__setitem__("__get__", new PyMethodDescr("__get__", PySuper.class, 1, 2, new exposed___get__(null, null)));
class exposed___init__ extends PyBuiltinMethod {
exposed___init__(PyObject self, PyBuiltinFunction.Info info) {
super(self, info);
}
public PyBuiltinFunction bind(PyObject self) {
return new exposed___init__(self, info);
}
public PyObject __call__(PyObject[] args) {
return __call__(args, Py.NoKeywords);
}
public PyObject __call__(PyObject[] args, String[] keywords) {
((PySuper) self).super_init(args, keywords);
return Py.None;
}
}
dict.__setitem__("__init__", new PyMethodDescr("__init__", PySuper.class, -1, -1, new exposed___init__(null,
null)));
dict.__setitem__("__new__", new PyNewWrapper(PySuper.class, "__new__", -1, -1) {
public PyObject new_impl(boolean init, PyType subtype, PyObject[] args, String[] keywords) {
PySuper newobj;
if (for_type == subtype) {
newobj = new PySuper();
if (init)
newobj.super_init(args, keywords);
} else {
newobj = new PySuperDerived(subtype);
}
return newobj;
}
});
}
//~ END GENERATED REGION -- DO NOT EDIT SEE gexpose.py
private static final PyType SUPERTYPE = PyType.fromClass(PySuper.class);
protected PyType thisClass;
protected PyObject self;
protected PyType selfClass;
private PyType supercheck(PyType type, PyObject obj) {
if (obj instanceof PyType && ((PyType) obj).isSubType(type)) {
return (PyType) obj;
}
PyType obj_type = obj.getType();
if (obj_type.isSubType(type))
return obj_type;
throw Py.TypeError("super(type, obj): " + "obj must be an instance or subtype of type");
}
public void super_init(PyObject[] args, String[] keywords) {
if (keywords.length != 0 || !PyBuiltinFunction.DefaultInfo.check(args.length, 1, 2)) {
throw PyBuiltinFunction.DefaultInfo.unexpectedCall(args.length, keywords.length != 0, "super", 1, 2);
}
if (!(args[0] instanceof PyType)) {
throw Py.TypeError("super: argument 1 must be type");
}
PyType type = (PyType) args[0];
PyObject obj = null;
PyType obj_type = null;
if (args.length == 2 && args[1] != Py.None)
obj = args[1];
if (obj != null) {
obj_type = supercheck(type, obj);
}
this.thisClass = type;
this.self = obj;
this.selfClass = obj_type;
}
public PySuper() {
this(SUPERTYPE);
}
public PySuper(PyType subType) {
super(subType);
}
public PyObject getSelf() {
return self;
}
public PyType getSelfClass() {
return selfClass;
}
public PyType getThisClass() {
return thisClass;
}
public PyObject __findattr__(String name) {
return super___findattr__(name);
}
final PyObject super___findattr__(String name) {
if (selfClass != null && name != "__class__") {
PyObject descr = selfClass.super_lookup(thisClass, name);
return descr.__get__(selfClass == self ? null : self, selfClass);
}
return super.__findattr__(name);
}
public PyObject __get__(PyObject obj, PyObject type) {
return super___get__(obj, type);
}
final PyObject super___get__(PyObject obj, PyObject type) { //xxx subtype case!
if (obj == null || obj == Py.None || self != null)
return this;
PyType obj_type = supercheck(this.thisClass, obj);
PySuper newsuper = new PySuper();
newsuper.thisClass = this.thisClass;
newsuper.self = obj;
newsuper.selfClass = obj_type;
return newsuper;
}
}