SAM interface/class figures [Re: Preparing for the 0.2 draft]

Alex Buckley Alex.Buckley at Sun.COM
Wed Feb 3 13:06:36 PST 2010


Sorry, unclear wording. In your mail about OpenJDK 6 stats, there was no 
mention of a utility to gather stats. The mail about OpenJDK 6 stats, 
which you repeated below, got through fine the first time.

Neal Gafter wrote:
> On Wed, Feb 3, 2010 at 12:55 PM, Alex Buckley <Alex.Buckley at sun.com> wrote:
>> What code are you talking about? There was nothing in your mail about
>> OpenJDK 6 stats.
> 
> Perhaps I'm having moderation problems.  Enclosed are the stats I
> thought I had sent.
> 
> ---------- Forwarded message ----------
> From: Neal Gafter <neal at gafter.com>
> Date: Mon, Feb 1, 2010 at 12:58 AM
> Subject: Re: Preparing for the 0.2 draft
> To: Alex Buckley <Alex.Buckley at sun.com>
> Cc: "lambda-dev at openjdk.java.net" <lambda-dev at openjdk.java.net>
> 
> 
> I ran the stats for openjdk6 sources, but not quite as you asked.  I
> started answering questions that filter out those anons that couldn't
> possibly be lambdas for one reason or another, and then answered the
> rest of the interesting questions from among those.  It isn't
> interesting to know which anonymous inner classes use "this" if they
> couldn't be lambdas because there are, for example, constructor
> arguments.
> 
> So here are the stats:
> 
> Total anonymous classes: 1155
> But with no constructor args: 1068
> And defining only one method: 883
> And where the type is a SAM type: 811
>   Those that are recursive: 0
>   Those that reference 'this': 2 (see below)
>   Those that reference an enclosing 'this': 48
>   Those that are interfaces: 752
>   Those that are classes: 59
> Total distinct interfaces: 50 (see below)
> Total distinct classes: 13 (see below)
> 
> A couple of interesting things about the use cases exposed by this analysis:
> 
> There is virtually no utility to making "this" refer to the function
> itself.  In the two cases where "this" appears, one does not actually
> use the value (null would work as well), and the other could be
> trivially rewritten using the proposed definite-assignment rule for a
> lambda appearing in a variable initializer.  None of the anonymous
> SAMs are recursive.  On the other hand, there are a fair number of
> explicit references to the instance of the enclosing class, which
> would benefit from lexical scoping.
> 
> I also note that the use cases involving classes do not suffer from
> lexically scoped lambdas because they can continue to be written
> exactly as they are today.  Even the proposed lambda spec does not
> provide typesafe access to the underlying SAM type, so I can't see
> anywhere this code base would benefit from lambdas in which "this"
> references the function object rather than the lexically enclosing
> instance.
> 
> Since Josh hadn't seen any use cases that benefit from lexical scoping
> of "this", I've also enclosed pointers to 48 locations in the openjdk6
> source base.
> 
> ====================================
> Below are shown the two places where "this" appears.
> 
> The first would be easily solved by a rule treating a variable as
> definitely assigned in the right-hand-side of its declaration if the
> initializing expression is a delegate.
> 
> In the second, "null" would work just as well as "this", because the
> value is discarded by the caller (on the next line).
> 
> in src/share/classes/sun/java2d/StateTrackableDelegate.java:
>    public synchronized StateTracker getStateTracker() {
>        StateTracker st = theTracker;
>        if (st == null) {
>            switch (theState) {
>            case IMMUTABLE:
>                st = StateTracker.ALWAYS_CURRENT;
>                break;
>            case STABLE:
>                st = new StateTracker() {
>                    public boolean isCurrent() {
>                        return (theTracker == this);
>                    }
>                };
>                break;
>     ....
> 
> in src/share/classes/javax/imageio/spi/IIORegistry.java
>         PrivilegedAction doRegistration =
>             new PrivilegedAction() {
>                 public Object run() {
>                     Iterator categories = getCategories();
>                     while (categories.hasNext()) {
>                         Class<IIOServiceProvider> c = (Class)categories.next();
>                         for (IIOServiceProvider p :
> ServiceLoader.loadInstalled(c)) {
>                             registerServiceProvider(p);
>                         }
>                     }
>                     return this;
>                 }
>             };
>         AccessController.doPrivileged(doRegistration);
> 
> ====================================
> Below are all the distinct classes
> 
>      com.sun.tools.example.debug.tty.Commands.AsyncExecution
>      com.sun.tools.hat.internal.model.AbstractJavaHeapObjectVisitor
>      com.sun.tools.hat.internal.util.Comparer
>      java.awt.font.TextLine.Function
>      java.io.InputStream
>      java.io.OutputStream
>      java.lang.Thread
>      java.nio.charset.CoderResult.Cache
>      java.util.TimerTask
>      java.util.regex.Pattern.CharProperty
>      java.util.regex.Pattern.CharPropertyNames.CharPropertyFactory
>      java.util.regex.Pattern.CharPropertyNames.CloneableProperty
>      javax.swing.AbstractAction
> 
> 
> ====================================
> Below are all the distinct interfaces
> 
>      com.sun.java.util.jar.pack.Histogram.BitMetric
>      com.sun.jdi.connect.Transport
>      com.sun.jmx.remote.internal.NotificationBufferFilter
>      com.sun.media.sound.ModelTransform
>      com.sun.net.ssl.HostnameVerifier
>      com.sun.security.auth.callback.DialogCallbackHandler.Action
>      com.sun.tools.example.debug.bdi.InputListener
>      com.sun.tools.example.debug.bdi.OutputListener
>      com.sun.tools.example.debug.expr.ExpressionParser.GetFrame
>      com.sun.tools.hat.internal.oql.ObjectVisitor
>      com.sun.tools.jdi.CommandSender
>      com.sun.tools.script.shell.Main.Command
>      java.awt.Conditional
>      java.awt.KeyEventPostProcessor
>      java.awt.event.ActionListener
>      java.awt.event.HierarchyListener
>      java.beans.ExceptionListener
>      java.beans.PropertyChangeListener
>      java.beans.VetoableChangeListener
>      java.io.FilenameFilter
>      java.io.ObjectInputValidation
>      java.lang.Runnable
>      java.net.CookiePolicy
>      java.net.HttpCookie.CookieAttributeAssignor
>      java.security.PrivilegedAction
>      java.security.PrivilegedExceptionAction
>      java.util.Comparator
>      java.util.Enumeration
>      java.util.concurrent.Callable
>      java.util.concurrent.Executor
>      java.util.concurrent.ThreadFactory
>      javax.imageio.event.IIOReadWarningListener
>      javax.imageio.event.IIOWriteWarningListener
>      javax.management.NotificationListener
>      javax.swing.UIDefaults.ActiveValue
>      javax.swing.UIDefaults.LazyValue
>      javax.swing.event.CaretListener
>      javax.swing.event.ChangeListener
>      javax.swing.event.HyperlinkListener
>      javax.xml.crypto.KeySelectorResult
>      javax.xml.crypto.NodeSetData
>      sun.awt.RequestFocusController
>      sun.java2d.StateTracker
>      sun.java2d.cmm.ProfileActivator
>      sun.java2d.loops.ProcessPath.EndSubPathHandler
>      sun.misc.JavaIODeleteOnExitAccess
>      sun.misc.JavaLangAccess
>      sun.misc.JavaNetAccess
>      sun.nio.ch.FileChannelImpl.FileLockTable.Releaser
>      sun.nio.ch.Interruptible
> 
> 
> ====================================
> 
> Locations in openjdk6 where lexically-scoped "this" would be helpful:
> 
> src/share/classes/com/sun/java/util/jar/pack/Histogram.java:187
> src/share/classes/com/sun/media/sound/SoftJitterCorrector.java:126
> src/share/classes/com/sun/security/auth/PolicyFile.java:849
> src/share/classes/com/sun/tools/example/debug/bdi/JDIEventSource.java:80
> src/share/classes/com/sun/tools/jdi/ClassTypeImpl.java:167
> src/share/classes/com/sun/tools/jdi/ClassTypeImpl.java:189
> src/share/classes/com/sun/tools/jdi/ObjectReferenceImpl.java:341
> src/share/classes/java/awt/Container.java:2744
> src/share/classes/java/awt/Container.java:4268
> src/share/classes/java/awt/Container.java:4283
> src/share/classes/java/awt/EventQueue.java:823
> src/share/classes/java/awt/SequencedEvent.java:92
> src/share/classes/java/awt/datatransfer/Clipboard.java:128
> src/share/classes/java/awt/datatransfer/Clipboard.java:326
> src/share/classes/java/beans/beancontext/BeanContextSupport.java:1296
> src/share/classes/java/beans/beancontext/BeanContextSupport.java:1310
> src/share/classes/java/lang/Class.java:1306
> src/share/classes/java/nio/channels/spi/AbstractSelector.java:208
> src/share/classes/java/security/ProtectionDomain.java:317
> src/share/classes/java/util/regex/Pattern.java:3352
> src/share/classes/javax/management/monitor/Monitor.java:1609
> src/share/classes/javax/swing/BufferStrategyPaintManager.java:213
> src/share/classes/javax/swing/JComponent.java:4804
> src/share/classes/javax/swing/JOptionPane.java:1011
> src/share/classes/javax/swing/JOptionPane.java:1524
> src/share/classes/javax/swing/ProgressMonitor.java:214
> src/share/classes/javax/swing/SwingWorker.java:902
> src/share/classes/javax/swing/TimerQueue.java:95
> src/share/classes/javax/swing/plaf/basic/BasicLookAndFeel.java:2123
> src/share/classes/javax/swing/plaf/basic/BasicPopupMenuUI.java:745
> src/share/classes/javax/swing/plaf/basic/BasicPopupMenuUI.java:778
> src/share/classes/javax/swing/text/JTextComponent.java:4932
> src/share/classes/sun/applet/AppletClassLoader.java:631
> src/share/classes/sun/applet/AppletViewer.java:641
> src/share/classes/sun/awt/datatransfer/SunClipboard.java:113
> src/share/classes/sun/awt/datatransfer/SunClipboard.java:287
> src/share/classes/sun/awt/im/InputContext.java:648
> src/share/classes/sun/security/jca/ProviderConfig.java:244
> src/share/classes/sun/security/provider/SeedGenerator.java:255
> src/share/classes/sun/tools/jconsole/inspector/XSheet.java:181
> src/share/classes/sun/tools/jconsole/inspector/XSheet.java:216
> src/share/classes/sun/tools/jconsole/inspector/XSheet.java:329
> src/share/classes/sun/tools/jconsole/inspector/XSheet.java:371
> src/share/classes/sun/tools/jconsole/inspector/XSheet.java:411
> src/share/classes/sun/tools/jconsole/inspector/XSheet.java:668
> src/share/classes/sun/tools/jconsole/inspector/XSheet.java:686
> src/share/classes/sun/tools/jconsole/inspector/XTree.java:159
> src/share/classes/sun/tools/jconsole/inspector/XTree.java:261
> 


More information about the lambda-dev mailing list