/** * Setup this type's special attributes. */ private void ensureAttributes() { inheritSpecial(); // special case __new__, if function => static method PyObject new_ = dict.__finditem__("__new__"); // XXX: java functions? if (new_ != null && new_ instanceof PyFunction) { dict.__setitem__("__new__", new PyStaticMethod(new_)); } ensureDoc(dict); ensureModule(dict); // Calculate method resolution order mro_internal(); cacheDescrBinds(); }
public static PyObject classobj___new__(PyObject name, PyObject bases, PyObject dict) { if (!name.getType().isSubType(PyString.TYPE)) { throw Py.TypeError("PyClass_New: name must be a string"); } if (!(dict instanceof PyStringMap || dict instanceof PyDictionary)) { throw Py.TypeError("PyClass_New: dict must be a dictionary"); } PyType.ensureDoc(dict); PyType.ensureModule(dict); if (!(bases instanceof PyTuple)) { throw Py.TypeError("PyClass_New: bases must be a tuple"); } PyTuple basesTuple = (PyTuple)bases; for (PyObject base : basesTuple.getArray()) { if (!(base instanceof PyClass)) { if (base.getType().isCallable()) { return base.getType().__call__(name, bases, dict); } else { throw Py.TypeError("PyClass_New: base must be a class"); } } } PyClass klass = new PyClass(); klass.__name__ = name.toString(); klass.__bases__ = basesTuple; klass.__dict__ = dict; klass.cacheDescriptors(); return klass; }