d17859ca11
This CL addresses a code pattern where a method expects its parameter
to have a certain type, but that method is torn off and passed as a
callback to another method expecting its parameter type to be more
general. For example:
void f(int i) { ... }
void g(void callback(Object o)) { ... }
void h() {
g(f); // Error: () -> int is not a subtype of () -> Object
}
This is a strong mode error because the type system cannot guarantee
that the value pased to f will be an int. The solution is to broaden
the type of the callback parameter so that it matches the type
expected for the callback. In most cases, we insert an implicit
downcast (by reassigning the parameter to a local variable with the
expected type), which in Dart 2.0 semantics will result in a runtime
check (similar to what happens in Dart 1.0 checked mode).
Since the downcasts are implicit, the Dart 1.0 semantics are
unchanged, so this should be a safe change.
Change-Id: I9583ea194343b89b39305c9796cfad299a47943f
Reviewed-on: https://dart-review.googlesource.com/55907
Commit-Queue: Paul Berry <paulberry@google.com>
Reviewed-by: Ryan Macnak <rmacnak@google.com>
38 lines
1.2 KiB
Dart
38 lines
1.2 KiB
Dart
// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
|
|
// for details. All rights reserved. Use of this source code is governed by a
|
|
// BSD-style license that can be found in the LICENSE file.
|
|
|
|
library shell;
|
|
|
|
import 'package:observatory/service_io.dart';
|
|
|
|
import 'dart:io';
|
|
|
|
// Simple demo for service_io library. Connects to localhost on the default
|
|
// port, picks the first isolate, reads requests from stdin, and prints
|
|
// results to stdout. Example session:
|
|
// <<< isolate isolates/1071334835
|
|
// >>> /classes/40
|
|
// <<< {"type":"Class","id":"classes\/40","name":"num","user_name":"num",...
|
|
// >>> /objects/0
|
|
// >>> {"type":"Array","class":{"type":"@Class","id":"classes\/62",...
|
|
|
|
void repl(VM vm, Isolate isolate, String lastResult) {
|
|
print(lastResult);
|
|
Map params = {
|
|
'objectId': stdin.readLineSync(),
|
|
};
|
|
isolate.invokeRpcNoUpgrade('getObject', params).then((Map result) {
|
|
repl(vm, isolate, result.toString());
|
|
});
|
|
}
|
|
|
|
void main() {
|
|
String addr = 'ws://localhost:8181/ws';
|
|
new WebSocketVM(new WebSocketVMTarget(addr)).load().then((serviceObject) {
|
|
VM vm = serviceObject;
|
|
Isolate isolate = vm.isolates.first;
|
|
repl(vm, isolate, 'isolate ${isolate.id}');
|
|
});
|
|
}
|