Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
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);
}
Exemplo n.º 3
0
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);
}
Exemplo n.º 4
0
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;
}
Exemplo n.º 5
0
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");
}
Exemplo n.º 6
0
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");
}
Exemplo n.º 7
0
    /**
     *
     * @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
    }
Exemplo n.º 8
0
 /**
  *
  * @param parentId
  * @return
  */
 virtual int writeH5Data(hid_t parentId)
 {
   if (Array == NULL) { return -85648; }
   return H5DataArrayWriter<T>::writeArray(parentId, GetName(), GetNumberOfTuples(), GetNumberOfComponents(), Array, getFullNameOfClass());
 }
Exemplo n.º 9
0
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;
}
Exemplo n.º 10
0
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;
}