| Commit message (Collapse) | Author | Age | Files | Lines |
... | |
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
|/ |
|
|
|
|
| |
In favour of the type defined by the active FutureSystem.
|
|\
| |
| | |
Update TODO comment about pres. compiler friendliness.
|
| | |
|
|/
|
|
| |
2013 must have been unlucky.
|
| |
|
|\
| |
| | |
Another take at the 2.10/2.11 spanning suppressMacroAttachment
|
| |
| |
| |
| | |
It was only working on the former.
|
|/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The new tree shapes handled for do/while look like:
// type checked
async({
val b = false;
doWhile$1(){
await(());
if (b)
doWhile$1()
else
()
};
()
})
We had to change ExprBuilder to create states for the if/else
that concludes the doWhile body, and also loosen the assertion
that the label jump must be the last thing we see.
We also have to look for more than just `containsAwait` when
deciding whether an `If` needs to be transformed into states;
it might also contain a jump to the enclosing label that is on
the other side of an `await`, and hence needs to be a state
transition instead.
|
|\
| |
| | |
Hooks for custom async implementations
|
| |
| |
| |
| |
| | |
Custom implementation of the async macro may choose to use
a different data type to represent `Throwable | A`.
|
| |
| |
| |
| | |
For use by custom implementations of the async macro.
|
| |
| |
| |
| | |
"There's a method for that!"
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Right now, the body of an async block suffers from diminished
IDE support: most notably hyperlinking doesn't work [1].
During the course of the blackbox/whitebox macro discussion,
we've often talked about how the former give us the latitude
to simply disable macro expansion in the IDE so we could get
these features working again, at the cost of losing domain
specific errors, such as "await must not be used under a
nested function".
But why not have our cake and eat too?
This commit detects if we are running the presentation compiler
and, after running our regular macro, returns the original macro
application. We need to annotate that tree to prevent the typechecker
from stubbornly calling our macro again.
EXPERIMENTAL NOTE: This logic shouldn't live in macros: this is
just a short term measure. If these experiments in async prove
successful, we'll roll something similar into the macro expansion
engine itself.
TODO: as a performance optimization, we could just run the
"unsupported await" checks, and avoid doing the more expensive
state machine transformation.
[1] https://www.assembla.com/spaces/scala-ide/tickets/1001449-code-navigation-fails-when-macros-are-used#/activity/ticket:
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
We were using a TypingTransformer and we called
`atOwner` before we had called `transform`. This
meant that `currTree` was null, which was observed
when that was passed to `Context#make`.
IDE ticket:
https://scala-ide-portfolio.assembla.com/spaces/scala-ide/tickets/1001971#/activity/ticket:
Stack trace:
exception during macro expansion: java.lang.NullPointerException
at scala.tools.nsc.interactive.ContextTrees$class.addContext(ContextTrees.scala:78)
at scala.tools.nsc.interactive.Global.addContext(Global.scala:28)
at scala.tools.nsc.interactive.Global.registerContext(Global.scala:268)
at scala.tools.nsc.typechecker.Contexts$Context.make(Contexts.scala:295)
at scala.tools.nsc.typechecker.Contexts$Context.make0(Contexts.scala:320)
at scala.tools.nsc.typechecker.Contexts$Context.make(Contexts.scala:327)
at scala.tools.nsc.typechecker.Typers$Typer.atOwner(Typers.scala:5662)
at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:33)
at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:28)
at scala.async.internal.AsyncTransform$class.fixup$1(AsyncTransform.scala:191)
|
| | |
|
|/
|
|
|
|
|
|
|
| |
These stem from the handling of the internal/external view
or method type parameters by `thisMethodType` in `Namers`.
I've now preseversed the orginal ValDefs favoured the latter
when constructing the new DefDef, and made construction of
all liftables consistent in this regard.
|
|
|
|
|
| |
Once they escape, we leave the references in the state
machines fields untouched.
|
|
|
|
| |
Completes removal performed in #37.
|
|
|
|
|
|
| |
The generated code can simply extends Function1 and Function0.
This class was a hacky means to get the macro working a long
time ago.
|
|
|
|
|
|
|
|
|
|
| |
- Remove the CPS fallback version of async. That was not intended
to be part of 1.0.
- Lookup the await method beside the macro, rather than requiring
all calls to go to AsyncBase.await.
- Create a minimal version of Async that just contains await/async
and delegates to the macro implementation in internal._
- Add scaladoc.
|
|
|
|
|
|
| |
We were relying on an internal API that no longer exists.
We also need to tweak the way our tests infer scalaBinaryVersion.
|
| |
|
|
|
|
|
| |
- Zero out fields of type Any
- Zero out fields of value class type
|
|
|
|
|
|
|
| |
- Adds a hook that lets a derived macro insert additional code
when zero-ing out a lifted field.
- Adds a variant of the `AsyncId` macro that logs zeroed-out fields.
- Adds a test using this mechanism
|
|
|
|
|
| |
- A missing condition could cause an infinite loop
- Various clean-ups
|
|
|
|
|
|
|
|
| |
- Iterative, backwards data-flow analysis
- Make sure fields captured by nested defs are never zeroed out.
This is done elegantly by declaring such fields a being live
at the exit of the final state; thus, they will never be
zeroed out.
|