@@ -16,9 +16,9 @@ import '../js_interop.dart'
16
16
17
17
/// Replaces:
18
18
/// 1) Factory constructors in classes with `@staticInterop` annotations with
19
- /// calls to `js_util_wasm.callConstructorVarArgs `.
19
+ /// calls to `js_util.callConstructor `.
20
20
/// 2) External methods in `@staticInterop` class extensions to their
21
- /// corresponding `js_util_wasm ` calls.
21
+ /// corresponding `js_util ` calls.
22
22
/// TODO(joshualitt): In the long term we'd like to have the same
23
23
/// `JsUtilOptimizer` for all web backends. This is to ensure uniform semantics
24
24
/// across all web backends. Some known challenges remain, and there may be
@@ -45,21 +45,18 @@ import '../js_interop.dart'
45
45
class JsUtilWasmOptimizer extends Transformer {
46
46
final Procedure _callMethodTarget;
47
47
final Procedure _callConstructorTarget;
48
- final Procedure _globalThisTarget;
49
48
final Procedure _getPropertyTarget;
50
49
final Procedure _setPropertyTarget;
51
- final Procedure _jsifyTarget;
52
50
final Procedure _jsifyRawTarget;
53
- final Procedure _dartifyTarget;
54
51
final Procedure _newObjectTarget;
55
52
final Procedure _wrapDartCallbackTarget;
56
53
final Procedure _allowInteropTarget;
57
- final Class _jsValueClass;
58
54
final Class _wasmAnyRefClass;
59
55
final Class _objectClass;
60
56
final Class _pragmaClass;
61
57
final Field _pragmaName;
62
58
final Field _pragmaOptions;
59
+ final Member _globalThisMember;
63
60
int _callbackTrampolineN = 1 ;
64
61
65
62
final CoreTypes _coreTypes;
@@ -68,30 +65,24 @@ class JsUtilWasmOptimizer extends Transformer {
68
65
final Set <Class > _transformedClasses = {};
69
66
70
67
JsUtilWasmOptimizer (this ._coreTypes, ClassHierarchy hierarchy)
71
- : _callMethodTarget = _coreTypes.index
72
- . getTopLevelProcedure ('dart:js_util_wasm ' , 'callMethodVarArgs ' ),
73
- _globalThisTarget = _coreTypes.index
74
- .getTopLevelProcedure ('dart:js_util_wasm ' , 'globalThis' ),
75
- _callConstructorTarget = _coreTypes.index. getTopLevelProcedure (
76
- 'dart:js_util_wasm ' , 'callConstructorVarArgs ' ),
68
+ : _callMethodTarget =
69
+ _coreTypes.index. getTopLevelProcedure ('dart:js_util ' , 'callMethod ' ),
70
+ _globalThisMember = _coreTypes.index
71
+ .getTopLevelMember ('dart:js_util ' , 'get: globalThis' ),
72
+ _callConstructorTarget = _coreTypes.index
73
+ . getTopLevelProcedure ( 'dart:js_util ' , 'callConstructor ' ),
77
74
_getPropertyTarget = _coreTypes.index
78
- .getTopLevelProcedure ('dart:js_util_wasm ' , 'getProperty' ),
75
+ .getTopLevelProcedure ('dart:js_util ' , 'getProperty' ),
79
76
_setPropertyTarget = _coreTypes.index
80
- .getTopLevelProcedure ('dart:js_util_wasm' , 'setProperty' ),
81
- _jsifyTarget =
82
- _coreTypes.index.getTopLevelProcedure ('dart:js_util_wasm' , 'jsify' ),
77
+ .getTopLevelProcedure ('dart:js_util' , 'setProperty' ),
83
78
_jsifyRawTarget = _coreTypes.index
84
- .getTopLevelProcedure ('dart:js_util_wasm' , 'jsifyRaw' ),
85
- _dartifyTarget = _coreTypes.index
86
- .getTopLevelProcedure ('dart:js_util_wasm' , 'dartify' ),
79
+ .getTopLevelProcedure ('dart:_js_helper' , 'jsifyRaw' ),
87
80
_wrapDartCallbackTarget = _coreTypes.index
88
81
.getTopLevelProcedure ('dart:js_util_wasm' , '_wrapDartCallback' ),
89
- _newObjectTarget = _coreTypes.index
90
- . getTopLevelProcedure ('dart:js_util_wasm ' , 'newObject' ),
82
+ _newObjectTarget =
83
+ _coreTypes.index. getTopLevelProcedure ('dart:js_util ' , 'newObject' ),
91
84
_allowInteropTarget = _coreTypes.index
92
85
.getTopLevelProcedure ('dart:js_util_wasm' , 'allowInterop' ),
93
- _jsValueClass =
94
- _coreTypes.index.getClass ('dart:js_util_wasm' , 'JSValue' ),
95
86
_wasmAnyRefClass = _coreTypes.index.getClass ('dart:wasm' , 'WasmAnyRef' ),
96
87
_objectClass = _coreTypes.objectClass,
97
88
_pragmaClass = _coreTypes.pragmaClass,
@@ -120,6 +111,7 @@ class JsUtilWasmOptimizer extends Transformer {
120
111
121
112
@override
122
113
StaticInvocation visitStaticInvocation (StaticInvocation node) {
114
+ node = super .visitStaticInvocation (node) as StaticInvocation ;
123
115
if (node.target == _allowInteropTarget) {
124
116
Expression argument = node.arguments.positional.single;
125
117
DartType functionType = argument.getStaticType (_staticTypeContext);
@@ -208,14 +200,11 @@ class JsUtilWasmOptimizer extends Transformer {
208
200
return _extensionMemberIndex! ;
209
201
}
210
202
211
- DartType get _nullableJSValueType =>
212
- _jsValueClass. getThisType (_coreTypes, Nullability .nullable);
203
+ DartType get _nullableObjectType =>
204
+ _coreTypes. objectRawType ( Nullability .nullable);
213
205
214
- DartType get _nonNullableJSValueType =>
215
- _jsValueClass.getThisType (_coreTypes, Nullability .nonNullable);
216
-
217
- Expression _dartify (Expression expression) =>
218
- StaticInvocation (_dartifyTarget, Arguments ([expression]));
206
+ DartType get _nonNullableObjectType =>
207
+ _coreTypes.objectRawType (Nullability .nonNullable);
219
208
220
209
/// Creates a callback trampoline for the given [function] . This callback
221
210
/// trampoline expects a Dart callback as its first argument, followed by all
@@ -298,17 +287,7 @@ class JsUtilWasmOptimizer extends Transformer {
298
287
Arguments ([argument, StringLiteral (callbackTrampolineName)]));
299
288
}
300
289
301
- Expression _jsifyVariable (Procedure node, VariableDeclaration variable) {
302
- if (variable.type is FunctionType ) {
303
- return _allowInterop (
304
- node, variable.type as FunctionType , VariableGet (variable));
305
- } else {
306
- return StaticInvocation (_jsifyTarget, Arguments ([VariableGet (variable)]));
307
- }
308
- }
309
-
310
- StaticInvocation get _globalThis =>
311
- StaticInvocation (_globalThisTarget, Arguments ([]));
290
+ StaticGet get _globalThis => StaticGet (_globalThisMember);
312
291
313
292
/// Takes a list of [selectors] and returns an object off of
314
293
/// `globalThis` . We could optimize this with a custom method built with
@@ -329,8 +308,9 @@ class JsUtilWasmOptimizer extends Transformer {
329
308
Block _getExternalAnonymousConstructorBody (Procedure node) {
330
309
List <Statement > body = [];
331
310
final object = VariableDeclaration ('|anonymousObject' ,
332
- initializer: StaticInvocation (_newObjectTarget, Arguments ([])),
333
- type: _nonNullableJSValueType);
311
+ initializer: StaticInvocation (
312
+ _newObjectTarget, Arguments ([], types: [node.function.returnType])),
313
+ type: _nonNullableObjectType);
334
314
body.add (object);
335
315
for (VariableDeclaration variable in node.function.namedParameters) {
336
316
body.add (ExpressionStatement (
@@ -342,21 +322,22 @@ class JsUtilWasmOptimizer extends Transformer {
342
322
343
323
/// Returns a new function body for the given [node] external method.
344
324
///
345
- /// The new function body will call `js_util_wasm.callConstructorVarArgs `
325
+ /// The new function body will call `js_util.callConstructor `
346
326
/// for the given external method.
347
327
ReturnStatement _getExternalCallConstructorBody (
348
328
Procedure node, String constructorName) {
349
329
var function = node.function;
350
330
var callConstructorInvocation = StaticInvocation (
351
331
_callConstructorTarget,
352
332
Arguments ([
353
- _globalThis,
354
- StringLiteral (constructorName),
333
+ _getProperty (node, _globalThis, constructorName),
355
334
ListLiteral (
356
335
function.positionalParameters
357
- .map ((arg ) => _jsifyVariable (node, arg ))
336
+ .map < Expression >((value ) => VariableGet (value ))
358
337
.toList (),
359
- typeArgument: _nonNullableJSValueType)
338
+ typeArgument: _nullableObjectType)
339
+ ], types: [
340
+ node.function.returnType
360
341
]))
361
342
..fileOffset = node.fileOffset;
362
343
return ReturnStatement (callConstructorInvocation);
@@ -365,17 +346,19 @@ class JsUtilWasmOptimizer extends Transformer {
365
346
/// Returns a new [Expression] for the given [node] external getter.
366
347
///
367
348
/// The new [Expression] is equivalent to:
368
- /// `js_util_wasm .getProperty([object], [getterName])` .
349
+ /// `js_util .getProperty([object], [getterName])` .
369
350
Expression _getProperty (
370
351
Procedure node, Expression object, String getterName) =>
371
352
StaticInvocation (
372
- _getPropertyTarget, Arguments ([object, StringLiteral (getterName)]))
353
+ _getPropertyTarget,
354
+ Arguments ([object, StringLiteral (getterName)],
355
+ types: [node.function.returnType]))
373
356
..fileOffset = node.fileOffset;
374
357
375
358
/// Returns a new function body for the given [node] external getter.
376
359
ReturnStatement _getExternalGetterBody (
377
360
Procedure node, Expression object, String getterName) =>
378
- ReturnStatement (_dartify ( _getProperty (node, object, getterName) ));
361
+ ReturnStatement (_getProperty (node, object, getterName));
379
362
380
363
ReturnStatement _getExternalExtensionGetterBody (Procedure node) =>
381
364
_getExternalGetterBody (
@@ -390,19 +373,19 @@ class JsUtilWasmOptimizer extends Transformer {
390
373
/// Returns a new [Expression] for the given [node] external setter.
391
374
///
392
375
/// The new [Expression] is equivalent to:
393
- /// `js_util_wasm .setProperty([object], [setterName], [value])` .
376
+ /// `js_util .setProperty([object], [setterName], [value])` .
394
377
Expression _setProperty (Procedure node, Expression object, String setterName,
395
378
VariableDeclaration value) =>
396
379
StaticInvocation (
397
380
_setPropertyTarget,
398
- Arguments (
399
- [object, StringLiteral (setterName), _jsifyVariable ( node, value) ]))
381
+ Arguments ([object, StringLiteral (setterName), VariableGet (value)],
382
+ types : [ node.function.returnType ]))
400
383
..fileOffset = node.fileOffset;
401
384
402
385
/// Returns a new function body for the given [node] external setter.
403
386
ReturnStatement _getExternalSetterBody (Procedure node, Expression object,
404
387
String setterName, VariableDeclaration value) =>
405
- ReturnStatement (_dartify ( _setProperty (node, object, setterName, value) ));
388
+ ReturnStatement (_setProperty (node, object, setterName, value));
406
389
407
390
ReturnStatement _getExternalExtensionSetterBody (Procedure node) {
408
391
final parameters = node.function.positionalParameters;
@@ -419,18 +402,20 @@ class JsUtilWasmOptimizer extends Transformer {
419
402
/// Returns a new function body for the given [node] external method.
420
403
///
421
404
/// The new function body is equivalent to:
422
- /// `js_util_wasm.callMethodVarArgs ([object], [methodName], [values])` .
405
+ /// `js_util.callMethod ([object], [methodName], [values])` .
423
406
ReturnStatement _getExternalMethodBody (Procedure node, Expression object,
424
407
String methodName, List <VariableDeclaration > values) {
425
- final callMethodInvocation = _dartify ( StaticInvocation (
408
+ final callMethodInvocation = StaticInvocation (
426
409
_callMethodTarget,
427
410
Arguments ([
428
411
object,
429
412
StringLiteral (methodName),
430
413
ListLiteral (
431
- values.map ((value) => _jsifyVariable (node, value)).toList (),
432
- typeArgument: _nullableJSValueType)
433
- ])))
414
+ values.map <Expression >((value) => VariableGet (value)).toList (),
415
+ typeArgument: _nullableObjectType)
416
+ ], types: [
417
+ node.function.returnType
418
+ ]))
434
419
..fileOffset = node.fileOffset;
435
420
return ReturnStatement (callMethodInvocation);
436
421
}
0 commit comments