labath added inline comments.

================
Comment at: packages/Python/lldbsuite/test/lldbtest.py:1102
@@ -1164,2 +1101,3 @@
+                return func(*args, **kwargs)
         return wrapper
 
----------------
zturner wrote:
> labath wrote:
> > zturner wrote:
> > > labath wrote:
> > > > This return statement is the root cause of the problem. If `func` is a 
> > > > class, you will replace it by a strange function-like object.
> > > This return statement is newly added anyway (and looks to be a mistake).  
> > > Does this mean if I remove the return statement, the all of the skip 
> > > decorators will be able to be used at class level?
> > > 
> > I'm not exactly sure what you mean. You can't simply remove the return 
> > statement, as that would make the decorator not work. I would try to make 
> > this decorator call `unittest2.skipIf`, which knows how to do the right 
> > thing. So, something like
> > ```
> > def skipTestIfFn(expected_fn, bugnumber=None):
> >   skip, reason = ...
> >   return unittest2.skipIf(skip, reason)
> > ```
> > would work (I think), but you could run into some complications as now 
> > `expected_fn` gets evaluated at decorator application time rather than 
> > during test invocation.
> > 
> > You can try this out for your self. Remove the exception guard, apply the 
> > decorator on a class with the condition that is false, and make sure that 
> > the tests *do* run.
> > 
> > But maybe we should do that as a separate patch ?
> Doing it in a separate patch makes sense.  In any case, my point here is that 
> this code was already not returning the result of calling the function (just 
> look at the left side of the diff).  I think when we get here `func` is 
> always the underlying function (i.e. the actual test function), and those 
> don't return anything, they just run the test.
> 
> I would have to step through it in a debugger to really be sure though, the 
> whole decorator model is still kind of hard to wrap my head around with the 
> numerous layers of nested functions.
Ok, I see what you mean now. The `return` in `return func(...)` is probably not 
needed, but it definitely doesn't hurt either. The problem is one level up, in 
`skipTestIfFn_impl`. Whatever is the result of `skipTestIfFn_impl(X)` gets used 
instead of the real `X`. So if `X` is the whole class then you must return 
something that looks like a class there. Alas, we are returning `wrapper`, 
which is a function, and things go downhill from there...


http://reviews.llvm.org/D16741



_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to