void setupFile() { file_cls->giveAttr("__name__", boxStrConstant("file")); CLFunction *read = boxRTFunction((void*)fileRead1, NULL, 1, false); addRTFunction(read, (void*)fileRead2, NULL, 2, false); file_cls->giveAttr("read", new BoxedFunction(read)); CLFunction *readline = boxRTFunction((void*)fileReadline1, STR, 1, false); file_cls->giveAttr("readline", new BoxedFunction(readline)); file_cls->giveAttr("write", new BoxedFunction(boxRTFunction((void*)fileWrite, NULL, 2, false))); file_cls->giveAttr("close", new BoxedFunction(boxRTFunction((void*)fileClose, NULL, 1, false))); file_cls->giveAttr("__repr__", new BoxedFunction(boxRTFunction((void*)fileRepr, NULL, 1, false))); file_cls->setattr("__str__", file_cls->peekattr("__repr__"), NULL, NULL); file_cls->giveAttr("__enter__", new BoxedFunction(boxRTFunction((void*)fileEnter, NULL, 1, false))); file_cls->giveAttr("__exit__", new BoxedFunction(boxRTFunction((void*)fileExit, NULL, 4, false))); CLFunction *__new__ = boxRTFunction((void*)fileNew2, NULL, 2, false); addRTFunction(__new__, (void*)fileNew3, NULL, 3, false); file_cls->giveAttr("__new__", new BoxedFunction(__new__)); file_cls->freeze(); }
void setupDict() { dict_cls->giveAttr("__name__", boxStrConstant("dict")); // dict_cls->giveAttr("__len__", new BoxedFunction(boxRTFunction((void*)dictLen, NULL, 1, false))); // dict_cls->giveAttr("__getitem__", new BoxedFunction(boxRTFunction((void*)dictGetitem, NULL, 2, false))); // dict_cls->giveAttr("__new__", new BoxedFunction(boxRTFunction((void*)dictNew, NULL, 1, false))); // dict_cls->giveAttr("__init__", new BoxedFunction(boxRTFunction((void*)dictInit, NULL, 1, false))); dict_cls->giveAttr("__repr__", new BoxedFunction(boxRTFunction((void*)dictRepr, NULL, 1, false))); dict_cls->setattr("__str__", dict_cls->peekattr("__repr__"), NULL, NULL); dict_cls->giveAttr("items", new BoxedFunction(boxRTFunction((void*)dictItems, NULL, 1, false))); dict_cls->setattr("iteritems", dict_cls->peekattr("items"), NULL, NULL); dict_cls->giveAttr("values", new BoxedFunction(boxRTFunction((void*)dictValues, NULL, 1, false))); dict_cls->setattr("itervalues", dict_cls->peekattr("values"), NULL, NULL); dict_cls->giveAttr("keys", new BoxedFunction(boxRTFunction((void*)dictKeys, NULL, 1, false))); dict_cls->setattr("iterkeys", dict_cls->peekattr("keys"), NULL, NULL); CLFunction* pop = boxRTFunction((void*)dictPop2, UNKNOWN, 2, false); addRTFunction(pop, (void*)dictPop3, UNKNOWN, 3, false); dict_cls->giveAttr("pop", new BoxedFunction(pop)); CLFunction* get = boxRTFunction((void*)dictGet2, UNKNOWN, 2, false); addRTFunction(get, (void*)dictGet3, UNKNOWN, 3, false); dict_cls->giveAttr("get", new BoxedFunction(get)); dict_cls->giveAttr("__getitem__", new BoxedFunction(boxRTFunction((void*)dictGetitem, NULL, 2, false))); dict_cls->giveAttr("__setitem__", new BoxedFunction(boxRTFunction((void*)dictSetitem, NULL, 3, false))); dict_cls->freeze(); }
void setupGenerator() { generator_cls = BoxedHeapClass::create(type_cls, object_cls, &BoxedGenerator::gcHandler, 0, offsetof(BoxedGenerator, weakreflist), sizeof(BoxedGenerator), false, "generator"); generator_cls->tp_dealloc = generatorDestructor; generator_cls->has_safe_tp_dealloc = true; generator_cls->giveAttr("__iter__", new BoxedFunction(boxRTFunction((void*)generatorIter, typeFromClass(generator_cls), 1))); generator_cls->giveAttr("close", new BoxedFunction(boxRTFunction((void*)generatorClose, UNKNOWN, 1))); auto generator_next = boxRTFunction((void*)generatorNext<CXX>, UNKNOWN, 1, ParamNames::empty(), CXX); addRTFunction(generator_next, (void*)generatorNext<CAPI>, UNKNOWN, CAPI); generator_cls->giveAttr("next", new BoxedFunction(generator_next)); CLFunction* hasnext = boxRTFunction((void*)generatorHasnextUnboxed, BOOL, 1); addRTFunction(hasnext, (void*)generatorHasnext, BOXED_BOOL); generator_cls->giveAttr("__hasnext__", new BoxedFunction(hasnext)); generator_cls->giveAttr("send", new BoxedFunction(boxRTFunction((void*)generatorSend<CXX>, UNKNOWN, 2))); auto gthrow = new BoxedFunction(boxRTFunction((void*)generatorThrow, UNKNOWN, 4, 2, false, false), { NULL, NULL }); generator_cls->giveAttr("throw", gthrow); generator_cls->giveAttr("__name__", new (pyston_getset_cls) BoxedGetsetDescriptor(generatorName, NULL, NULL)); generator_cls->freeze(); generator_cls->tp_iter = PyObject_SelfIter; }
static void _addFunc(const char* name, ConcreteCompilerType* rtn_type, void* complex_func, void* float_func, void* int_func, void* boxed_func) { CLFunction* cl = createRTFunction(2, 0, false, false); addRTFunction(cl, complex_func, rtn_type, { BOXED_COMPLEX, BOXED_COMPLEX }); addRTFunction(cl, float_func, rtn_type, { BOXED_COMPLEX, BOXED_FLOAT }); addRTFunction(cl, int_func, rtn_type, { BOXED_COMPLEX, BOXED_INT }); addRTFunction(cl, boxed_func, UNKNOWN, { BOXED_COMPLEX, UNKNOWN }); complex_cls->giveAttr(name, new BoxedFunction(cl)); }
static void _addFunc(const char* name, ConcreteCompilerType* rtn_type, void* float_func, void* int_func, void* boxed_func) { std::vector<ConcreteCompilerType*> v_ff, v_fi, v_fu; v_ff.push_back(BOXED_FLOAT); v_ff.push_back(BOXED_FLOAT); v_fi.push_back(BOXED_FLOAT); v_fi.push_back(BOXED_INT); v_fu.push_back(BOXED_FLOAT); v_fu.push_back(NULL); CLFunction *cl = createRTFunction(); addRTFunction(cl, float_func, rtn_type, v_ff, false); addRTFunction(cl, int_func, rtn_type, v_fi, false); addRTFunction(cl, boxed_func, NULL, v_fu, false); float_cls->giveAttr(name, new BoxedFunction(cl)); }
void setupTuple() { tuple_iterator_cls = BoxedHeapClass::create(type_cls, object_cls, &BoxedTupleIterator::gcHandler, 0, 0, sizeof(BoxedTupleIterator), false, "tuple"); tuple_cls->giveAttr("__new__", new BoxedFunction(boxRTFunction((void*)tupleNew, UNKNOWN, 1, 0, true, true))); CLFunction* getitem = createRTFunction(2, 0, 0, 0); addRTFunction(getitem, (void*)tupleGetitemInt, UNKNOWN, std::vector<ConcreteCompilerType*>{ UNKNOWN, BOXED_INT }); addRTFunction(getitem, (void*)tupleGetitemSlice, UNKNOWN, std::vector<ConcreteCompilerType*>{ UNKNOWN, SLICE }); addRTFunction(getitem, (void*)tupleGetitem<CXX>, UNKNOWN, std::vector<ConcreteCompilerType*>{ UNKNOWN, UNKNOWN }, CXX); addRTFunction(getitem, (void*)tupleGetitem<CAPI>, UNKNOWN, std::vector<ConcreteCompilerType*>{ UNKNOWN, UNKNOWN }, CAPI); tuple_cls->giveAttr("__getitem__", new BoxedFunction(getitem)); tuple_cls->giveAttr("__contains__", new BoxedFunction(boxRTFunction((void*)tupleContains, BOXED_BOOL, 2))); tuple_cls->giveAttr("index", new BoxedFunction(boxRTFunction((void*)tupleIndex, BOXED_INT, 4, 2, false, false), { boxInt(0), boxInt(std::numeric_limits<Py_ssize_t>::max()) })); tuple_cls->giveAttr("count", new BoxedFunction(boxRTFunction((void*)tupleCount, BOXED_INT, 2))); tuple_cls->giveAttr("__iter__", new BoxedFunction(boxRTFunction((void*)tupleIter, typeFromClass(tuple_iterator_cls), 1))); tuple_cls->tp_richcompare = tuplerichcompare; tuple_cls->giveAttr("__nonzero__", new BoxedFunction(boxRTFunction((void*)tupleNonzero, BOXED_BOOL, 1))); tuple_cls->giveAttr("__len__", new BoxedFunction(boxRTFunction((void*)tupleLen, BOXED_INT, 1))); tuple_cls->giveAttr("__repr__", new BoxedFunction(boxRTFunction((void*)tupleRepr, STR, 1))); tuple_cls->giveAttr("__add__", new BoxedFunction(boxRTFunction((void*)tupleAdd, BOXED_TUPLE, 2))); tuple_cls->giveAttr("__mul__", new BoxedFunction(boxRTFunction((void*)tupleMul, BOXED_TUPLE, 2))); tuple_cls->giveAttr("__rmul__", new BoxedFunction(boxRTFunction((void*)tupleMul, BOXED_TUPLE, 2))); tuple_cls->tp_hash = (hashfunc)tuple_hash; tuple_cls->tp_as_sequence->sq_slice = (ssizessizeargfunc)&tupleslice; add_operators(tuple_cls); tuple_cls->freeze(); tuple_cls->tp_as_sequence->sq_item = (ssizeargfunc)tupleitem; tuple_cls->tp_as_sequence->sq_length = (lenfunc)tuplelength; tuple_cls->tp_iter = tupleIter; CLFunction* hasnext = boxRTFunction((void*)tupleiterHasnextUnboxed, BOOL, 1); addRTFunction(hasnext, (void*)tupleiterHasnext, BOXED_BOOL); tuple_iterator_cls->giveAttr("__hasnext__", new BoxedFunction(hasnext)); tuple_iterator_cls->giveAttr( "__iter__", new BoxedFunction(boxRTFunction((void*)tupleIterIter, typeFromClass(tuple_iterator_cls), 1))); tuple_iterator_cls->giveAttr("next", new BoxedFunction(boxRTFunction((void*)tupleiterNext, UNKNOWN, 1))); tuple_iterator_cls->freeze(); tuple_iterator_cls->tpp_hasnext = tupleiterHasnextUnboxed; }
static void _addFunc(const char* name, void* int_func, void* float_func, void* boxed_func) { std::vector<ConcreteCompilerType*> v_i, v_f, v_u; assert(BOXED_INT); v_i.push_back(BOXED_INT); v_f.push_back(BOXED_FLOAT); v_u.push_back(NULL); CLFunction* cl = createRTFunction(); addRTFunction(cl, int_func, BOXED_FLOAT, v_i, false); addRTFunction(cl, float_func, BOXED_FLOAT, v_f, false); addRTFunction(cl, boxed_func, NULL, v_u, false); math_module->giveAttr(name, new BoxedFunction(cl)); }
extern "C" CLFunction* boxRTFunction(void* f, ConcreteCompilerType* rtn_type, int nargs, bool takes_varargs, bool takes_kwargs) { CLFunction* cl_f = createRTFunction(); addRTFunction(cl_f, f, rtn_type, nargs, takes_varargs, takes_kwargs); return cl_f; }
CLFunction* boxRTFunction(void* f, ConcreteCompilerType* rtn_type, int num_args, int num_defaults, bool takes_varargs, bool takes_kwargs) { CLFunction* cl_f = createRTFunction(num_args, num_defaults, takes_varargs, takes_kwargs); addRTFunction(cl_f, f, rtn_type); return cl_f; }
void setupTuple() { tuple_iterator_cls = BoxedHeapClass::create(type_cls, object_cls, &tupleIteratorGCHandler, 0, 0, sizeof(BoxedTupleIterator), false, "tuple"); tuple_cls->giveAttr("__new__", new BoxedFunction(boxRTFunction((void*)tupleNew, UNKNOWN, 1, 0, true, true))); CLFunction* getitem = createRTFunction(2, 0, 0, 0); addRTFunction(getitem, (void*)tupleGetitemInt, UNKNOWN, std::vector<ConcreteCompilerType*>{ UNKNOWN, BOXED_INT }); addRTFunction(getitem, (void*)tupleGetitemSlice, UNKNOWN, std::vector<ConcreteCompilerType*>{ UNKNOWN, SLICE }); addRTFunction(getitem, (void*)tupleGetitem, UNKNOWN, std::vector<ConcreteCompilerType*>{ UNKNOWN, UNKNOWN }); tuple_cls->giveAttr("__getitem__", new BoxedFunction(getitem)); tuple_cls->giveAttr("__contains__", new BoxedFunction(boxRTFunction((void*)tupleContains, BOXED_BOOL, 2))); tuple_cls->giveAttr("index", new BoxedFunction(boxRTFunction((void*)tupleIndex, BOXED_INT, 2))); tuple_cls->giveAttr("__iter__", new BoxedFunction(boxRTFunction((void*)tupleIter, typeFromClass(tuple_iterator_cls), 1))); tuple_cls->tp_richcompare = tuplerichcompare; tuple_cls->giveAttr("__nonzero__", new BoxedFunction(boxRTFunction((void*)tupleNonzero, BOXED_BOOL, 1))); tuple_cls->giveAttr("__len__", new BoxedFunction(boxRTFunction((void*)tupleLen, BOXED_INT, 1))); tuple_cls->giveAttr("__repr__", new BoxedFunction(boxRTFunction((void*)tupleRepr, STR, 1))); tuple_cls->giveAttr("__add__", new BoxedFunction(boxRTFunction((void*)tupleAdd, BOXED_TUPLE, 2))); tuple_cls->giveAttr("__mul__", new BoxedFunction(boxRTFunction((void*)tupleMul, BOXED_TUPLE, 2))); tuple_cls->giveAttr("__rmul__", new BoxedFunction(boxRTFunction((void*)tupleMul, BOXED_TUPLE, 2))); tuple_cls->tp_hash = (hashfunc)tuple_hash; add_operators(tuple_cls); tuple_cls->freeze(); CLFunction* hasnext = boxRTFunction((void*)tupleiterHasnextUnboxed, BOOL, 1); addRTFunction(hasnext, (void*)tupleiterHasnext, BOXED_BOOL); tuple_iterator_cls->giveAttr("__hasnext__", new BoxedFunction(hasnext)); tuple_iterator_cls->giveAttr( "__iter__", new BoxedFunction(boxRTFunction((void*)tupleIterIter, typeFromClass(tuple_iterator_cls), 1))); tuple_iterator_cls->giveAttr("next", new BoxedFunction(boxRTFunction((void*)tupleiterNext, UNKNOWN, 1))); tuple_iterator_cls->freeze(); tuple_iterator_cls->tpp_hasnext = tupleiterHasnextUnboxed; }
void setupFloat() { float_cls->giveAttr("__name__", boxStrConstant("float")); _addFunc("__add__", BOXED_FLOAT, (void*)floatAddFloat, (void*)floatAddInt, (void*)floatAdd); float_cls->setattr("__radd__", float_cls->peekattr("__add__"), NULL, NULL); _addFunc("__div__", BOXED_FLOAT, (void*)floatDivFloat, (void*)floatDivInt, (void*)floatDiv); _addFunc("__rdiv__", BOXED_FLOAT, (void*)floatRDivFloat, (void*)floatRDivInt, (void*)floatRDiv); float_cls->giveAttr("__floordiv__", new BoxedFunction(boxRTFunction((void*)floatFloorDiv, NULL, 2, false))); _addFunc("__eq__", BOXED_BOOL, (void*)floatEqFloat, (void*)floatEqInt, (void*)floatEq); _addFunc("__ge__", BOXED_BOOL, (void*)floatGeFloat, (void*)floatGeInt, (void*)floatGe); _addFunc("__gt__", BOXED_BOOL, (void*)floatGtFloat, (void*)floatGtInt, (void*)floatGt); _addFunc("__le__", BOXED_BOOL, (void*)floatLeFloat, (void*)floatLeInt, (void*)floatLe); _addFunc("__lt__", BOXED_BOOL, (void*)floatLtFloat, (void*)floatLtInt, (void*)floatLt); _addFunc("__ne__", BOXED_BOOL, (void*)floatNeFloat, (void*)floatNeInt, (void*)floatNe); _addFunc("__mod__", BOXED_FLOAT, (void*)floatModFloat, (void*)floatModInt, (void*)floatMod); _addFunc("__rmod__", BOXED_FLOAT, (void*)floatRModFloat, (void*)floatRModInt, (void*)floatRMod); _addFunc("__mul__", BOXED_FLOAT, (void*)floatMulFloat, (void*)floatMulInt, (void*)floatMul); float_cls->setattr("__rmul__", float_cls->peekattr("__mul__"), NULL, NULL); _addFunc("__pow__", BOXED_FLOAT, (void*)floatPowFloat, (void*)floatPowInt, (void*)floatPow); _addFunc("__sub__", BOXED_FLOAT, (void*)floatSubFloat, (void*)floatSubInt, (void*)floatSub); _addFunc("__rsub__", BOXED_FLOAT, (void*)floatRSubFloat, (void*)floatRSubInt, (void*)floatRSub); CLFunction *__new__ = boxRTFunction((void*)floatNew1, NULL, 1, false); addRTFunction(__new__, (void*)floatNew2, NULL, 2, false); float_cls->giveAttr("__new__", new BoxedFunction(__new__)); float_cls->giveAttr("__neg__", new BoxedFunction(boxRTFunction((void*)floatNeg, NULL, 1, false))); CLFunction *nonzero = boxRTFunction((void*)floatNonzeroUnboxed, BOOL, 1, false); addRTFunction(nonzero, (void*)floatNonzero, UNKNOWN, 1, false); float_cls->giveAttr("__nonzero__", new BoxedFunction(nonzero)); //float_cls->giveAttr("__nonzero__", new BoxedFunction(boxRTFunction((void*)floatNonzero, NULL, 1, false))); float_cls->giveAttr("__str__", new BoxedFunction(boxRTFunction((void*)floatStr, NULL, 1, false))); float_cls->giveAttr("__repr__", new BoxedFunction(boxRTFunction((void*)floatRepr, NULL, 1, false))); float_cls->freeze(); }
void setupDict() { dict_iterator_cls = new BoxedClass(object_cls, 0, sizeof(BoxedDict), false); dict_cls->giveAttr("__name__", boxStrConstant("dict")); // dict_cls->giveAttr("__len__", new BoxedFunction(boxRTFunction((void*)dictLen, NULL, 1))); // dict_cls->giveAttr("__getitem__", new BoxedFunction(boxRTFunction((void*)dictGetitem, NULL, 2))); // dict_cls->giveAttr("__new__", new BoxedFunction(boxRTFunction((void*)dictNew, NULL, 1))); // dict_cls->giveAttr("__init__", new BoxedFunction(boxRTFunction((void*)dictInit, NULL, 1))); dict_cls->giveAttr("__repr__", new BoxedFunction(boxRTFunction((void*)dictRepr, STR, 1))); dict_cls->giveAttr("__str__", dict_cls->getattr("__repr__")); dict_cls->giveAttr("__iter__", new BoxedFunction(boxRTFunction((void*)dictIterKeys, typeFromClass(dict_iterator_cls), 1))); dict_cls->giveAttr("items", new BoxedFunction(boxRTFunction((void*)dictItems, LIST, 1))); dict_cls->giveAttr("iteritems", new BoxedFunction(boxRTFunction((void*)dictIterItems, typeFromClass(dict_iterator_cls), 1))); dict_cls->giveAttr("values", new BoxedFunction(boxRTFunction((void*)dictValues, LIST, 1))); dict_cls->giveAttr("itervalues", new BoxedFunction(boxRTFunction((void*)dictIterValues, typeFromClass(dict_iterator_cls), 1))); dict_cls->giveAttr("keys", new BoxedFunction(boxRTFunction((void*)dictKeys, LIST, 1))); dict_cls->giveAttr("iterkeys", dict_cls->getattr("__iter__")); dict_cls->giveAttr("pop", new BoxedFunction(boxRTFunction((void*)dictPop, UNKNOWN, 3, 1, false, false), { NULL })); dict_cls->giveAttr("get", new BoxedFunction(boxRTFunction((void*)dictGet, UNKNOWN, 3, 1, false, false), { None })); dict_cls->giveAttr("setdefault", new BoxedFunction(boxRTFunction((void*)dictSetdefault, UNKNOWN, 3, 1, false, false), { None })); dict_cls->giveAttr("__getitem__", new BoxedFunction(boxRTFunction((void*)dictGetitem, UNKNOWN, 2))); dict_cls->giveAttr("__setitem__", new BoxedFunction(boxRTFunction((void*)dictSetitem, NONE, 3))); dict_cls->freeze(); gc::registerStaticRootObj(dict_iterator_cls); dict_iterator_cls->giveAttr("__name__", boxStrConstant("dictiterator")); CLFunction* hasnext = boxRTFunction((void*)dictIterHasnextUnboxed, BOOL, 1); addRTFunction(hasnext, (void*)dictIterHasnext, BOXED_BOOL); dict_iterator_cls->giveAttr("__hasnext__", new BoxedFunction(hasnext)); dict_iterator_cls->giveAttr( "__iter__", new BoxedFunction(boxRTFunction((void*)dictIterIter, typeFromClass(dict_iterator_cls), 1))); dict_iterator_cls->giveAttr("next", new BoxedFunction(boxRTFunction((void*)dictIterNext, UNKNOWN, 1))); dict_iterator_cls->freeze(); }
void setupBool() { bool_cls->giveAttr("__name__", boxStrConstant("bool")); bool_cls->giveAttr("__invert__", new BoxedFunction(boxRTFunction((void*)boolInvert, NULL, 1, false))); bool_cls->giveAttr("__pos__", new BoxedFunction(boxRTFunction((void*)boolPos, NULL, 1, false))); bool_cls->giveAttr("__neg__", new BoxedFunction(boxRTFunction((void*)boolNeg, NULL, 1, false))); bool_cls->giveAttr("__nonzero__", new BoxedFunction(boxRTFunction((void*)boolNonzero, NULL, 1, false))); bool_cls->giveAttr("__repr__", new BoxedFunction(boxRTFunction((void*)boolRepr, NULL, 1, false))); bool_cls->setattr("__str__", bool_cls->peekattr("__repr__"), NULL, NULL); CLFunction *__new__ = boxRTFunction((void*)boolNew1, NULL, 1, false); addRTFunction(__new__, (void*)boolNew2, NULL, 2, false); bool_cls->giveAttr("__new__", new BoxedFunction(__new__)); bool_cls->freeze(); True = new BoxedBool(true); False = new BoxedBool(false); gc::registerStaticRootObj(True); gc::registerStaticRootObj(False); }
void setupGenerator() { generator_cls = BoxedHeapClass::create(type_cls, object_cls, &generatorGCHandler, 0, offsetof(BoxedGenerator, weakreflist), sizeof(BoxedGenerator), false, "generator"); generator_cls->simple_destructor = generatorDestructor; generator_cls->giveAttr("__iter__", new BoxedFunction(boxRTFunction((void*)generatorIter, typeFromClass(generator_cls), 1))); generator_cls->giveAttr("close", new BoxedFunction(boxRTFunction((void*)generatorClose, UNKNOWN, 1))); generator_cls->giveAttr("next", new BoxedFunction(boxRTFunction((void*)generatorNext, UNKNOWN, 1))); CLFunction* hasnext = boxRTFunction((void*)generatorHasnextUnboxed, BOOL, 1); addRTFunction(hasnext, (void*)generatorHasnext, BOXED_BOOL); generator_cls->giveAttr("__hasnext__", new BoxedFunction(hasnext)); generator_cls->giveAttr("send", new BoxedFunction(boxRTFunction((void*)generatorSend, UNKNOWN, 2))); auto gthrow = new BoxedFunction(boxRTFunction((void*)generatorThrow, UNKNOWN, 4, 2, false, false), { NULL, NULL }); generator_cls->giveAttr("throw", gthrow); generator_cls->giveAttr("__name__", new (pyston_getset_cls) BoxedGetsetDescriptor(generatorName, NULL, NULL)); generator_cls->freeze(); }
void addRTFunction(CLFunction* cl_f, void* f, ConcreteCompilerType* rtn_type, int nargs, bool takes_varargs, bool takes_kwargs) { std::vector<ConcreteCompilerType*> arg_types(nargs, NULL); return addRTFunction(cl_f, f, rtn_type, arg_types, takes_varargs, takes_kwargs); }
void addRTFunction(CLFunction* cl_f, void* f, ConcreteCompilerType* rtn_type) { std::vector<ConcreteCompilerType*> arg_types(cl_f->numReceivedArgs(), UNKNOWN); return addRTFunction(cl_f, f, rtn_type, arg_types); }
void setupList() { list_iterator_cls = new BoxedHeapClass(object_cls, &listIteratorGCHandler, 0, sizeof(BoxedList), false); list_cls->giveAttr("__name__", boxStrConstant("list")); list_cls->giveAttr("__len__", new BoxedFunction(boxRTFunction((void*)listLen, BOXED_INT, 1))); CLFunction* getitem = createRTFunction(2, 0, 0, 0); addRTFunction(getitem, (void*)listGetitemInt, UNKNOWN, std::vector<ConcreteCompilerType*>{ LIST, BOXED_INT }); addRTFunction(getitem, (void*)listGetitemSlice, LIST, std::vector<ConcreteCompilerType*>{ LIST, SLICE }); addRTFunction(getitem, (void*)listGetitem, UNKNOWN, std::vector<ConcreteCompilerType*>{ LIST, UNKNOWN }); list_cls->giveAttr("__getitem__", new BoxedFunction(getitem)); list_cls->giveAttr("__iter__", new BoxedFunction(boxRTFunction((void*)listIter, typeFromClass(list_iterator_cls), 1))); list_cls->giveAttr("__eq__", new BoxedFunction(boxRTFunction((void*)listEq, UNKNOWN, 2))); list_cls->giveAttr("__ne__", new BoxedFunction(boxRTFunction((void*)listNe, UNKNOWN, 2))); list_cls->giveAttr("__repr__", new BoxedFunction(boxRTFunction((void*)listRepr, STR, 1))); list_cls->giveAttr("__nonzero__", new BoxedFunction(boxRTFunction((void*)listNonzero, BOXED_BOOL, 1))); list_cls->giveAttr("pop", new BoxedFunction(boxRTFunction((void*)listPop, UNKNOWN, 2, 1, false, false), { None })); list_cls->giveAttr("append", new BoxedFunction(boxRTFunction((void*)listAppend, NONE, 2))); list_cls->giveAttr("extend", new BoxedFunction(boxRTFunction((void*)listIAdd, NONE, 2))); CLFunction* setitem = createRTFunction(3, 0, false, false); addRTFunction(setitem, (void*)listSetitemInt, NONE, std::vector<ConcreteCompilerType*>{ LIST, BOXED_INT, UNKNOWN }); addRTFunction(setitem, (void*)listSetitemSlice, NONE, std::vector<ConcreteCompilerType*>{ LIST, SLICE, UNKNOWN }); addRTFunction(setitem, (void*)listSetitem, NONE, std::vector<ConcreteCompilerType*>{ LIST, UNKNOWN, UNKNOWN }); list_cls->giveAttr("__setitem__", new BoxedFunction(setitem)); CLFunction* delitem = createRTFunction(2, 0, false, false); addRTFunction(delitem, (void*)listDelitemInt, NONE, std::vector<ConcreteCompilerType*>{ LIST, BOXED_INT }); addRTFunction(delitem, (void*)listDelitemSlice, NONE, std::vector<ConcreteCompilerType*>{ LIST, SLICE }); addRTFunction(delitem, (void*)listDelitem, NONE, std::vector<ConcreteCompilerType*>{ LIST, UNKNOWN }); list_cls->giveAttr("__delitem__", new BoxedFunction(delitem)); list_cls->giveAttr("insert", new BoxedFunction(boxRTFunction((void*)listInsert, NONE, 3))); list_cls->giveAttr("__mul__", new BoxedFunction(boxRTFunction((void*)listMul, LIST, 2))); list_cls->giveAttr("__rmul__", new BoxedFunction(boxRTFunction((void*)listMul, LIST, 2))); list_cls->giveAttr("__iadd__", new BoxedFunction(boxRTFunction((void*)listIAdd, UNKNOWN, 2))); list_cls->giveAttr("__add__", new BoxedFunction(boxRTFunction((void*)listAdd, UNKNOWN, 2))); list_cls->giveAttr("sort", new BoxedFunction(boxRTFunction((void*)listSort1, NONE, 1))); list_cls->giveAttr("__contains__", new BoxedFunction(boxRTFunction((void*)listContains, BOXED_BOOL, 2))); list_cls->giveAttr("__new__", new BoxedFunction(boxRTFunction((void*)listNew, UNKNOWN, 2, 1, false, false), { None })); list_cls->giveAttr("count", new BoxedFunction(boxRTFunction((void*)listCount, BOXED_INT, 2))); list_cls->giveAttr("index", new BoxedFunction(boxRTFunction((void*)listIndex, BOXED_INT, 2))); list_cls->giveAttr("remove", new BoxedFunction(boxRTFunction((void*)listRemove, NONE, 2))); list_cls->giveAttr("reverse", new BoxedFunction(boxRTFunction((void*)listReverse, NONE, 1))); list_cls->freeze(); list_iterator_cls->giveAttr("__name__", boxStrConstant("listiterator")); CLFunction* hasnext = boxRTFunction((void*)listiterHasnextUnboxed, BOOL, 1); addRTFunction(hasnext, (void*)listiterHasnext, BOXED_BOOL); list_iterator_cls->giveAttr("__hasnext__", new BoxedFunction(hasnext)); list_iterator_cls->giveAttr( "__iter__", new BoxedFunction(boxRTFunction((void*)listIterIter, typeFromClass(list_iterator_cls), 1))); list_iterator_cls->giveAttr("next", new BoxedFunction(boxRTFunction((void*)listiterNext, UNKNOWN, 1))); list_iterator_cls->freeze(); }
void setupBuiltins() { std::string name("__builtin__"); std::string fn("__builtin__"); builtins_module = new BoxedModule(&name, &fn); builtins_module->setattr("None", None, NULL, NULL); notimplemented_cls = new BoxedClass(false, NULL); notimplemented_cls->giveAttr("__name__", boxStrConstant("NotImplementedType")); notimplemented_cls->giveAttr("__repr__", new BoxedFunction(boxRTFunction((void*)notimplementedRepr, NULL, 1, false))); notimplemented_cls->freeze(); NotImplemented = new Box(¬implemented_flavor, notimplemented_cls); gc::registerStaticRootObj(NotImplemented); builtins_module->giveAttr("NotImplemented", NotImplemented); builtins_module->giveAttr("NotImplementedType", notimplemented_cls); repr_obj = new BoxedFunction(boxRTFunction((void*)repr, NULL, 1, false)); builtins_module->giveAttr("repr", repr_obj); len_obj = new BoxedFunction(boxRTFunction((void*)len, NULL, 1, false)); builtins_module->giveAttr("len", len_obj); hash_obj = new BoxedFunction(boxRTFunction((void*)hash, NULL, 1, false)); builtins_module->giveAttr("hash", hash_obj); abs_obj = new BoxedFunction(boxRTFunction((void*)abs_, NULL, 1, false)); builtins_module->giveAttr("abs", abs_obj); min_obj = new BoxedFunction(boxRTFunction((void*)min_, NULL, 2, false)); builtins_module->giveAttr("min", min_obj); max_obj = new BoxedFunction(boxRTFunction((void*)max_, NULL, 2, false)); builtins_module->giveAttr("max", max_obj); chr_obj = new BoxedFunction(boxRTFunction((void*)chr, NULL, 1, false)); builtins_module->giveAttr("chr", chr_obj); trap_obj = new BoxedFunction(boxRTFunction((void*)trap, NULL, 0, false)); builtins_module->giveAttr("trap", trap_obj); CLFunction* getattr_func = boxRTFunction((void*)getattr2, NULL, 2, false); addRTFunction(getattr_func, (void*)getattr3, NULL, 3, false); builtins_module->giveAttr("getattr", new BoxedFunction(getattr_func)); Box* isinstance_obj = new BoxedFunction(boxRTFunction((void*)isinstance, NULL, 2, false)); builtins_module->giveAttr("isinstance", isinstance_obj); builtins_module->giveAttr("sorted", new BoxedFunction(boxRTFunction((void*)sorted, NULL, 1, false))); builtins_module->setattr("True", True, NULL, NULL); builtins_module->setattr("False", False, NULL, NULL); CLFunction *range_clf = boxRTFunction((void*)range1, NULL, 1, false); addRTFunction(range_clf, (void*)range2, NULL, 2, false); addRTFunction(range_clf, (void*)range3, NULL, 3, false); range_obj = new BoxedFunction(range_clf); builtins_module->giveAttr("range", range_obj); setupXrange(); builtins_module->giveAttr("xrange", xrange_cls); CLFunction *open = boxRTFunction((void*)open1, NULL, 1, false); addRTFunction(open, (void*)open2, NULL, 2, false); open_obj = new BoxedFunction(open); builtins_module->giveAttr("open", open_obj); builtins_module->setattr("str", str_cls, NULL, NULL); builtins_module->setattr("int", int_cls, NULL, NULL); builtins_module->setattr("float", float_cls, NULL, NULL); builtins_module->setattr("list", list_cls, NULL, NULL); builtins_module->setattr("slice", slice_cls, NULL, NULL); builtins_module->setattr("type", type_cls, NULL, NULL); builtins_module->setattr("file", file_cls, NULL, NULL); builtins_module->setattr("bool", bool_cls, NULL, NULL); builtins_module->setattr("dict", dict_cls, NULL, NULL); builtins_module->setattr("tuple", tuple_cls, NULL, NULL); builtins_module->setattr("instancemethod", instancemethod_cls, NULL, NULL); }