Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Prototype indy+unreflectSpecial for super calls methods in the Java standard library #23

Closed
wants to merge 254 commits into from

Conversation

retronym
Copy link
Owner

No description provided.

performantdata and others added 30 commits May 3, 2016 11:46
Add an example benchmark for OpenHashMap.
In order to get a better exploration of the variance of tests in a
limited time, I've reduced the number of measurement iterations and
increased the number of forks.  By sight, the measurement iterations
seemed pretty consistent within a trial, whereas they would vary
widely on occasional forks.

I extended testing down to 50-entry maps, to explore the rise in
service times that I was seeing at small scale.  This is probably a
timing artifact, from too-short invocations, since I'm using
@Level.Invocation in the put() tests.  To fix that, I enlarged the
unit of testing, by creating multiple, sometimes thousands, of maps
for the invocation to fill.  This has also changed the test from
filling a previously-filled map, to filling a new, but sufficiently
sized map.  The put()/remove() test now performs much worse (on a
more realistic scenario).

This also adds a couple tests for calling get() against a map that's
been filled only with put()s, or with a mix of put() and remove().
Also add sbteclipse to the benchmark project.
For the warm-up invocations, suppress setup and teardown that is only
needed for the measurement iterations.  Reduce the number of forks.
Besides tweaks to the documentation, this tests smaller (25-element)
maps, and rewrites OpenHashMapRunner in more idiomatic Scala.
Use removeNames to help diagnose the application.
Supplement the error message with how many extra
args and any other residual assignments that the
user might have thought was a properly named arg.

The error message is gradual: succinct for short
arg lists, more verbose for longer applications.
Very long arg lists are probably generated, so
that message is the least colloquial.
Pick the first excessive positional arg for the caret.

Note that erroring on named args doesn't do the obvious thing
in this regard.

If `k` was removed from the signature, then `f(k=1, i=2, j=3)`
doesn't tell us much about the wrong arg, because naming takes
the `k=1` as an assignment, `i` as duplicate naming. No arg is
deemed extra, though further inspection of the conflicting args
might get there. Since assignment syntax in parens is more|less
deprecated (?), no more effort is done here.
Cheap name test: if the script object extends "App",
take it for a main-bearing parent.

Note that if `-Xscript` is not `Main`, the default,
then the source is taken as a snippet and there is
no attempt to locate an existing `main` method.
Scripting knows it by name.
In an unwrapped script, where a `main` entry point is discovered
in a top-level object, retain all top-level classes.

Everything winds up in the default package.
It's pretty confusing when your script object becomes a local
and then nothing happens. Such as when you're writing a test and
it takes forever to figure out what's going on.
Make broken JAR files on compiler classpath cause a fatal error
Fixed the warning when main module is accompanied by snippets.

Minor clean-up so even I can follow what is returned.
For Range and NumericRange, toString will indicate the step
if it is not 1.

Additionally, indicate empty ranges and ranges which are not
"exact".

For a "mapped" range, used by `Range.Double`, toString
includes the underlying range and the simple type of the step
(to distinguish Double from BigDecimal).
Refactor the ScriptEngine support to an adaptor atop the
IMain API.

Allow references to resolve to context attributes. (The
attributes must be defined at compilation time, though
they may resolve to updated values at evaluation time.)

This means that attributes are not bound statically in
REPL history. In particular, we forgo the trick of binding
attributes named "name: Type" as typed values.

Instead, an `x` bound in dynamic context is injected into
the script as a dynamic selection `$ctx.x` where `ctx`
performs the look-up in the script context.

When a compiled script is re-evaluated, a new instance of
the script class is created and defined symbols are
rebound.

The context stdout writer is handled with `Console.withOut`,
with bytes decoded using the default charset.

Compilation errors are thrown as ScriptException with the
first reported error.

This commit doesn't attempt dynamic selection from objects
in context. Currently, script must cast.
`convertToAssignment` is triggered on a type error but it doesn't seem
to really care what the error is as long as the expression can be
converted to an assignment expression.

This patch fixes that by checking whether the qualifier of the selection
contains any errors before deciding to continue with the conversion.
* Enhanced Scaladocs with groupings and clarifications
* traverse now runs the last step like sequence
* A few minor non-semantic changes to method implementations
[Build] Include missing web assets in scaladoc
Carsten Varming and others added 25 commits July 21, 2016 10:12
Concrete, non private methods in traits are translated into a static
method with an explicit `$this` parameter. After this translation,
the references to `$this` (subistuted for `this` in user written code)
where being positioned at the position of the method, which makes
debugging unpleasant.

This commit leaves the `Ident($this)` trees unpositioned. This is
analagous to what we do in the body of extension methods, which
is the other user of `ThisSubstitutor`.

It would be more correct to copy the position of each `This`
tree over to the substituted tree. That would let us set a breakpoint
on a line that _only_ contained `this`. But in 99% of cases users
won't be able to spot the difference, so I've opted for the tried
and tested approach here.
When we create a class symbols from a classpath elements, references
to other classes that are absent from the classpath are represented
as references to "stub symbols". This is not a fatal error; for instance
if these references are from the signature of a method that isn't called
from the program being compiled, we don't need to know anything about them.
A subsequent attempt to look at the type of a stub symbols will trigger a
compile error.

Currently, the creation of a stub symbol incurs a warning. This commit
removes that warning on the basis that it isn't something users need
to worry about. javac doesn't emit a comparable warning.

The warning is still issued under any of `-verbose` / `-Xdev` / `-Ydebug`.
Instead, we follow the example set by javac, and predicate serializability
of bot anon-class and invokedynamic-based lambdas on whether or not the
SAM type extends java.io.Serializable.

Fixes scala/scala-dev#120
Also update a few example IDE files for Eclipse and IntelliJ.

This drops the dependency by integrating the bare minimum functionality
to keep things working.
Non specialized functions can directly use `scala.FunctionN` as the
functional interface, now that mixin generates default methods in
the new trait encoding.

Unfortunately we can't do this for specialized functions as things
stand: specialization leaves the wrong method abstract. In principle,
we could/should amend the specialization transform to fix this. But
my earlier attempts at this weren't sucessful, so for now we have
to stick with the fallback plan of keeping some hand rolled functional
interfaces around.

This commit reduces the surface area of `scala.runtime.java8` to
the minimal requiremnt: one functional interface for each specialized
variant of `Function{0,1,2}`.
SD-121 Remove now-unneeded J{Function,Proc}N functional interfaces
SD-120 Non FunctionN lambdas should not be universally serializable
SD-186 Fix positions in trait method bytecode
Deprecate and rename Left#a/Right#b to Left#value/Right#value
Use File.pathSeparator when processing classpath instead of just :
to don't end up with classpath like "C:\sth\a.jar:C:\sth\b.jar" what
was causing problems after split(":").

Display questions first and then wait for user input. I tested on 3
computes and without flush the printed questions were always displayed
just after user replied - never before.
SI-8774 Null link fields in mutable LinkedHashMap (and friends) on remove
  - Avoid calling NoSymbol.owner when checking whether we're
    dealing with a case class constructor pattern or a general
    extractor. Tested manually with the test case in the ticket,
    no more output is produced under `-Xdev`.
  - Be more conservative about the conversion to a case class
    pattern: rather than looking just at the type of the pattern
    tree, also look at the tree itself to ensure its safe to
    elide. This change is analagous to SI-4859, which restricted
    rewrites of case apply calls to case constructors.

I've manually tested that case class patterns are still efficiently
translated:

```
object Test {
  def main(args: Array[String]) {
    Some(1) match { case Some(x) => }
  }
}

```

```
% qscalac -Xprint:patmat sandbox/test.scala
[[syntax trees at end of                    patmat]] // test.scala
package <empty> {
  object Test extends scala.AnyRef {
    def <init>(): Test.type = {
      Test.super.<init>();
      ()
    };
    def main(args: Array[String]): Unit = {
      case <synthetic> val x1: Some[Int] = scala.Some.apply[Int](1);
      case4(){
        if (x1.ne(null))
          matchEnd3(())
        else
          case5()
      };
      case5(){
        matchEnd3(throw new MatchError(x1))
      };
      matchEnd3(x: Unit){
        x
      }
    }
  }
}
```
SI-9560 Remove dependency on parser-combinators/json
Disable stub warning by default.
…tion

Improve sbt-based IntelliJ integration in case of Windows
SI-4914 Addition of tests resolves as fixed
SD-183 Make refinement classes ineligible as SAMs
SD-167 Fine tuning constructor pattern translation

Fixes scala/scala-dev#167
Switch Windows CI build to sbt (w/ some sbt build improvements) [ci: last-only]
Override `.slice` in ArrayOps to use arraycopy.
@retronym retronym changed the title Prototype indy+unreflectSpecial for super calls methods in the Java standard library. These differ in the whitespace in the original string. commit corrects the behavior of updated0 (which is on call path for work in such cases, instead of throwing NPE. Prototype indy+unreflectSpecial for super calls methods in the Java standard library Jul 28, 2016
@retronym retronym closed this Jul 28, 2016
@retronym retronym reopened this Jul 28, 2016
@retronym retronym closed this Jul 28, 2016
retronym added a commit that referenced this pull request Jun 24, 2019
And use this as the target of the default methods or
statically resolved super or $init calls.

The call-site change is predicated on `-Yuse-trait-statics`
as a stepping stone for experimentation / bootstrapping.

I have performed this transformation in the backend,
rather than trying to reflect this in the view from
Scala symbols + ASTs.

Once we commit to this change, we can remove the
`lateInterfaces` bookkeeping from the backend, as we no
long will need to add ancestor interfaces as direct
parents to allow use of invokespecial for super calls.

```
> ;scalac sandbox/test.scala ; scala Test

[info] Running scala.tools.nsc.MainGenericRunner -usejavacp Test
T
C
[success] Total time: 2 s, completed 04/05/2016 11:07:13 AM
> eval "javap -classpath . -c -private C".!!
[info] ans: String = Compiled from "test.scala"
[info] public class C implements T {
[info]   public C();
[info]     Code:
[info]        0: aload_0
[info]        1: invokespecial #14                 // Method java/lang/Object."<init>":()V
[info]        4: aload_0
[info]        5: invokespecial #17                 // Method T.$init$:()V
[info]        8: getstatic     #23                 // Field scala/Predef$.MODULE$:Lscala/Predef$;
[info]       11: ldc           #24                 // String C
[info]       13: invokevirtual #28                 // Method scala/Predef$.println:(Ljava/lang/Object;)V
[info]       16: aload_0
[info]       17: invokespecial #32                 // Method T.foo:()I
[info]       20: pop
[info]       21: return
[info] }
> ;scalac -Yuse-trait-statics sandbox/test.scala ; scala Test

[info] Running scala.tools.nsc.MainGenericRunner -usejavacp Test
T
C
[success] Total time: 2 s, completed 04/05/2016 11:07:39 AM
> eval "javap -classpath . -c -private C".!!
[info] ans: String = Compiled from "test.scala"
[info] public class C implements T {
[info]   public C();
[info]     Code:
[info]        0: aload_0
[info]        1: invokespecial #14                 // Method java/lang/Object."<init>":()V
[info]        4: aload_0
[info]        5: invokestatic  #18                 // Method T.$init$:(LT;)V
[info]        8: getstatic     #24                 // Field scala/Predef$.MODULE$:Lscala/Predef$;
[info]       11: ldc           #25                 // String C
[info]       13: invokevirtual #29                 // Method scala/Predef$.println:(Ljava/lang/Object;)V
[info]       16: aload_0
[info]       17: invokestatic  #33                 // Method T.foo:(LT;)I
[info]       20: pop
[info]       21: return
[info] }
> eval "javap -classpath . -c -private T".!!
[info] ans: String = Compiled from "test.scala"
[info] public interface T {
[info]   public static int foo(T);
[info]     Code:
[info]        0: iconst_0
[info]        1: ireturn
[info]
[info]   public int foo();
[info]     Code:
[info]        0: aload_0
[info]        1: invokestatic  #15                 // Method foo:(LT;)I
[info]        4: ireturn
[info]
[info]   public static void $init$(T);
[info]     Code:
[info]        0: getstatic     #24                 // Field scala/Predef$.MODULE$:Lscala/Predef$;
[info]        3: ldc           #25                 // String T
[info]        5: invokevirtual #29                 // Method scala/Predef$.println:(Ljava/lang/Object;)V
[info]        8: return
[info]
[info]   public void $init$();
[info]     Code:
[info]        0: aload_0
[info]        1: invokestatic  #32                 // Method $init$:(LT;)V
[info]        4: return
[info] }
```
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.