package java.lang;

import java.lang.StackWalker.StackFrame;
import java.lang.LiveStackFrame;
import java.lang.LiveStackFrameInfo;
import java.lang.ref.Reference;
import java.security.AccessControlContext;
import java.security.AccessController;
import java.security.Principal;
import java.security.PrivilegedActionException;
import java.security.PrivilegedExceptionAction;
import java.util.Collections;
import java.util.HashSet;
import java.util.Optional;
import java.util.Set;

public class StackWalkTest {

    private static final StackWalker stackWalker = LiveStackFrame.getStackWalker();

    static void check(int count) {
        Optional<StackFrame> of = stackWalker.walk(s -> s.skip(1).findFirst());
        if (of.isEmpty()) throw new AssertionError("no frame");
        LiveStackFrameInfo lf = (LiveStackFrameInfo)of.get();
        Object l = lf.getLocals()[1];
        if (l == null || !"hi".equals(l)) {
            throw new AssertionError("bad frame local " + l + " at iteration " + count);
        }
    }

    static void go(int count) {
        String hi = new String("hi");
        if ((count % 1000) == 999) {
            check(count);
        }
        Reference.reachabilityFence(hi);
    }

    public static void main(String[] args) throws PrivilegedActionException {
        for (int i = 0; i < 200_000; ++i) {
            go(i);
        }
    }
}
