Bootstrap using lambda (fail)
// java
return service.get().getBootstrap().bootstrap().doOnNext(data -> {
Account account = data.getAccount();
if (account == null) auth.get().resetSessionData(false);
else auth.get().setSessionData(account, data.getKeychain());
theme.get().setCustomization(data.getCustomization());
analytics.get().init(data.getAnalyticsUserAccount() + ":" + data.
getAnalyticsDomainName());
OsmQueryResolver.configureServer(data.getReverseGeocodingUrl());
final String user = account == null ? "anonymous" : account.getEmail();
log.fine("Bootstrap data loaded successfully (user=" + user + ")");
});
// javascript + pretty
function $lambda$5(this$static) {
var lastArg;
null .$_nullMethod();
$resetSessionData(castTo(this$static.auth.get_1(), 400), false);
$setCustomization((lastArg = castTo(this$static.theme.get_1(), 1067),
null .$_nullMethod(),
lastArg));
castTo(this$static.analytics.get_1(), 6137).init_2(null .$_nullMethod()
+ ':' + null .$_nullMethod());
configureServer(null .$_nullMethod());
$fine_0(log_3, 'Bootstrap data loaded successfully (user=anonymous)');
}
ProcessResponse using anonymous class (success).
// java
tracker.add(heads.subscribe(new Action1<SubscriptionResponse>() {
@Override public void call(SubscriptionResponse response) {
ClientTelemetryStore.this.processResponse(response);
}
}));
// Javascript
defineClass(2064, 1, {}, ClientTelemetryStore$1);
_.call_0 = function call_145(response) {
$call_3(this, castToAllowJso(response, 6180));
};
function $call_3(this$static, response) {
$processResponse(this$static.this$01, response);
}
function $processResponse(this$static, response) {
var newUnits, xs, xs$iterator, xs$iterator0;
requireNonNull_0(response, 'response required');
requireNonNull_0(response.uuid, 'response.uuid required’);
ProcessResponse using lambda (fail).
// Java
tracker.add(heads.subscribe(response -> { ClientTelemetryStore.this.
processResponse(response); }));
// Javascript
defineClass(2063, 1, {}, ClientTelemetryStore$lambda$3$Type);
_.call_0 = function call_153(arg0) {
$processResponse(this.$$outer_0, throwClassCastExceptionUnlessNull(arg0)
);
};
function $processResponse(this$static, response) {
var newUnits, xs, xs$iterator, xs$iterator0;
requireNonNull_0(response, 'response required');
requireNonNull_0(null .$_nullMethod(), 'response.uuid required');
I did not use pretty style because I thought that this flag produces
different result, I tested now and looks like the output is the same, but,
I'm pretty sure that some flags changes this issues, optimize is obvious
that fixes the problem, but I think that namespace=package also changes the
result.
I know that this was easier if we have a sample project, but I can't
reproduce! :( You can try, the ResourceRegistry case is plain java + guava.
But when you copy to a clean project, the bug disappear.
this.store = Suppliers.memoize(() -> from(resources.get()).uniqueIndex(
ResourceDescriptor::getType));
Resource descriptor is an interface with only one implementation where type
is a Class<?> type field, a getType return this field. Anyway, I'm still
trying to reproduce in a small project.
On Monday, October 26, 2015 at 5:26:33 PM UTC+1, Roberto Lublinerman wrote:
>
> Also could you try the equivalent lamda that is not a method reference, i.e
>
> (parameters) -> this.processResponse(params);
>
> I looked at the way we construct the innerclasses corresponding to lambdas
> and it looks ok.
>
> It would really help if you could narrow it down to a small reprocase that
> I can run.
>
> On Sun, Oct 25, 2015 at 5:23 AM, Ignacio Baca Moreno-Torres <
> [email protected] <javascript:>> wrote:
>
> function ILe(a) {
> var b;
> b = Erb(PDl(a.a, 'REFXXX store'), 164);
> Erb(PDl(Erb(b.De(), 82), 'REFXXX store.get()'), 82);
> return Erb(PDl(undefined, 'REFXXX store.get().values()'), 6)
> }
>
> This was the actual b.De() function.
> u9c(701, 1, { 164: 1, 701: 1, 3: 1 }, Uh);
> _.De = function Vh() {
> var a;
> if (!this.b) {
> if (!this.b) {
> a = this.a.De();
> this.c = a;
> this.b = true;
> return a
> }
> }
> return this.c
> };
> _.Bd = function Wh() { return 'Suppliers.memoize(' + this.a + ')' };
> _.b = false;
> var ltb = epl(tbm, 'Suppliers/MemoizingSupplier', 701);
>
> And the highlighted this.a.De() call the Supplier.get(). (this return
> a,b,c; is pretty obscure!, equivalent to a;b;return c;)
> _.De = function RLe() {
> var a, b, c;
> return a = Erb(iEl(this.a, 'REF003 resources'), 38),
> b = Erb(iEl(Erb(a.De(), 62), 'REF004 resources.get()'), 62),
> c = Vu(new $u(b,b), new TLe),
> Erb(iEl(c, 'REF001'), 82)
> }
>
>
> On Sunday, October 25, 2015 at 12:18:01 PM UTC+1, Ignacio Baca
> Moreno-Torres wrote:
>
> Sorry, this is pretty confusing, just comment that the lamba cases
> described previously still (in HEAD) get solved when lamdas are changed to
> anonymous classes.
>
> On Sunday, October 25, 2015 at 12:08:09 PM UTC+1, Ignacio Baca
> Moreno-Torres wrote:
>
> Next, I show two methods, this.getResource and the 'this' constructor.
> getResource get wrong because the output never assigns the map variable.
> And the constructor is showed to see how this.store is assigned. This time,
> the anonymous class do not solves the problem.
>
>
> public Collection<ResourceDescriptor<?>> getResources() {
> Supplier<Map<Class<?>, ResourceDescriptor<?>>> store =
> requireNonNull(this.store, "REFXXX store");
> Map<Class<?>, ResourceDescriptor<?>> map = requireNonNull(store.get(),
> "REFXXX store.get()");
> return requireNonNull(map.values(),"REFXXX store.get().values()");
>
> }
>
>
> function ILe(a) {
> var b;
> b = Erb(PDl(a.a, 'REFXXX store'), 164);
> *Erb(PDl(Erb(b.De(), 82), 'REFXXX store.get()'), 82);*
> return Erb(PDl(undefined, 'REFXXX store.get().values()'), 6)
> }
>
>
> And this is how this.store is initialized (also with lot of requireNotNull
> to easier matching between java and js)
>
> @Inject
> public ResourceRegistry(Provider<Set<ResourceDescriptor<?>>> resources) {
> this.store = requireNonNull(Suppliers.memoize(new Supplier<Map<Class<?>,
> ResourceDescriptor<?>>>() {
> @Override public Map<Class<?>, ResourceDescriptor<?>> get() {
> Provider<Set<ResourceDescriptor<?>>> ref003 =
> requireNonNull(resources, "REF003 resources");
> Set<ResourceDescriptor<?>> ref004 = requireNonNull(ref003.get(),
> "REF004 resources.get()");
> ImmutableMap<Class<?>, ResourceDescriptor<?>> ref002 =
> from(ref004).uniqueIndex(
> new Function<ResourceDescriptor<?>, Class<?>>() {
> @Nullable @Override
> public Class<?> apply(@Nullable ResourceDescriptor<?>
> resourceDescriptor) {
> return
> requireNonNull(resourceDescriptor.getType(), "REF002");
> }
> });
> return requireNonNull(ref002, "REF001");
> }
> }), "REF000");
> }
>
>
> o9c(2629, 1, Lwm, KLe);
> _.De = function LLe() {
> var a, b, c;
> return a = Erb(PDl(this.a, 'REF003 resources'), 38),
> b = Erb(PDl(Erb(a.De(), 62), 'REF004 resources.get()'), 62),
> c = Vu(new $u(b,b), new NLe),
> Erb(PDl(c, 'REF001'), 82)
> };
> var s_b = Lol(dvm, 'ResourceRegistry/1', 2629);
>
> function MLe(a) {
> return Erb(PDl(a.bw(), 'REF002'), 23)
> }
>
> function JLe(a) {
> this.a = Erb(PDl(Th(new KLe(a)), 'REF000'), 164)
> }
>
> I think this is the highlighted b.De
>
> var ltb = Lol(Uam, 'Suppliers/MemoizingSupplier', 701);
> o9c(702, 1, {
> 164: 1,
> 702: 1,
> 3: 1
> }, Xh);
> _.zd = function Yh(a) {
> var b;
> if (Mrb(a, 702)) {
> b = Erb(a, 702);
> return Jf(this.a, b.a)
> }
> return false
> };
> _.De = function Zh() {
> return this.a
> }
> ...
>
>
> On Sunday, October 25, 2015 at 10:43:58 AM UTC+1, Ignacio Baca
> Moreno-Torres wrote:
>
> Recompiled using HEAD dcea13b1d223513418c90c34324ac6929059de3c, with no
> JsInterop and optimization 1.
> function $Xj(a, b) {
> var c, d, e, f;
> JDl(b, 'response required');
> JDl(null .V0(), 'response.uuid required');
> a.g = null .V0();
> c = false;
> for (f = null .V0().V0(); f.Md(); ) {
> d = Irb(f.Nd());
> c = c | _Xj(a, d)
> }
> for (e = null .V0().V0(); e.Md(); ) {
> d = Frb(e.Nd(), 6163);
> aYj(a, d)
> }
> c && B8l(a.d, a.c)
> }
>
> net.ltgt.gwt:gwt-maven-plugin configuration
> [DEBUG] Configuring mojo
> 'net.ltgt.gwt.maven:gwt-maven-plugin:1.0-rc-2:compile' with basic
> configurator -->
> [DEBUG] (f) compilerArgs = [-gen, ???/target/gwt/gen]
> [DEBUG] (f) deploy = ???/target/gwt/deploy
> [DEBUG] (f) draftCompile = false
> [DEBUG] (f) extra = ???/target/gwt/extra
> [DEBUG] (f) failOnError = true
> [DEBUG] (f) forceCompilation = false
> [DEBUG] (f) moduleName = com.app.DraftBundle
> [DEBUG] (f) optimize = 1
> [DEBUG] (f) project = MavenProject: ???/pom.xml
> [DEBUG] (f) skipCompilation = false
> [DEBUG] (f) sourceLevel = 1.8
> [DEBUG] (f) staleMillis = 0
> [DEBUG] (f) style = OBFUSCATED
> [DEBUG] (f) webappDirectory = ???/target/app
> [DEBUG] (f) workDir = ???/target/gwt/work
>
> more context (removed long packages_names)
> // Java Code (this lambda) -----v
> tracker.add(heads.subscribe(ClientTelemetryStore.this::processResponse));
> // Javascript Output
> o9c(2061, 1, {}, M5j);
> _.$u = function L5j(a) { $Xj(this.a, a) };
> var oQc = Fol(o1m,
> 'ClientTelemetryStore/ClientTelemetryStore$__$Action1$__$instance$ClientTelemetryStore$processResponse__LTelemetrySubscription$SubscriptionResponse_2V$Type'
> , 2061);
>
> And... trying to add this extra context, one more failure come up. This
> one has appeared after updating to the HEAD dcea13b from 7129828 (sorry, I
> said to roberto that I was using 94e4597, but I was really using
> *7129828 *7 August 2015 at 13:08:36 GMT+2).
>
> The new nullified method; although this time is an undefined. So
> repeating; this error came up just updating from 7129828 to dcea13b.
> // Java Code (this lambda)
> -------V
> this.store = Suppliers.memoize(() -> from(resources.get()).uniqueIndex(
> ResourceDescriptor::getType));
> // Javasript Output
> o9c(1639, 1, pcm, mRe);
> _.Xd = function lRe(a) { return undefined };
> var x0b = Fol(Yum,
> 'ResourceDescriptor/ResourceRegistry$__$Function$__$static$ResourceDescriptor$getType__LClass_2$Type'
> , 1639);
>
> On Sunday, October 25, 2015 at 3:42:10 AM UTC+1, Roberto Lublinerman wrote:
>
> The only thing I can think of is that when the class is created for the
> lambda in gwtastbuilder, the super class or implemented interfaces are not
> set up correctly.
>
> I'll check later to see if that is there case.
> On Oct 24, 2015 19:07, "'Ray Cromwell' via GWT Contributors" <
> [email protected]> wrote:
>
> Are you using @JsFunction/JsInterop? Unless the implementation has changed
> recently, Lambda's are supported in GWT by essentially synthesizing static
> inner classes, and so if static inner classes work, but lambda's don't,
> it's really weird. The optimization stages no nothing of lambdas and only
> see Java classes. The exception is @JsFunction.
>
>
> On Sat, Oct 24, 2015 at 2:37 PM, Ignacio Baca Moreno-Torres <
> [email protected]> wrote:
>
> This was from 94e45975a06ece1b8d65541aaabf833f9d8c7b07 (6 October 2015 at
> 04:29:19 GMT+2), I'll try tomorrow with HEAD, but looking the commits
> looks improbable that the problem has been solved.
>
> On Sat, Oct 24, 2015 at 10:30 PM 'Roberto Lublinerman' via GWT
> Contributors <[email protected]> wrote:
>
> Are you using a recent snapshot?
> On Oct 24, 2015 04:40, "Ignacio Baca Moreno-Torres" <[email protected]>
> wrote:
>
> There is a bug which optimizations nullify variables which might not be
> null. I'm trying to reproduce the error outside our app but I can't, I'll
> continue trying, but for now I going to describe the problem.
>
> return service.get().getBootstrap().bootstrap().doOnNext(data -> {
> Account account = data.getAccount
>
> ...
--
You received this message because you are subscribed to the Google Groups "GWT
Contributors" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/google-web-toolkit-contributors/af445d63-0ae8-4c52-acc7-9dd9845d022e%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.