Skip to content

Commit eb41d43

Browse files
committed
[dart2wasm] Make JS setters not return a value, fix incorrect variable name, use === instead of ==
Change-Id: I129f2b28535c8676b620e78389f6903d1448d904 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/426802 Reviewed-by: Ömer Ağacan <[email protected]> Commit-Queue: Martin Kustermann <[email protected]>
1 parent e582b10 commit eb41d43

File tree

2 files changed

+44
-13
lines changed

2 files changed

+44
-13
lines changed

pkg/dart2wasm/lib/js/interop_specializer.dart

Lines changed: 42 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ abstract class _Specializer {
4040
/// Whether this config is associated with a constructor or factory.
4141
bool get isConstructor;
4242

43+
/// Whether this is a setter where there's no return value.
44+
bool get isSetter;
45+
4346
/// The parameters that determine arity of the interop procedure that is
4447
/// created from this config.
4548
List<VariableDeclaration> get parameters;
@@ -61,15 +64,17 @@ abstract class _Specializer {
6164
final callArguments =
6265
firstParameterIsObject ? parameterNames.sublist(1) : parameterNames;
6366
final callArgumentsString = callArguments.join(',');
64-
final functionParameters = firstParameterIsObject
67+
String functionParameters = firstParameterIsObject
6568
? '$object${callArguments.isEmpty ? '' : ',$callArgumentsString'}'
6669
: callArgumentsString;
6770
final body = bodyString(object, callArguments);
71+
6872
if (parametersNeedParens(parameterNames)) {
69-
return '($functionParameters) => $body';
70-
} else {
71-
return '$functionParameters => $body';
73+
functionParameters = '($functionParameters)';
7274
}
75+
return isSetter
76+
? '$functionParameters => { $body }'
77+
: '$functionParameters => $body';
7378
}
7479

7580
/// Returns an [Expression] representing the specialization of a given
@@ -161,6 +166,9 @@ class _ConstructorSpecializer extends _ProcedureSpecializer {
161166
@override
162167
bool get isConstructor => true;
163168

169+
@override
170+
bool get isSetter => false;
171+
164172
@override
165173
String bodyString(String object, List<String> callArguments) =>
166174
"new $jsString(${callArguments.join(',')})";
@@ -172,6 +180,9 @@ class _GetterSpecializer extends _ProcedureSpecializer {
172180
@override
173181
bool get isConstructor => false;
174182

183+
@override
184+
bool get isSetter => false;
185+
175186
@override
176187
String bodyString(String object, List<String> callArguments) =>
177188
'$object.$jsString';
@@ -183,6 +194,9 @@ class _SetterSpecializer extends _ProcedureSpecializer {
183194
@override
184195
bool get isConstructor => false;
185196

197+
@override
198+
bool get isSetter => true;
199+
186200
@override
187201
String bodyString(String object, List<String> callArguments) =>
188202
'$object.$jsString = ${callArguments[0]}';
@@ -194,6 +208,9 @@ class _MethodSpecializer extends _ProcedureSpecializer {
194208
@override
195209
bool get isConstructor => false;
196210

211+
@override
212+
bool get isSetter => false;
213+
197214
@override
198215
String bodyString(String object, List<String> callArguments) =>
199216
"$object.$jsString(${callArguments.join(',')})";
@@ -205,15 +222,20 @@ class _OperatorSpecializer extends _ProcedureSpecializer {
205222
@override
206223
bool get isConstructor => false;
207224

225+
@override
226+
bool get isSetter => switch (jsString) {
227+
'[]' => false,
228+
'[]=' => true,
229+
_ => throw UnimplementedError(
230+
'External operator $jsString is unsupported for static interop. '
231+
'Please file a request in the SDK if you want it to be supported.')
232+
};
233+
208234
@override
209235
String bodyString(String object, List<String> callArguments) {
210-
return switch (jsString) {
211-
'[]' => '$object[${callArguments[0]}]',
212-
'[]=' => '$object[${callArguments[0]}] = ${callArguments[1]}',
213-
_ => throw UnimplementedError(
214-
'External operator $jsString is unsupported for static interop. '
215-
'Please file a request in the SDK if you want it to be supported.')
216-
};
236+
return isSetter
237+
? '$object[${callArguments[0]}] = ${callArguments[1]}'
238+
: '$object[${callArguments[0]}]';
217239
}
218240
}
219241

@@ -270,6 +292,9 @@ class _ConstructorInvocationSpecializer
270292
@override
271293
bool get isConstructor => true;
272294

295+
@override
296+
bool get isSetter => false;
297+
273298
@override
274299
String bodyString(String object, List<String> callArguments) =>
275300
"new $jsString(${callArguments.join(',')})";
@@ -282,6 +307,9 @@ class _MethodInvocationSpecializer extends _PositionalInvocationSpecializer {
282307
@override
283308
bool get isConstructor => false;
284309

310+
@override
311+
bool get isSetter => false;
312+
285313
@override
286314
String bodyString(String object, List<String> callArguments) =>
287315
"$object.$jsString(${callArguments.join(',')})";
@@ -297,6 +325,9 @@ class _ObjectLiteralSpecializer extends _InvocationSpecializer {
297325
@override
298326
bool get isConstructor => true;
299327

328+
@override
329+
bool get isSetter => false;
330+
300331
@override
301332
List<VariableDeclaration> get parameters {
302333
// Compute the named parameters that were used in the given `invocation`.

pkg/dart2wasm/lib/js/runtime_blob.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ class CompiledApp {
7676
return;
7777
}
7878
79-
throw "Unable to print message: " + js;
79+
throw "Unable to print message: " + value;
8080
}
8181
8282
// A special symbol attached to functions that wrap Dart functions.
@@ -165,7 +165,7 @@ const jsStringPolyfill = {
165165
return result;
166166
},
167167
"intoCharCodeArray": (s, a, start) => {
168-
if (s == '') return 0;
168+
if (s === '') return 0;
169169
170170
const write = dartInstance.exports.$wasmI16ArraySet;
171171
for (var i = 0; i < s.length; ++i) {

0 commit comments

Comments
 (0)