musictheory / NilScript

Objective-C-style language superset of JavaScript with a tiny, simple runtime
Other
50 stars 5 forks source link

Optimization: Coalesce nil checks #132

Closed iccir closed 1 year ago

iccir commented 6 years ago

From the following code:

let foo = [[Foo alloc] init];

[foo bar];
[foo baz];

oj generates:

var $oj_t_0;let foo = (($oj_t_0 = (new $oj_oj._cls.$oj_c_Foo())) && $oj_t_0.init());

(foo && foo.$oj_f_bar());
(foo && foo.$oj_f_baz());

It should be possible to write a Babel transformer to remove the unneeded foo && … check:

var $oj_t_0;let foo = (($oj_t_0 = (new $oj_oj._cls.$oj_c_Foo())) && $oj_t_0.init());

(foo && (
    foo.$oj_f_bar(),
    foo.$oj_f_baz()
));

Care must be given that foo isn't closed over and modified by foo.$oj_f_bar or foo.$oj_f_baz. (This should never be the case for oj methods, but may be the case for other JavaScript).

iccir commented 1 year ago

This is no longer application due to #168.

The above code now turns into:

let foo = (new N$$_._c.N$_c_Foo()).init();

foo?.bar();
foo?.baz();