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

Mark Mahieu markmahieu at googlemail.com
Wed Feb 3 13:21:35 PST 2010


I may be wrong, but I seem to recall that openjdk mailing lists strip attachments by default.  Might be worthwhile requesting that's changed for lambda-dev if so.

Mark


On 3 Feb 2010, at 21:06, Alex Buckley wrote:

> 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