diff --git a/src/runtime/builtin_modules/builtins.cpp b/src/runtime/builtin_modules/builtins.cpp index a758f19a6..334cc7b04 100644 --- a/src/runtime/builtin_modules/builtins.cpp +++ b/src/runtime/builtin_modules/builtins.cpp @@ -1528,6 +1528,322 @@ extern "C" { BoxedClass* ellipsis_cls; } +PyDoc_STRVAR(print_doc, "print(value, ..., sep=' ', end='\\n', file=sys.stdout)\n\ +\n\ +Prints the values to a stream, or to sys.stdout by default.\n\ +Optional keyword arguments:\n\ +file: a file-like object (stream); defaults to the current sys.stdout.\n\ +sep: string inserted between values, default a space.\n\ +end: string appended after the last value, default a newline."); + +PyDoc_STRVAR(range_doc, "range(stop) -> list of integers\n\ +range(start, stop[, step]) -> list of integers\n\ +\n\ +Return a list containing an arithmetic progression of integers.\n\ +range(i, j) returns [i, i+1, i+2, ..., j-1]; start (!) defaults to 0.\n\ +When step is given, it specifies the increment (or decrement).\n\ +For example, range(4) returns [0, 1, 2, 3]. The end point is omitted!\n\ +These are exactly the valid indices for a list of 4 elements."); + +PyDoc_STRVAR(raw_input_doc, "raw_input([prompt]) -> string\n\ +\n\ +Read a string from standard input. The trailing newline is stripped.\n\ +If the user hits EOF (Unix: Ctl-D, Windows: Ctl-Z+Return), raise EOFError.\n\ +On Unix, GNU readline is used if enabled. The prompt string, if given,\n\ +is printed without a trailing newline before reading."); + +PyDoc_STRVAR(reduce_doc, "reduce(function, sequence[, initial]) -> value\n\ +\n\ +Apply a function of two arguments cumulatively to the items of a sequence,\n\ +from left to right, so as to reduce the sequence to a single value.\n\ +For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates\n\ +((((1+2)+3)+4)+5). If initial is present, it is placed before the items\n\ +of the sequence in the calculation, and serves as a default when the\n\ +sequence is empty."); + +PyDoc_STRVAR(reload_doc, "reload(module) -> module\n\ +\n\ +Reload the module. The module must have been successfully imported before."); + +PyDoc_STRVAR(repr_doc, "repr(object) -> string\n\ +\n\ +Return the canonical string representation of the object.\n\ +For most object types, eval(repr(object)) == object."); + +PyDoc_STRVAR(round_doc, "round(number[, ndigits]) -> floating point number\n\ +\n\ +Round a number to a given precision in decimal digits (default 0 digits).\n\ +This always returns a floating point number. Precision may be negative."); + +PyDoc_STRVAR(sorted_doc, "sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list"); + +PyDoc_STRVAR(vars_doc, "vars([object]) -> dictionary\n\ +\n\ +Without arguments, equivalent to locals().\n\ +With an argument, equivalent to object.__dict__."); + +PyDoc_STRVAR(sum_doc, "sum(sequence[, start]) -> value\n\ +\n\ +Return the sum of a sequence of numbers (NOT strings) plus the value\n\ +of parameter 'start' (which defaults to 0). When the sequence is\n\ +empty, return start."); + +PyDoc_STRVAR(isinstance_doc, "isinstance(object, class-or-type-or-tuple) -> bool\n\ +\n\ +Return whether an object is an instance of a class or of a subclass thereof.\n\ +With a type as second argument, return whether that is the object's type.\n\ +The form using a tuple, isinstance(x, (A, B, ...)), is a shortcut for\n\ +isinstance(x, A) or isinstance(x, B) or ... (etc.)."); + +PyDoc_STRVAR(issubclass_doc, "issubclass(C, B) -> bool\n\ +\n\ +Return whether class C is a subclass (i.e., a derived class) of class B.\n\ +When using a tuple as the second argument issubclass(X, (A, B, ...)),\n\ +is a shortcut for issubclass(X, A) or issubclass(X, B) or ... (etc.)."); + +PyDoc_STRVAR(zip_doc, "zip(seq1 [, seq2 [...]]) -> [(seq1[0], seq2[0] ...), (...)]\n\ +\n\ +Return a list of tuples, where each tuple contains the i-th element\n\ +from each of the argument sequences. The returned list is truncated\n\ +in length to the length of the shortest argument sequence."); + +PyDoc_STRVAR(builtin_doc, "Built-in functions, exceptions, and other objects.\n\ +\n\ +Noteworthy: None is the `nil' object; Ellipsis represents `...' in slices."); + +PyDoc_STRVAR(import_doc, "__import__(name, globals={}, locals={}, fromlist=[], level=-1) -> module\n\ +\n\ +Import a module. Because this function is meant for use by the Python\n\ +interpreter and not for general use it is better to use\n\ +importlib.import_module() to programmatically import a module.\n\ +\n\ +The globals argument is only used to determine the context;\n\ +they are not modified. The locals argument is unused. The fromlist\n\ +should be a list of names to emulate ``from name import ...'', or an\n\ +empty list to emulate ``import name''.\n\ +When importing a module from a package, note that __import__('A.B', ...)\n\ +returns package A when fromlist is empty, but its submodule B when\n\ +fromlist is not empty. Level is used to determine whether to perform \n\ +absolute or relative imports. -1 is the original strategy of attempting\n\ +both absolute and relative imports, 0 is absolute, a positive number\n\ +is the number of parent directories to search relative to the current module."); + +PyDoc_STRVAR(abs_doc, "abs(number) -> number\n\ +\n\ +Return the absolute value of the argument."); + +PyDoc_STRVAR(all_doc, "all(iterable) -> bool\n\ +\n\ +Return True if bool(x) is True for all values x in the iterable.\n\ +If the iterable is empty, return True."); + +PyDoc_STRVAR(any_doc, "any(iterable) -> bool\n\ +\n\ +Return True if bool(x) is True for any x in the iterable.\n\ +If the iterable is empty, return False."); + +PyDoc_STRVAR(apply_doc, "apply(object[, args[, kwargs]]) -> value\n\ +\n\ + Call a callable object with positional arguments taken from the tuple args,\n\ + and keyword arguments taken from the optional dictionary kwargs.\n\ + Note that classes are callable, as are instances with a __call__() method.\n\ +\n\ + Deprecated since release 2.3. Instead, use the extended call syntax:\n\ + function(*args, **keywords)."); + +PyDoc_STRVAR(bin_doc, "bin(number) -> string\n\ +\n\ +Return the binary representation of an integer or long integer."); + +PyDoc_STRVAR(callable_doc, "callable(object) -> bool\n\ +\n\ +Return whether the object is callable (i.e., some kind of function).\n\ +Note that classes are callable, as are instances with a __call__() method."); + +PyDoc_STRVAR(filter_doc, "filter(function or None, sequence) -> list, tuple, or string\n" + "\n" + "Return those items of sequence for which function(item) is true. If\n" + "function is None, return the items that are true. If sequence is a tuple\n" + "or string, return the same type, else return a list."); + +PyDoc_STRVAR(format_doc, "format(value[, format_spec]) -> string\n\ +\n\ +Returns value.__format__(format_spec)\n\ +format_spec defaults to \"\""); + +PyDoc_STRVAR(chr_doc, "chr(i) -> character\n\ +\n\ +Return a string of one character with ordinal i; 0 <= i < 256."); + +PyDoc_STRVAR(unichr_doc, "unichr(i) -> Unicode character\n\ +\n\ +Return a Unicode string of one character with ordinal i; 0 <= i <= 0x10ffff."); + +PyDoc_STRVAR(cmp_doc, "cmp(x, y) -> integer\n\ +\n\ +Return negative if xy."); + +PyDoc_STRVAR(coerce_doc, "coerce(x, y) -> (x1, y1)\n\ +\n\ +Return a tuple consisting of the two numeric arguments converted to\n\ +a common type, using the same rules as used by arithmetic operations.\n\ +If coercion is not possible, raise TypeError."); + +PyDoc_STRVAR(compile_doc, "compile(source, filename, mode[, flags[, dont_inherit]]) -> code object\n\ +\n\ +Compile the source string (a Python module, statement or expression)\n\ +into a code object that can be executed by the exec statement or eval().\n\ +The filename will be used for run-time error messages.\n\ +The mode must be 'exec' to compile a module, 'single' to compile a\n\ +single (interactive) statement, or 'eval' to compile an expression.\n\ +The flags argument, if present, controls which future statements influence\n\ +the compilation of the code.\n\ +The dont_inherit argument, if non-zero, stops the compilation inheriting\n\ +the effects of any future statements in effect in the code calling\n\ +compile; if absent or zero these statements do influence the compilation,\n\ +in addition to any features explicitly specified."); + +PyDoc_STRVAR(dir_doc, "dir([object]) -> list of strings\n" + "\n" + "If called without an argument, return the names in the current scope.\n" + "Else, return an alphabetized list of names comprising (some of) the attributes\n" + "of the given object, and of attributes reachable from it.\n" + "If the object supplies a method named __dir__, it will be used; otherwise\n" + "the default dir() logic is used and returns:\n" + " for a module object: the module's attributes.\n" + " for a class object: its attributes, and recursively the attributes\n" + " of its bases.\n" + " for any other object: its attributes, its class's attributes, and\n" + " recursively the attributes of its class's base classes."); + +PyDoc_STRVAR(divmod_doc, "divmod(x, y) -> (quotient, remainder)\n\ +\n\ +Return the tuple ((x-x%y)/y, x%y). Invariant: div*y + mod == x."); + +PyDoc_STRVAR(eval_doc, "eval(source[, globals[, locals]]) -> value\n\ +\n\ +Evaluate the source in the context of globals and locals.\n\ +The source may be a string representing a Python expression\n\ +or a code object as returned by compile().\n\ +The globals must be a dictionary and locals can be any mapping,\n\ +defaulting to the current globals and locals.\n\ +If only globals is given, locals defaults to it.\n"); + +PyDoc_STRVAR(execfile_doc, "execfile(filename[, globals[, locals]])\n\ +\n\ +Read and execute a Python script from a file.\n\ +The globals and locals are dictionaries, defaulting to the current\n\ +globals and locals. If only globals is given, locals defaults to it."); + +PyDoc_STRVAR(getattr_doc, "getattr(object, name[, default]) -> value\n\ +\n\ +Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.\n\ +When a default argument is given, it is returned when the attribute doesn't\n\ +exist; without it, an exception is raised in that case."); + +PyDoc_STRVAR(globals_doc, "globals() -> dictionary\n\ +\n\ +Return the dictionary containing the current scope's global variables."); + +PyDoc_STRVAR(hasattr_doc, "hasattr(object, name) -> bool\n\ +\n\ +Return whether the object has an attribute with the given name.\n\ +(This is done by calling getattr(object, name) and catching exceptions.)"); + +PyDoc_STRVAR(id_doc, "id(object) -> integer\n\ +\n\ +Return the identity of an object. This is guaranteed to be unique among\n\ +simultaneously existing objects. (Hint: it's the object's memory address.)"); + +PyDoc_STRVAR(map_doc, "map(function, sequence[, sequence, ...]) -> list\n\ +\n\ +Return a list of the results of applying the function to the items of\n\ +the argument sequence(s). If more than one sequence is given, the\n\ +function is called with an argument list consisting of the corresponding\n\ +item of each sequence, substituting None for missing values when not all\n\ +sequences have the same length. If the function is None, return a list of\n\ +the items of the sequence (or a list of tuples if more than one sequence)."); + +PyDoc_STRVAR(next_doc, "next(iterator[, default])\n\ +\n\ +Return the next item from the iterator. If default is given and the iterator\n\ +is exhausted, it is returned instead of raising StopIteration."); + +PyDoc_STRVAR(setattr_doc, "setattr(object, name, value)\n\ +\n\ +Set a named attribute on an object; setattr(x, 'y', v) is equivalent to\n\ +``x.y = v''."); + +PyDoc_STRVAR(delattr_doc, "delattr(object, name)\n\ +\n\ +Delete a named attribute on an object; delattr(x, 'y') is equivalent to\n\ +``del x.y''."); + +PyDoc_STRVAR(hash_doc, "hash(object) -> integer\n\ +\n\ +Return a hash value for the object. Two objects with the same value have\n\ +the same hash value. The reverse is not necessarily true, but likely."); + +PyDoc_STRVAR(hex_doc, "hex(number) -> string\n\ +\n\ +Return the hexadecimal representation of an integer or long integer."); + +PyDoc_STRVAR(input_doc, "input([prompt]) -> value\n\ +\n\ +Equivalent to eval(raw_input(prompt))."); + +PyDoc_STRVAR(intern_doc, "intern(string) -> string\n\ +\n\ +``Intern'' the given string. This enters the string in the (global)\n\ +table of interned strings whose purpose is to speed up dictionary lookups.\n\ +Return the string itself or the previously interned string object with the\n\ +same value."); + +PyDoc_STRVAR(iter_doc, "iter(collection) -> iterator\n\ +iter(callable, sentinel) -> iterator\n\ +\n\ +Get an iterator from an object. In the first form, the argument must\n\ +supply its own iterator, or be a sequence.\n\ +In the second form, the callable is called until it returns the sentinel."); + +PyDoc_STRVAR(len_doc, "len(object) -> integer\n\ +\n\ +Return the number of items of a sequence or mapping."); + +PyDoc_STRVAR(locals_doc, "locals() -> dictionary\n\ +\n\ +Update and return a dictionary containing the current scope's local variables."); + +PyDoc_STRVAR(min_doc, "min(iterable[, key=func]) -> value\n\ +min(a, b, c, ...[, key=func]) -> value\n\ +\n\ +With a single iterable argument, return its smallest item.\n\ +With two or more arguments, return the smallest argument."); + +PyDoc_STRVAR(max_doc, "max(iterable[, key=func]) -> value\n\ +max(a, b, c, ...[, key=func]) -> value\n\ +\n\ +With a single iterable argument, return its largest item.\n\ +With two or more arguments, return the largest argument."); + +PyDoc_STRVAR(oct_doc, "oct(number) -> string\n\ +\n\ +Return the octal representation of an integer or long integer."); + +PyDoc_STRVAR(open_doc, "open(name[, mode[, buffering]]) -> file object\n\ +\n\ +Open a file using the file() type, returns a file object. This is the\n\ +preferred way to open a file. See file.__doc__ for further information."); + +PyDoc_STRVAR(ord_doc, "ord(c) -> integer\n\ +\n\ +Return the integer ordinal of a one-character string."); + +PyDoc_STRVAR(pow_doc, "pow(x, y[, z]) -> number\n\ +\n\ +With two arguments, equivalent to x**y. With three arguments,\n\ +equivalent to (x**y) % z, but may be more efficient (e.g. for longs)."); + void setupBuiltins() { builtins_module = createModule(boxString("__builtin__"), NULL, "Built-in functions, exceptions, and other objects.\n\nNoteworthy: None is " @@ -1544,8 +1860,8 @@ void setupBuiltins() { builtins_module->giveAttr("__debug__", False); - builtins_module->giveAttr( - "print", new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)print, NONE, 0, true, true), "print")); + builtins_module->giveAttr("print", new BoxedBuiltinFunctionOrMethod( + boxRTFunction((void*)print, NONE, 0, true, true), "print", print_doc)); notimplemented_cls = BoxedClass::create(type_cls, object_cls, NULL, 0, 0, sizeof(Box), false, "NotImplementedType"); notimplemented_cls->giveAttr("__repr__", new BoxedFunction(boxRTFunction((void*)notimplementedRepr, STR, 1))); @@ -1555,52 +1871,57 @@ void setupBuiltins() { builtins_module->giveAttr("NotImplemented", NotImplemented); - builtins_module->giveAttr("all", new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)all, BOXED_BOOL, 1), "all")); - builtins_module->giveAttr("any", new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)any, BOXED_BOOL, 1), "any")); + builtins_module->giveAttr( + "all", new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)all, BOXED_BOOL, 1), "all", all_doc)); + builtins_module->giveAttr( + "any", new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)any, BOXED_BOOL, 1), "any", any_doc)); builtins_module->giveAttr( "apply", new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)builtinApply, UNKNOWN, 3, false, false), "apply", - { NULL })); + { NULL }, NULL, apply_doc)); - repr_obj = new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)repr, UNKNOWN, 1), "repr"); + repr_obj = new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)repr, UNKNOWN, 1), "repr", repr_doc); builtins_module->giveAttr("repr", repr_obj); auto len_func = boxRTFunction((void*)len, UNKNOWN, 1); len_func->internal_callable.cxx_val = lenCallInternal; - len_obj = new BoxedBuiltinFunctionOrMethod(len_func, "len"); + len_obj = new BoxedBuiltinFunctionOrMethod(len_func, "len", len_doc); builtins_module->giveAttr("len", len_obj); - hash_obj = new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)hash, UNKNOWN, 1), "hash"); + hash_obj = new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)hash, UNKNOWN, 1), "hash", hash_doc); builtins_module->giveAttr("hash", hash_obj); - abs_obj = new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)abs_, UNKNOWN, 1), "abs"); + abs_obj = new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)abs_, UNKNOWN, 1), "abs", abs_doc); builtins_module->giveAttr("abs", abs_obj); - builtins_module->giveAttr("bin", - new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)binFunc, UNKNOWN, 1), "bin")); - builtins_module->giveAttr("hex", - new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)hexFunc, UNKNOWN, 1), "hex")); - builtins_module->giveAttr("oct", - new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)octFunc, UNKNOWN, 1), "oct")); - - min_obj = new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)min, UNKNOWN, 1, true, true), "min", { None }); + builtins_module->giveAttr( + "bin", new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)binFunc, UNKNOWN, 1), "bin", bin_doc)); + builtins_module->giveAttr( + "hex", new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)hexFunc, UNKNOWN, 1), "hex", hex_doc)); + builtins_module->giveAttr( + "oct", new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)octFunc, UNKNOWN, 1), "oct", oct_doc)); + + min_obj = new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)min, UNKNOWN, 1, true, true), "min", { None }, NULL, + min_doc); builtins_module->giveAttr("min", min_obj); - max_obj = new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)max, UNKNOWN, 1, true, true), "max", { None }); + max_obj = new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)max, UNKNOWN, 1, true, true), "max", { None }, NULL, + max_doc); builtins_module->giveAttr("max", max_obj); - builtins_module->giveAttr( - "next", new BoxedBuiltinFunctionOrMethod( - boxRTFunction((void*)next, UNKNOWN, 2, false, false, ParamNames::empty(), CAPI), "next", { NULL })); + builtins_module->giveAttr("next", new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)next, UNKNOWN, 2, false, + false, ParamNames::empty(), CAPI), + "next", { NULL }, NULL, next_doc)); - builtins_module->giveAttr("sum", new BoxedBuiltinFunctionOrMethod( - boxRTFunction((void*)sum, UNKNOWN, 2, false, false), "sum", { boxInt(0) })); + builtins_module->giveAttr("sum", + new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)sum, UNKNOWN, 2, false, false), + "sum", { boxInt(0) }, NULL, sum_doc)); - id_obj = new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)id, BOXED_INT, 1), "id"); + id_obj = new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)id, BOXED_INT, 1), "id", id_doc); builtins_module->giveAttr("id", id_obj); - chr_obj = new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)chr, STR, 1), "chr"); + chr_obj = new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)chr, STR, 1), "chr", chr_doc); builtins_module->giveAttr("chr", chr_obj); - builtins_module->giveAttr("unichr", - new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)unichr, UNKNOWN, 1), "unichr")); - ord_obj = new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)ord, BOXED_INT, 1), "ord"); + builtins_module->giveAttr( + "unichr", new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)unichr, UNKNOWN, 1), "unichr", unichr_doc)); + ord_obj = new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)ord, BOXED_INT, 1), "ord", ord_doc); builtins_module->giveAttr("ord", ord_obj); trap_obj = new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)trap, UNKNOWN, 0), "trap"); builtins_module->giveAttr("trap", trap_obj); @@ -1609,40 +1930,45 @@ void setupBuiltins() { builtins_module->giveAttr( "dumpAddr", new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)pydumpAddr, UNKNOWN, 1), "dumpAddr")); - builtins_module->giveAttr("delattr", - new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)delattrFunc, NONE, 2), "delattr")); + builtins_module->giveAttr("delattr", new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)delattrFunc, NONE, 2), + "delattr", delattr_doc)); auto getattr_func = createRTFunction(3, true, true, ParamNames::empty()); getattr_func->internal_callable.capi_val = &getattrFuncInternal; getattr_func->internal_callable.cxx_val = &getattrFuncInternal; - builtins_module->giveAttr("getattr", new BoxedBuiltinFunctionOrMethod(getattr_func, "getattr", { NULL })); + builtins_module->giveAttr("getattr", + new BoxedBuiltinFunctionOrMethod(getattr_func, "getattr", { NULL }, NULL, getattr_doc)); - builtins_module->giveAttr("setattr", new BoxedBuiltinFunctionOrMethod( - boxRTFunction((void*)setattrFunc, UNKNOWN, 3, false, false), "setattr")); + builtins_module->giveAttr( + "setattr", new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)setattrFunc, UNKNOWN, 3, false, false), + "setattr", setattr_doc)); auto hasattr_func = createRTFunction(2, false, false); hasattr_func->internal_callable.capi_val = &hasattrFuncInternal; hasattr_func->internal_callable.cxx_val = &hasattrFuncInternal; - builtins_module->giveAttr("hasattr", new BoxedBuiltinFunctionOrMethod(hasattr_func, "hasattr")); + builtins_module->giveAttr("hasattr", new BoxedBuiltinFunctionOrMethod(hasattr_func, "hasattr", hasattr_doc)); - builtins_module->giveAttr("pow", new BoxedBuiltinFunctionOrMethod( - boxRTFunction((void*)powFunc, UNKNOWN, 3, false, false), "pow", { None })); + builtins_module->giveAttr("pow", + new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)powFunc, UNKNOWN, 3, false, false), + "pow", { None }, NULL, pow_doc)); - Box* isinstance_obj - = new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)isinstance_func, BOXED_BOOL, 2), "isinstance"); + Box* isinstance_obj = new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)isinstance_func, BOXED_BOOL, 2), + "isinstance", isinstance_doc); builtins_module->giveAttr("isinstance", isinstance_obj); - Box* issubclass_obj - = new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)issubclass_func, BOXED_BOOL, 2), "issubclass"); + Box* issubclass_obj = new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)issubclass_func, BOXED_BOOL, 2), + "issubclass", issubclass_doc); builtins_module->giveAttr("issubclass", issubclass_obj); - Box* intern_obj = new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)intern_func, UNKNOWN, 1), "intern"); + Box* intern_obj + = new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)intern_func, UNKNOWN, 1), "intern", intern_doc); builtins_module->giveAttr("intern", intern_obj); CLFunction* import_func = boxRTFunction((void*)bltinImport, UNKNOWN, 5, false, false, ParamNames({ "name", "globals", "locals", "fromlist", "level" }, "", "")); builtins_module->giveAttr("__import__", new BoxedBuiltinFunctionOrMethod(import_func, "__import__", - { None, None, None, new BoxedInt(-1) })); + { None, None, None, new BoxedInt(-1) }, + NULL, import_doc)); enumerate_cls = BoxedClass::create(type_cls, object_cls, &BoxedEnumerate::gcHandler, 0, 0, sizeof(BoxedEnumerate), false, "enumerate"); @@ -1661,17 +1987,18 @@ void setupBuiltins() { CLFunction* sorted_func = createRTFunction(4, false, false, ParamNames({ "", "cmp", "key", "reverse" }, "", "")); addRTFunction(sorted_func, (void*)sorted, LIST, { UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN }); - builtins_module->giveAttr("sorted", new BoxedBuiltinFunctionOrMethod(sorted_func, "sorted", { None, None, False })); + builtins_module->giveAttr( + "sorted", new BoxedBuiltinFunctionOrMethod(sorted_func, "sorted", { None, None, False }, NULL, sorted_doc)); builtins_module->giveAttr("True", True); builtins_module->giveAttr("False", False); - range_obj - = new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)range, LIST, 3, false, false), "range", { NULL, NULL }); + range_obj = new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)range, LIST, 3, false, false), "range", + { NULL, NULL }, NULL, range_doc); builtins_module->giveAttr("range", range_obj); auto* round_obj = new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)builtinRound, BOXED_FLOAT, 2, false, false), - "round", { boxInt(0) }); + "round", { boxInt(0) }, NULL, round_doc); builtins_module->giveAttr("round", round_obj); setupXrange(); @@ -1679,47 +2006,51 @@ void setupBuiltins() { open_obj = new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)open, typeFromClass(file_cls), 3, false, false, ParamNames({ "name", "mode", "buffering" }, "", "")), - "open", { boxString("r"), boxInt(-1) }); + "open", { boxString("r"), boxInt(-1) }, NULL, open_doc); builtins_module->giveAttr("open", open_obj); - builtins_module->giveAttr("globals", new BoxedBuiltinFunctionOrMethod( - boxRTFunction((void*)globals, UNKNOWN, 0, false, false), "globals")); + builtins_module->giveAttr("globals", + new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)globals, UNKNOWN, 0, false, false), + "globals", globals_doc)); builtins_module->giveAttr( - "locals", new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)locals, UNKNOWN, 0, false, false), "locals")); + "locals", + new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)locals, UNKNOWN, 0, false, false), "locals", locals_doc)); builtins_module->giveAttr( "iter", new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)builtinIter, UNKNOWN, 2, false, false), "iter", - { NULL })); + { NULL }, NULL, iter_doc)); builtins_module->giveAttr("reversed", new BoxedBuiltinFunctionOrMethod( boxRTFunction((void*)getreversed, UNKNOWN, 1, false, false), "reversed")); - builtins_module->giveAttr("coerce", new BoxedBuiltinFunctionOrMethod( - boxRTFunction((void*)coerceFunc, UNKNOWN, 2, false, false), "coerce")); - builtins_module->giveAttr("divmod", - new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)divmod, UNKNOWN, 2), "divmod")); + builtins_module->giveAttr( + "coerce", new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)coerceFunc, UNKNOWN, 2, false, false), "coerce", + coerce_doc)); + builtins_module->giveAttr( + "divmod", new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)divmod, UNKNOWN, 2), "divmod", divmod_doc)); builtins_module->giveAttr("execfile", new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)execfile, UNKNOWN, 3, false, false), - "execfile", { NULL, NULL })); + "execfile", { NULL, NULL }, NULL, execfile_doc)); CLFunction* compile_func = createRTFunction( 5, false, false, ParamNames({ "source", "filename", "mode", "flags", "dont_inherit" }, "", "")); addRTFunction(compile_func, (void*)compile, UNKNOWN, { UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN }); - builtins_module->giveAttr("compile", - new BoxedBuiltinFunctionOrMethod(compile_func, "compile", { boxInt(0), boxInt(0) })); + builtins_module->giveAttr("compile", new BoxedBuiltinFunctionOrMethod(compile_func, "compile", + { boxInt(0), boxInt(0) }, NULL, compile_doc)); - builtins_module->giveAttr("map", - new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)map, LIST, 1, true, false), "map")); builtins_module->giveAttr( - "reduce", - new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)reduce, UNKNOWN, 3, false, false), "reduce", { NULL })); - builtins_module->giveAttr("filter", - new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)filter2, UNKNOWN, 2), "filter")); - builtins_module->giveAttr("zip", - new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)zip, LIST, 0, true, false), "zip")); + "map", new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)map, LIST, 1, true, false), "map", map_doc)); + builtins_module->giveAttr("reduce", + new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)reduce, UNKNOWN, 3, false, false), + "reduce", { NULL }, NULL, reduce_doc)); builtins_module->giveAttr( - "dir", new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)dir, LIST, 1, false, false), "dir", { NULL })); - builtins_module->giveAttr("vars", new BoxedBuiltinFunctionOrMethod( - boxRTFunction((void*)vars, UNKNOWN, 1, false, false), "vars", { NULL })); + "filter", new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)filter2, UNKNOWN, 2), "filter", filter_doc)); + builtins_module->giveAttr( + "zip", new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)zip, LIST, 0, true, false), "zip", zip_doc)); + builtins_module->giveAttr("dir", new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)dir, LIST, 1, false, false), + "dir", { NULL }, NULL, dir_doc)); + builtins_module->giveAttr("vars", + new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)vars, UNKNOWN, 1, false, false), + "vars", { NULL }, NULL, vars_doc)); builtins_module->giveAttr("object", object_cls); builtins_module->giveAttr("str", str_cls); builtins_module->giveAttr("bytes", str_cls); @@ -1755,20 +2086,21 @@ void setupBuiltins() { PyType_Ready(&PyBuffer_Type); builtins_module->giveAttr("buffer", &PyBuffer_Type); - builtins_module->giveAttr( - "eval", - new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)eval, UNKNOWN, 3, false, false), "eval", { NULL, NULL })); - builtins_module->giveAttr("callable", - new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)callable, UNKNOWN, 1), "callable")); + builtins_module->giveAttr("eval", + new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)eval, UNKNOWN, 3, false, false), + "eval", { NULL, NULL }, NULL, eval_doc)); + builtins_module->giveAttr("callable", new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)callable, UNKNOWN, 1), + "callable", callable_doc)); builtins_module->giveAttr("raw_input", new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)rawInput, UNKNOWN, 1, false, false), - "raw_input", { NULL })); - builtins_module->giveAttr("input", new BoxedBuiltinFunctionOrMethod( - boxRTFunction((void*)input, UNKNOWN, 1, false, false), "input", { NULL })); - builtins_module->giveAttr("cmp", - new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)builtinCmp, UNKNOWN, 2), "cmp")); + "raw_input", { NULL }, NULL, raw_input_doc)); + builtins_module->giveAttr("input", + new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)input, UNKNOWN, 1, false, false), + "input", { NULL }, NULL, input_doc)); builtins_module->giveAttr( - "format", new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)builtinFormat, UNKNOWN, 2), "format")); + "cmp", new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)builtinCmp, UNKNOWN, 2), "cmp", cmp_doc)); + builtins_module->giveAttr("format", new BoxedBuiltinFunctionOrMethod( + boxRTFunction((void*)builtinFormat, UNKNOWN, 2), "format", format_doc)); } } diff --git a/src/runtime/builtin_modules/gc.cpp b/src/runtime/builtin_modules/gc.cpp index 52c79315b..dc3a3dc40 100644 --- a/src/runtime/builtin_modules/gc.cpp +++ b/src/runtime/builtin_modules/gc.cpp @@ -42,14 +42,32 @@ static Box* enable() { return None; } +PyDoc_STRVAR(gc_enable_doc, "enable() -> None\n" + "\n" + "Enable automatic garbage collection.\n"); + +PyDoc_STRVAR(gc_disable_doc, "disable() -> None\n" + "\n" + "Disable automatic garbage collection.\n"); + +PyDoc_STRVAR(gc_isenabled_doc, "isenabled() -> status\n" + "\n" + "Returns true if automatic garbage collection is enabled.\n"); + +PyDoc_STRVAR(gc_collect_doc, "collect() -> n\n" + "\n" + "Run a full collection.\n"); + void setupGC() { BoxedModule* gc_module = createModule(boxString("gc")); - gc_module->giveAttr("collect", - new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)gcCollect, NONE, 0), "collect")); - gc_module->giveAttr("isenabled", - new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)isEnabled, BOXED_BOOL, 0), "isenabled")); - gc_module->giveAttr("disable", new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)disable, NONE, 0), "disable")); - gc_module->giveAttr("enable", new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)enable, NONE, 0), "enable")); + gc_module->giveAttr("collect", new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)gcCollect, NONE, 0), "collect", + gc_collect_doc)); + gc_module->giveAttr("isenabled", new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)isEnabled, BOXED_BOOL, 0), + "isenabled", gc_isenabled_doc)); + gc_module->giveAttr( + "disable", new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)disable, NONE, 0), "disable", gc_disable_doc)); + gc_module->giveAttr( + "enable", new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)enable, NONE, 0), "enable", gc_enable_doc)); } } diff --git a/src/runtime/builtin_modules/sys.cpp b/src/runtime/builtin_modules/sys.cpp index 8f61b4d91..38674488c 100644 --- a/src/runtime/builtin_modules/sys.cpp +++ b/src/runtime/builtin_modules/sys.cpp @@ -590,6 +590,43 @@ PyObject* PyFloat_GetInfo(void) { return floatinfo; } +PyDoc_STRVAR(exc_info_doc, "exc_info() -> (type, value, traceback)\n\ +\n\ +Return information about the most recent exception caught by an except\n\ +clause in the current stack frame or in an older stack frame."); + +PyDoc_STRVAR(exc_clear_doc, "exc_clear() -> None\n\ +\n\ +Clear global information on the current exception. Subsequent calls to\n\ +exc_info() will return (None,None,None) until another exception is raised\n\ +in the current thread or the execution stack returns to a frame where\n\ +another exception is being handled."); + + +PyDoc_STRVAR(exit_doc, "exit([status])\n\ +\n\ +Exit the interpreter by raising SystemExit(status).\n\ +If the status is omitted or None, it defaults to zero (i.e., success).\n\ +If the status is an integer, it will be used as the system exit status.\n\ +If it is another kind of object, it will be printed and the system\n\ +exit status will be one (i.e., failure)."); + +PyDoc_STRVAR(getdefaultencoding_doc, "getdefaultencoding() -> string\n\ +\n\ +Return the current default string encoding used by the Unicode \n\ +implementation."); + +PyDoc_STRVAR(getfilesystemencoding_doc, "getfilesystemencoding() -> string\n\ +\n\ +Return the encoding used to convert Unicode filenames in\n\ +operating system filenames."); + +PyDoc_STRVAR(getrecursionlimit_doc, "getrecursionlimit()\n\ +\n\ +Return the current value of the recursion limit, the maximum depth\n\ +of the Python interpreter stack. This limit prevents infinite\n\ +recursion from causing an overflow of the C stack and crashing Python."); + void setupSys() { sys_modules_dict = new BoxedDict(); gc::registerPermanentRoot(sys_modules_dict); @@ -611,12 +648,12 @@ void setupSys() { sys_module->giveAttr("__stdin__", sys_module->getattr(internStringMortal("stdin"))); sys_module->giveAttr("__stderr__", sys_module->getattr(internStringMortal("stderr"))); - sys_module->giveAttr( - "exc_info", new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)sysExcInfo, BOXED_TUPLE, 0), "exc_info")); - sys_module->giveAttr("exc_clear", - new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)sysExcClear, NONE, 0), "exc_clear")); + sys_module->giveAttr("exc_info", new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)sysExcInfo, BOXED_TUPLE, 0), + "exc_info", exc_info_doc)); + sys_module->giveAttr("exc_clear", new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)sysExcClear, NONE, 0), + "exc_clear", exc_clear_doc)); sys_module->giveAttr("exit", new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)sysExit, NONE, 1, false, false), - "exit", { None })); + "exit", { None }, NULL, exit_doc)); sys_module->giveAttr("warnoptions", new BoxedList()); sys_module->giveAttr("py3kwarning", False); @@ -628,17 +665,17 @@ void setupSys() { sys_module->giveAttr("_getframe", new BoxedFunction(boxRTFunction((void*)sysGetFrame, UNKNOWN, 1, false, false), { NULL })); - sys_module->giveAttr( - "getdefaultencoding", - new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)sysGetDefaultEncoding, STR, 0), "getdefaultencoding")); + sys_module->giveAttr("getdefaultencoding", + new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)sysGetDefaultEncoding, STR, 0), + "getdefaultencoding", getdefaultencoding_doc)); sys_module->giveAttr("getfilesystemencoding", new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)sysGetFilesystemEncoding, STR, 0), - "getfilesystemencoding")); + "getfilesystemencoding", getfilesystemencoding_doc)); - sys_module->giveAttr( - "getrecursionlimit", - new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)sysGetRecursionLimit, UNKNOWN, 0), "getrecursionlimit")); + sys_module->giveAttr("getrecursionlimit", + new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)sysGetRecursionLimit, UNKNOWN, 0), + "getrecursionlimit", getrecursionlimit_doc)); sys_module->giveAttr("meta_path", new BoxedList()); sys_module->giveAttr("path_hooks", new BoxedList()); diff --git a/src/runtime/float.cpp b/src/runtime/float.cpp index fd00f40fb..04167c695 100644 --- a/src/runtime/float.cpp +++ b/src/runtime/float.cpp @@ -1027,7 +1027,7 @@ static void floatFormatInit() { } // ported pretty directly from cpython -Box* floatGetFormat(BoxedClass* v, Box* arg) { +Box* floatGetFormat(Box* arg) { char* s; float_format_type r; @@ -1692,9 +1692,8 @@ void setupFloat() { float_cls->giveAttr("imag", new (pyston_getset_cls) BoxedGetsetDescriptor(float0, NULL, NULL)); float_cls->giveAttr("conjugate", new BoxedFunction(boxRTFunction((void*)floatConjugate, BOXED_FLOAT, 1))); - float_cls->giveAttr("__getformat__", - new BoxedClassmethod(new BoxedBuiltinFunctionOrMethod( - boxRTFunction((void*)floatGetFormat, STR, 2), "__getformat__", floatGetFormatDoc))); + float_cls->giveAttr("__getformat__", new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)floatGetFormat, STR, 1), + "__getformat__", floatGetFormatDoc)); for (auto& md : float_methods) { float_cls->giveAttr(md.ml_name, new BoxedMethodDescriptor(&md, float_cls)); diff --git a/src/runtime/import.cpp b/src/runtime/import.cpp index 70136e75e..eb6ac2d76 100644 --- a/src/runtime/import.cpp +++ b/src/runtime/import.cpp @@ -963,6 +963,30 @@ Box* impIsFrozen(Box* name) { return False; } +PyDoc_STRVAR(find_module_doc, "find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\ +Search for a module. If path is omitted or None, search for a\n\ +built-in, frozen or special module and continue search in sys.path.\n\ +The module name cannot contain '.'; to search for a submodule of a\n\ +package, pass the submodule name and the package's __path__."); + +PyDoc_STRVAR(load_module_doc, "load_module(name, file, filename, (suffix, mode, type)) -> module\n\ +Load a module, given information returned by find_module().\n\ +The module name must include the full package name, if any."); + +PyDoc_STRVAR(get_suffixes_doc, "get_suffixes() -> [(suffix, mode, type), ...]\n\ +Return a list of (suffix, mode, type) tuples describing the files\n\ +that find_module() looks for."); + +PyDoc_STRVAR(acquire_lock_doc, "acquire_lock() -> None\n\ +Acquires the interpreter's import lock for the current thread.\n\ +This lock should be used by import hooks to ensure thread-safety\n\ +when importing modules.\n\ +On platforms without threads, this function does nothing."); + +PyDoc_STRVAR(release_lock_doc, "release_lock() -> None\n\ +Release the interpreter's import lock.\n\ +On platforms without threads, this function does nothing."); + void setupImport() { BoxedModule* imp_module = createModule(boxString("imp"), NULL, "'This module provides the components needed to build your own\n" @@ -980,17 +1004,19 @@ void setupImport() { "__init__", new BoxedFunction(boxRTFunction((void*)nullImporterInit, NONE, 2, false, false), { None })); null_importer_cls->giveAttr("find_module", new BoxedBuiltinFunctionOrMethod( boxRTFunction((void*)nullImporterFindModule, NONE, 2, false, false), - "find_module", { None })); + "find_module", { None }, NULL, find_module_doc)); null_importer_cls->freeze(); imp_module->giveAttr("NullImporter", null_importer_cls); CLFunction* find_module_func = boxRTFunction((void*)impFindModule, UNKNOWN, 2, false, false, ParamNames({ "name", "path" }, "", "")); - imp_module->giveAttr("find_module", new BoxedBuiltinFunctionOrMethod(find_module_func, "find_module", { None })); + imp_module->giveAttr("find_module", new BoxedBuiltinFunctionOrMethod(find_module_func, "find_module", { None }, + NULL, find_module_doc)); CLFunction* load_module_func = boxRTFunction((void*)impLoadModule, UNKNOWN, 4, ParamNames({ "name", "file", "pathname", "description" }, "", "")); - imp_module->giveAttr("load_module", new BoxedBuiltinFunctionOrMethod(load_module_func, "load_module")); + imp_module->giveAttr("load_module", + new BoxedBuiltinFunctionOrMethod(load_module_func, "load_module", load_module_doc)); imp_module->giveAttr("load_source", new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)impLoadSource, UNKNOWN, 3, false, false), "load_source", { NULL })); @@ -999,12 +1025,13 @@ void setupImport() { ParamNames({ "name", "pathname", "file" }, "", "")); imp_module->giveAttr("load_dynamic", new BoxedBuiltinFunctionOrMethod(load_dynamic_func, "load_dynamic", { None })); - imp_module->giveAttr("get_suffixes", new BoxedBuiltinFunctionOrMethod( - boxRTFunction((void*)impGetSuffixes, UNKNOWN, 0), "get_suffixes")); + imp_module->giveAttr("get_suffixes", + new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)impGetSuffixes, UNKNOWN, 0), + "get_suffixes", get_suffixes_doc)); imp_module->giveAttr("acquire_lock", new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)impAcquireLock, NONE, 0), - "acquire_lock")); + "acquire_lock", acquire_lock_doc)); imp_module->giveAttr("release_lock", new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)impReleaseLock, NONE, 0), - "release_lock")); + "release_lock", release_lock_doc)); imp_module->giveAttr("new_module", new BoxedBuiltinFunctionOrMethod(boxRTFunction((void*)impNewModule, MODULE, 1), "new_module"));