Box* BoxedWrapperDescriptor::__call__(BoxedWrapperDescriptor* descr, PyObject* self, BoxedTuple* args, Box** _args) { RELEASE_ASSERT(descr->cls == wrapperdescr_cls, ""); BoxedDict* kw = static_cast<BoxedDict*>(_args[0]); if (!isSubclass(self->cls, descr->type)) raiseExcHelper(TypeError, "descriptor '' requires a '%s' object but received a '%s'", getFullNameOfClass(descr->type).c_str(), getFullTypeName(self).c_str()); auto wrapper = new BoxedWrapperObject(descr, self); return BoxedWrapperObject::__call__(wrapper, args, kw); }
Box* BoxedWrapperDescriptor::__get__(BoxedWrapperDescriptor* self, Box* inst, Box* owner) { RELEASE_ASSERT(self->cls == wrapperdescr_cls, ""); if (inst == None) return self; if (!isSubclass(inst->cls, self->type)) raiseExcHelper(TypeError, "Descriptor '' for '%s' objects doesn't apply to '%s' object", getFullNameOfClass(self->type).c_str(), getFullTypeName(inst).c_str()); return new BoxedWrapperObject(self, inst); }
Box* BoxedWrapperDescriptor::descr_get(Box* _self, Box* inst, Box* owner) noexcept { RELEASE_ASSERT(_self->cls == wrapperdescr_cls, ""); BoxedWrapperDescriptor* self = static_cast<BoxedWrapperDescriptor*>(_self); if (inst == None) return self; if (!isSubclass(inst->cls, self->type)) PyErr_Format(TypeError, "Descriptor '' for '%s' objects doesn't apply to '%s' object", getFullNameOfClass(self->type).c_str(), getFullTypeName(inst).c_str()); return new BoxedWrapperObject(self, inst); }
Box* BoxedMethodDescriptor::__call__(BoxedMethodDescriptor* self, Box* obj, BoxedTuple* varargs, Box** _args) { STAT_TIMER(t0, "us_timer_boxedmethoddescriptor__call__", 10); BoxedDict* kwargs = static_cast<BoxedDict*>(_args[0]); assert(self->cls == method_cls); assert(varargs->cls == tuple_cls); assert(kwargs->cls == dict_cls); int ml_flags = self->method->ml_flags; int call_flags; if (ml_flags & METH_CLASS) { if (!isSubclass(obj->cls, type_cls)) raiseExcHelper(TypeError, "descriptor '%s' requires a type but received a '%s'", self->method->ml_name, getFullTypeName(obj).c_str()); call_flags = ml_flags & (~METH_CLASS); } else { if (!isSubclass(obj->cls, self->type)) raiseExcHelper(TypeError, "descriptor '%s' requires a '%s' object but received a '%s'", self->method->ml_name, getFullNameOfClass(self->type).c_str(), getFullTypeName(obj).c_str()); call_flags = ml_flags; } threading::GLPromoteRegion _gil_lock; Box* rtn; if (call_flags == METH_NOARGS) { RELEASE_ASSERT(varargs->size() == 0, ""); RELEASE_ASSERT(kwargs->d.size() == 0, ""); rtn = (Box*)self->method->ml_meth(obj, NULL); } else if (call_flags == METH_VARARGS) { RELEASE_ASSERT(kwargs->d.size() == 0, ""); rtn = (Box*)self->method->ml_meth(obj, varargs); } else if (call_flags == (METH_VARARGS | METH_KEYWORDS)) { rtn = (Box*)((PyCFunctionWithKeywords)self->method->ml_meth)(obj, varargs, kwargs); } else if (call_flags == METH_O) { RELEASE_ASSERT(kwargs->d.size() == 0, ""); RELEASE_ASSERT(varargs->size() == 1, ""); rtn = (Box*)self->method->ml_meth(obj, varargs->elts[0]); } else { RELEASE_ASSERT(0, "0x%x", call_flags); } checkAndThrowCAPIException(); assert(rtn && "should have set + thrown an exception!"); return rtn; }
void Heap::dumpHeapStatistics() { threading::GLPromoteRegion _lock; HeapStatistics stats; small_arena.getStatistics(&stats); large_arena.getStatistics(&stats); huge_arena.getStatistics(&stats); stats.conservative.print("conservative"); stats.untracked.print("untracked"); stats.hcls.print("hcls"); for (const auto& p : stats.by_cls) { p.second.print(getFullNameOfClass(p.first).c_str()); } stats.total.print("Total"); printf("\n"); }
void Heap::dumpHeapStatistics(int level) { bool collect_cls_stats = (level >= 1); bool collect_hcls_stats = (level >= 1); threading::GLPromoteRegion _lock; fprintf(stderr, "\nCollecting heap stats for pid %d...\n", getpid()); HeapStatistics stats(collect_cls_stats, collect_hcls_stats); small_arena.getStatistics(&stats); large_arena.getStatistics(&stats); huge_arena.getStatistics(&stats); stats.python.print("python"); stats.conservative.print("conservative"); stats.conservative_python.print("conservative_python"); stats.untracked.print("untracked"); stats.hcls.print("hcls"); stats.precise.print("precise"); if (collect_cls_stats) { for (const auto& p : stats.by_cls) { p.second.print(getFullNameOfClass(p.first).c_str()); } } stats.total.print("Total"); if (collect_hcls_stats) { fprintf(stderr, "%ld hidden classes currently alive\n", stats.hcls.nallocs); fprintf(stderr, "%ld have at least one Box that uses them\n", stats.hcls_uses.size()); for (int i = 0; i <= HCLS_ATTRS_STAT_MAX; i++) { fprintf(stderr, "With % 3d attributes: %d\n", i, stats.num_hcls_by_attrs[i]); } fprintf(stderr, "With >% 2d attributes: %d\n", HCLS_ATTRS_STAT_MAX, stats.num_hcls_by_attrs_exceed); } fprintf(stderr, "\n"); }
/** * * @param parentId * @return */ virtual int writeH5Data(hid_t parentId, QVector<size_t> tDims) { if (m_Array == NULL) { return -85648; } #if 0 return H5DataArrayWriter<T>::writeArray(parentId, getName(), getNumberOfTuples(), getNumberOfComponents(), getRank(), getDims(), getClassVersion(), m_Array, getFullNameOfClass()); #else return H5DataArrayWriter::writeDataArray<Self>(parentId, this, tDims); #endif }
/** * * @param parentId * @return */ virtual int writeH5Data(hid_t parentId) { if (Array == NULL) { return -85648; } return H5DataArrayWriter<T>::writeArray(parentId, GetName(), GetNumberOfTuples(), GetNumberOfComponents(), Array, getFullNameOfClass()); }
Box* BoxedMethodDescriptor::callInternal(BoxedFunctionBase* f, CallRewriteArgs* rewrite_args, ArgPassSpec argspec, Box* arg1, Box* arg2, Box* arg3, Box** args, const std::vector<BoxedString*>* keyword_names) { // TODO: could also handle cases where we have starargs but no positional args, // and similarly for kwargs but no keywords if (!rewrite_args || argspec.has_kwargs || argspec.has_starargs || argspec.num_keywords > 0 || argspec.num_args > 4) return callFunc(f, rewrite_args, argspec, arg1, arg2, arg3, args, keyword_names); assert(argspec.num_args >= 2); int passed_varargs = argspec.num_args - 2; assert(arg1->cls == method_cls); BoxedMethodDescriptor* self = static_cast<BoxedMethodDescriptor*>(arg1); Box* obj = arg2; RewriterVar* r_obj = rewrite_args->arg2; // We could also guard on the fields of the method object, but lets just guard on the object itself // for now. // TODO: what if it gets GC'd? rewrite_args->arg1->addGuard((intptr_t)self); int ml_flags = self->method->ml_flags; RELEASE_ASSERT((ml_flags & METH_CLASS) == 0, "unimplemented"); if (!isSubclass(obj->cls, self->type)) raiseExcHelper(TypeError, "descriptor '%s' requires a '%s' object but received a '%s'", self->method->ml_name, getFullNameOfClass(self->type).c_str(), getFullTypeName(obj).c_str()); r_obj->addAttrGuard(offsetof(Box, cls), (intptr_t)obj->cls); int call_flags = ml_flags; Box* rtn; RewriterVar* r_rtn; if (call_flags == METH_NOARGS) { RELEASE_ASSERT(passed_varargs == 0, ""); rtn = (Box*)(self->method->ml_meth)(obj, NULL); r_rtn = rewrite_args->rewriter->call(true, (void*)self->method->ml_meth, r_obj, rewrite_args->rewriter->loadConst(0, Location::forArg(1))); } else if (call_flags & METH_VARARGS) { RELEASE_ASSERT(call_flags == METH_VARARGS || call_flags == (METH_VARARGS | METH_KEYWORDS), ""); Box* varargs; RewriterVar* r_varargs; if (passed_varargs == 0) { varargs = EmptyTuple; r_varargs = rewrite_args->rewriter->loadConst((intptr_t)EmptyTuple, Location::forArg(1)); } else if (passed_varargs == 1) { varargs = BoxedTuple::create1(arg3); r_varargs = rewrite_args->rewriter->call(false, (void*)BoxedTuple::create1, rewrite_args->arg3); } else if (passed_varargs == 2) { varargs = BoxedTuple::create2(arg3, args[0]); r_varargs = rewrite_args->rewriter->call(false, (void*)BoxedTuple::create2, rewrite_args->arg3, rewrite_args->args->getAttr(0, Location::forArg(1))); } else { RELEASE_ASSERT(0, ""); } if (call_flags & METH_KEYWORDS) { Box* kwargs = NULL; RewriterVar* r_kwargs = rewrite_args->rewriter->loadConst(0); rtn = (Box*)((PyCFunctionWithKeywords)self->method->ml_meth)(obj, varargs, kwargs); r_rtn = rewrite_args->rewriter->call(true, (void*)self->method->ml_meth, r_obj, r_varargs, r_kwargs); } else { rtn = (Box*)(self->method->ml_meth)(obj, varargs); r_rtn = rewrite_args->rewriter->call(true, (void*)self->method->ml_meth, r_obj, r_varargs); } } else if (call_flags == METH_O) { RELEASE_ASSERT(passed_varargs == 1, ""); rtn = (Box*)(self->method->ml_meth)(obj, arg3); r_rtn = rewrite_args->rewriter->call(true, (void*)self->method->ml_meth, r_obj, rewrite_args->arg3); } else { RELEASE_ASSERT(0, "0x%x", call_flags); } rewrite_args->rewriter->call(true, (void*)checkAndThrowCAPIException); rewrite_args->out_rtn = r_rtn; rewrite_args->out_success = true; return rtn; }
Box* BoxedMethodDescriptor::tppCall(Box* _self, CallRewriteArgs* rewrite_args, ArgPassSpec argspec, Box* arg1, Box* arg2, Box* arg3, Box** args, const std::vector<BoxedString*>* keyword_names) { STAT_TIMER(t0, "us_timer_boxedmethoddescriptor__call__", 10); assert(_self->cls == method_cls); BoxedMethodDescriptor* self = static_cast<BoxedMethodDescriptor*>(_self); int ml_flags = self->method->ml_flags; int call_flags = ml_flags & (~METH_CLASS); if (rewrite_args && !rewrite_args->func_guarded) { rewrite_args->obj->addAttrGuard(offsetof(BoxedMethodDescriptor, method), (intptr_t)self->method); } ParamReceiveSpec paramspec(0, 0, false, false); if (call_flags == METH_NOARGS) { paramspec = ParamReceiveSpec(1, 0, false, false); } else if (call_flags == METH_VARARGS) { paramspec = ParamReceiveSpec(1, 0, true, false); } else if (call_flags == (METH_VARARGS | METH_KEYWORDS)) { paramspec = ParamReceiveSpec(1, 0, true, true); } else if (call_flags == METH_O) { paramspec = ParamReceiveSpec(2, 0, false, false); } else { RELEASE_ASSERT(0, "0x%x", call_flags); } Box* oarg1 = NULL; Box* oarg2 = NULL; Box* oarg3 = NULL; Box** oargs = NULL; bool rewrite_success = false; rearrangeArguments(paramspec, NULL, self->method->ml_name, NULL, rewrite_args, rewrite_success, argspec, arg1, arg2, arg3, args, keyword_names, oarg1, oarg2, oarg3, args); if (!rewrite_success) rewrite_args = NULL; if (ml_flags & METH_CLASS) { rewrite_args = NULL; if (!isSubclass(oarg1->cls, type_cls)) raiseExcHelper(TypeError, "descriptor '%s' requires a type but received a '%s'", self->method->ml_name, getFullTypeName(oarg1).c_str()); } else { if (!isSubclass(oarg1->cls, self->type)) raiseExcHelper(TypeError, "descriptor '%s' requires a '%s' oarg1 but received a '%s'", self->method->ml_name, getFullNameOfClass(self->type).c_str(), getFullTypeName(oarg1).c_str()); } if (rewrite_args) { rewrite_args->arg1->addAttrGuard(offsetof(Box, cls), (intptr_t)oarg1->cls); } Box* rtn; if (call_flags == METH_NOARGS) { { UNAVOIDABLE_STAT_TIMER(t0, "us_timer_in_builtins"); rtn = (Box*)self->method->ml_meth(oarg1, NULL); } if (rewrite_args) rewrite_args->out_rtn = rewrite_args->rewriter->call(true, (void*)self->method->ml_meth, rewrite_args->arg1, rewrite_args->rewriter->loadConst(0, Location::forArg(1))); } else if (call_flags == METH_VARARGS) { { UNAVOIDABLE_STAT_TIMER(t0, "us_timer_in_builtins"); rtn = (Box*)self->method->ml_meth(oarg1, oarg2); } if (rewrite_args) rewrite_args->out_rtn = rewrite_args->rewriter->call(true, (void*)self->method->ml_meth, rewrite_args->arg1, rewrite_args->arg2); } else if (call_flags == (METH_VARARGS | METH_KEYWORDS)) { { UNAVOIDABLE_STAT_TIMER(t0, "us_timer_in_builtins"); rtn = (Box*)((PyCFunctionWithKeywords)self->method->ml_meth)(oarg1, oarg2, oarg3); } if (rewrite_args) rewrite_args->out_rtn = rewrite_args->rewriter->call(true, (void*)self->method->ml_meth, rewrite_args->arg1, rewrite_args->arg2, rewrite_args->arg3); } else if (call_flags == METH_O) { { UNAVOIDABLE_STAT_TIMER(t0, "us_timer_in_builtins"); rtn = (Box*)self->method->ml_meth(oarg1, oarg2); } if (rewrite_args) rewrite_args->out_rtn = rewrite_args->rewriter->call(true, (void*)self->method->ml_meth, rewrite_args->arg1, rewrite_args->arg2); } else { RELEASE_ASSERT(0, "0x%x", call_flags); } if (!rtn) throwCAPIException(); if (rewrite_args) { rewrite_args->rewriter->call(false, (void*)checkAndThrowCAPIException); rewrite_args->out_success = true; } return rtn; }