Commit 88eedd39 authored by Kevin Modzelewski's avatar Kevin Modzelewski

Merge pull request #650 from kmod/perf7

Switch BoxedMethodDescriptor to tpp_call
parents a9813b80 d9a11db2
......@@ -7,7 +7,8 @@ def f(c):
pass
l = []
r = range(500)
for i in xrange(100):
l.append(itertools.chain(*[range(500) for j in xrange(500)]))
l.append(itertools.chain(*[r for j in r]))
c = itertools.chain(*l)
f(c)
......@@ -25,6 +25,7 @@ namespace pyston {
#if STAT_TIMERS
__thread StatTimer* StatTimer::stack;
__thread uint64_t* StatTimer::counter_override;
StatTimer* StatTimer::swapStack(StatTimer* s) {
uint64_t at_time = getCPUTicks();
......
......@@ -129,10 +129,22 @@ private:
int avoidability;
bool reset_avoidability;
static __thread uint64_t* counter_override;
public:
StatTimer(uint64_t* counter, int avoidability, bool reset_avoidability = false)
: _statcounter(counter), avoidability(avoidability), reset_avoidability(reset_avoidability) {}
static void overrideCounter(uint64_t* new_counter) {
assert(!counter_override);
counter_override = new_counter;
}
static void finishOverride() {
assert(counter_override);
counter_override = NULL;
}
void pushNonTopLevel() {
#ifndef NDEBUG
_start_time = 0;
......@@ -187,6 +199,9 @@ private:
assert(at_time > _start_time);
uint64_t _duration = at_time - _start_time;
if (counter_override)
Stats::log(counter_override, _duration);
else
Stats::log(_statcounter, _duration);
_start_time = 0;
......
......@@ -561,6 +561,9 @@ static inline void unwind_loop(ExcInfo* exc_data) {
// we're transfering control to a non-cleanup landing pad.
// i.e. a catch block. thus ends our unwind session.
endPythonUnwindSession(unwind_session);
#if STAT_TIMERS
pyston::StatTimer::finishOverride();
#endif
}
static_assert(THREADING_USE_GIL, "have to make the unwind session usage in this file thread safe!");
// there is a python unwinding implementation detail leaked
......@@ -660,6 +663,10 @@ extern "C" void __cxa_end_catch() {
#define EXCINFO_TYPE_INFO _ZTIN6pyston7ExcInfoE
extern "C" std::type_info EXCINFO_TYPE_INFO;
#if STAT_TIMERS
static uint64_t* unwinding_stattimer = pyston::Stats::getStatCounter("us_timer_unwinding");
#endif
extern "C" void __cxa_throw(void* exc_obj, std::type_info* tinfo, void (*dtor)(void*)) {
assert(!pyston::in_cleanup_code);
assert(exc_obj);
......@@ -671,6 +678,9 @@ extern "C" void __cxa_throw(void* exc_obj, std::type_info* tinfo, void (*dtor)(v
pyston::ExcInfo* exc_data = (pyston::ExcInfo*)exc_obj;
checkExcInfo(exc_data);
#if STAT_TIMERS
pyston::StatTimer::overrideCounter(unwinding_stattimer);
#endif
// let unwinding.cpp know we've started unwinding
pyston::throwingException(pyston::getActivePythonUnwindSession());
pyston::unwind(exc_data);
......
This diff is collapsed.
......@@ -927,8 +927,8 @@ public:
static Box* __get__(BoxedMethodDescriptor* self, Box* inst, Box* owner);
static Box* __call__(BoxedMethodDescriptor* self, Box* obj, BoxedTuple* varargs, Box** _args);
static Box* callInternal(BoxedFunctionBase* f, CallRewriteArgs* rewrite_args, ArgPassSpec argspec, Box* arg1,
Box* arg2, Box* arg3, Box** args, const std::vector<BoxedString*>* keyword_names);
static Box* tppCall(Box* _self, CallRewriteArgs* rewrite_args, ArgPassSpec argspec, Box* arg1, Box* arg2, Box* arg3,
Box** args, const std::vector<BoxedString*>* keyword_names);
static void gcHandler(GCVisitor* v, Box* _o);
};
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment