001: // Copyright (c) Corporation for National Research Initiatives
002: package org.python.core;
003:
004: /**
005: * A helper class for faster implementations of commonly called methods.
006: * <p>
007: * Subclasses of PyBuiltinFunctionSet will implement some or all of the __call__
008: * method with a switch on the index number.
009: *
010: */
011: public class PyBuiltinFunctionSet extends PyBuiltinFunction {
012:
013: public static final Class exposed_as = PyBuiltinFunction.class;
014:
015: // used as an index into a big switch statement in the various derived
016: // class's __call__() methods.
017: protected int index;
018:
019: private PyObject doc = Py.None;
020:
021: /**
022: * Creates a PyBuiltinFunctionSet that expects 1 argument.
023: */
024: public PyBuiltinFunctionSet(String name, int index) {
025: this (name, index, 1);
026: }
027:
028: public PyBuiltinFunctionSet(String name, int index, int numargs) {
029: this (name, index, numargs, numargs);
030: }
031:
032: public PyBuiltinFunctionSet(String name, int index, int minargs,
033: int maxargs) {
034: this (name, index, minargs, maxargs, null);
035: }
036:
037: // full-blown constructor, specifying everything
038: public PyBuiltinFunctionSet(String name, int index, int minargs,
039: int maxargs, String doc) {
040: super (new DefaultInfo(name, minargs, maxargs));
041: this .index = index;
042: if (doc != null) {
043: this .doc = Py.newString(doc);
044: }
045: }
046:
047: public PyObject fastGetDoc() {
048: return doc;
049: }
050:
051: public boolean isMappingType() {
052: return false;
053: }
054:
055: public boolean isNumberType() {
056: return false;
057: }
058:
059: public boolean isSequenceType() {
060: return false;
061: }
062:
063: public PyObject fancyCall(PyObject[] args) {
064: throw info.unexpectedCall(args.length, false);
065: }
066:
067: public PyObject __call__(PyObject[] args) {
068: int nargs = args.length;
069: switch (nargs) {
070: case 0:
071: return __call__();
072: case 1:
073: return __call__(args[0]);
074: case 2:
075: return __call__(args[0], args[1]);
076: case 3:
077: return __call__(args[0], args[1], args[2]);
078: case 4:
079: return __call__(args[0], args[1], args[2], args[3]);
080: default:
081: return fancyCall(args);
082: }
083: }
084:
085: public PyObject __call__(PyObject[] args, String[] kws) {
086: if (kws.length != 0) {
087: throw Py.TypeError(safeRepr()
088: + "(): this function takes no keyword arguments");
089: }
090: return __call__(args);
091: }
092:
093: public PyObject __call__() {
094: throw info.unexpectedCall(0, false);
095: }
096:
097: public PyObject __call__(PyObject arg1) {
098: throw info.unexpectedCall(1, false);
099: }
100:
101: public PyObject __call__(PyObject arg1, PyObject arg2) {
102: throw info.unexpectedCall(2, false);
103: }
104:
105: public PyObject __call__(PyObject arg1, PyObject arg2, PyObject arg3) {
106: throw info.unexpectedCall(3, false);
107: }
108:
109: public PyObject __call__(PyObject arg1, PyObject arg2,
110: PyObject arg3, PyObject arg4) {
111: throw info.unexpectedCall(4, false);
112: }
113:
114: protected PyBuiltinFunction bind(PyObject self) {
115: throw Py.TypeError("Can't bind a builtin function");
116: }
117:
118: public String toString() {
119: return "<built-in function " + info.getName() + ">";
120: }
121:
122: }
|