Skip to content

dart2js crashes with NoSuchMethodError on JS-interop code #42612

Closed
@yjbanov

Description

@yjbanov

I'm getting the following error trying to compile a Flutter app with engine changes in flutter/engine@4776107.

Target dart2js failed: Exception: Unhandled exception:                  
NoSuchMethodError: The getter 'isChecks' was called on null.
Receiver: null
Tried calling: isChecks
#0      Object.noSuchMethod (dart:core-patch/object_patch.dart:51:5)
#1      ProgramBuilder._buildClass.<anonymous closure> (package:compiler/src/js_emitter/program_builder/program_builder.dart:754:14)
#2      TypeTestProperties.forEachProperty.handleTypeTest (package:compiler/src/js_emitter/runtime_type_generator.dart:73:8)
#3      TypeTestProperties.forEachProperty (package:compiler/src/js_emitter/runtime_type_generator.dart:78:21)
#4      ProgramBuilder._buildClass (package:compiler/src/js_emitter/program_builder/program_builder.dart:752:17)
#5      List.forEach (dart:core-patch/growable_array.dart:290:8)
#6      ProgramBuilder.buildProgram.<anonymous closure> (package:compiler/src/js_emitter/program_builder/program_builder.dart:197:15)
#7      _LinkedHashMapMixin.forEach (dart:collection-patch/compact_hash.dart:377:8)
#8      ProgramBuilder.buildProgram (package:compiler/src/js_emitter/program_builder/program_builder.dart:196:10)
#9      EmitterImpl.emitProgram.<anonymous closure> (package:compiler/src/js_emitter/startup_emitter/emitter.dart:193:29)
#10     CompilerTask.measureSubtask (package:compiler/src/common/tasks.dart:179:35)
#11     EmitterImpl.emitProgram (package:compiler/src/js_emitter/startup_emitter/emitter.dart:192:29)
#12     CodeEmitterTask.assembleProgram.<anonymous closure> (package:compiler/src/js_emitter/code_emitter_task.dart:147:26)
#13     CompilerTask.measure (package:compiler/src/common/tasks.dart:64:51)
#14     CodeEmitterTask.assembleProgram (package:compiler/src/js_emitter/code_emitter_task.dart:117:12)
#15     JsBackendStrategy.assembleProgram (package:compiler/src/js_model/js_strategy.dart:359:35)
#16     Compiler.runCodegenEnqueuer (package:compiler/src/compiler.dart:390:39)
#17     Compiler.generateJavaScriptCode (package:compiler/src/compiler.dart:284:9)
#18     Compiler.compileFromKernel.<anonymous closure> (package:compiler/src/compiler.dart:432:9)
#19     CompilerTask.measureSubtask (package:compiler/src/common/tasks.dart:179:35)
#20     Compiler.compileFromKernel (package:compiler/src/compiler.dart:405:14)
#21     Compiler.runInternal (package:compiler/src/compiler.dart:257:13)
<asynchronous suspension>
#22     Compiler.run.<anonymous closure>.<anonymous closure> (package:compiler/src/compiler.dart:212:38)
#23     new Future.sync (dart:async/future.dart:223:31)
#24     Compiler.run.<anonymous closure> (package:compiler/src/compiler.dart:212:20)
#25     CompilerTask.measureSubtask (package:compiler/src/common/tasks.dart:179:35)
#26     Compiler.run (package:compiler/src/compiler.dart:209:41)
#27     CompilerImpl.run.<anonymous closure>.<anonymous closure> (package:compiler/src/apiimpl.dart:91:22)
#28     _RootZone.runUnary (dart:async/zone.dart:1450:54)
#29     _FutureListener.handleValue (dart:async/future_impl.dart:143:18)
#30     Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:696:45)
#31     Future._propagateToListeners (dart:async/future_impl.dart:725:32)
#32     Future._completeWithValue (dart:async/future_impl.dart:529:5)
#33     Future._asyncCompleteWithValue.<anonymous closure> (dart:async/future_impl.dart:567:7)
#34     _microtaskLoop (dart:async/schedule_microtask.dart:41:21)
#35     _startMicrotaskLoop (dart:async/schedule_microtask.dart:50:5)
#36     _runPendingImmediateCallback (dart:isolate-patch/isolate_patch.dart:118:13)
#37     _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:169:5)

The pattern that seems to be triggering the error is the one we use to convert between Dart-side enums to an enum-like API in the CanvasKit JavaScript library. Here's an example:

@JS()
class SkFilterQualityEnum {
  external SkFilterQuality get None;
  external SkFilterQuality get Low;
  external SkFilterQuality get Medium;
  external SkFilterQuality get High;
}

@JS()
class SkFilterQuality {
  external int get value;
}

final List<SkFilterQuality> _skFilterQualitys = <SkFilterQuality>[
  canvasKitJs.FilterQuality.None,
  canvasKitJs.FilterQuality.Low,
  canvasKitJs.FilterQuality.Medium,
  canvasKitJs.FilterQuality.High,
];

SkFilterQuality toSkFilterQuality(ui.FilterQuality filterQuality) {
  return _skFilterQualitys[filterQuality.index];
}

If I comment out all usages of toSkFilterQuality (and similar functions) dart2js is happy.

/cc @rakudrama @fishythefish

Metadata

Metadata

Assignees

No one assigned

    Labels

    P1A high priority bug; for example, a single project is unusable or has many test failuresarea-web-jsIssues related to JavaScript support for Dart Web, including DDC, dart2js, and JS interop.crashProcess exits with SIGSEGV, SIGABRT, etc. An unhandled exception is not a crash.customer-dart2jscustomer-flutterdart2js-crashweb-js-interopIssues that impact all js interop

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions