> On Nov 4, 2015, at 12:21 AM, Peter Levart <peter.lev...@gmail.com> wrote:
> 
>> 
>> I was not thinking of calling StackWalker::getCallerClass from native, but 
>> calling some method from native, which then calls 
>> StackWalker::getCallerClass. The method itself can not anticipate how it 
>> will be called. Most methods calling getCallerClass will assume their caller 
>> is a Java method and won't bother to think of consequences when this is not 
>> the case. But any method can be called from native code in a newly attached 
>> thread. I'm not saying this is common, but can happen. 
>> 
>> So the question is whether Thread.class is always the right substitute in 
>> such situations and whether it would be better to return null or 
>> Optional.empty(). If you don't want to force users to handle the uncommon 
>> case then perhaps it's best to return null. They will get NPE in the 
>> uncommon case and will be forced to handle it as opposed to using 
>> Thread.class which might silently "work", but not do the right thing.
> 
> ... additionaly, Thread.class (or a subclass) can not be reliably used as a 
> sentinel value to identify such uncommon cases because it can sometimes be a 
> legal caller, as in:
> 
> public class StackWalkerDemo {
> 
>     public static void doIt() {
>         StackWalker sw = new StackWalker(StackWalker.Option.CLASS_REFERENCE);
>         System.out.println("I was called from: " + sw.getCallerClass());
>     }
> 
>     public static void main(String[] args) throws Exception {
>         Thread t = new Thread(StackWalkerDemo::doIt);
>         t.start();
>         t.join();
>     }
> }

Good point.  If it returns null, users should prepare for it to return null.   
So I think returning Optional<Class<?>> is better than null and that would make 
it equivalent to:
    walk(s -> s.map(StackFrame::getDeclaringClass).skip(2).findFirst());

I have changed the API to return that.

Will post an updated API and webrev once I incorporate most of the comments.

thanks
Mandy

Reply via email to