mirror of
https://github.com/dart-lang/sdk
synced 2024-10-03 06:21:30 +00:00
Run transformations on expression compilation.
Change-Id: Ie0107d908f9e83050e83fbcf1384818100f334b9 Reviewed-on: https://dart-review.googlesource.com/44427 Commit-Queue: Samir Jindel <sjindel@google.com> Reviewed-by: Kevin Millikin <kmillikin@google.com>
This commit is contained in:
parent
c9cd32fb58
commit
2296f9d637
|
@ -452,6 +452,8 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
|
|||
userCode.uriToSource.remove(debugExprUri);
|
||||
userCode.loader.sourceBytes.remove(debugExprUri);
|
||||
|
||||
userCode.runProcedureTransformations(procedure);
|
||||
|
||||
return procedure;
|
||||
});
|
||||
}
|
||||
|
|
|
@ -14,6 +14,7 @@ import 'package:kernel/ast.dart'
|
|||
Class,
|
||||
Constructor,
|
||||
DartType,
|
||||
Procedure,
|
||||
DynamicType,
|
||||
EmptyStatement,
|
||||
Expression,
|
||||
|
@ -28,7 +29,6 @@ import 'package:kernel/ast.dart'
|
|||
Name,
|
||||
NamedExpression,
|
||||
NullLiteral,
|
||||
Procedure,
|
||||
ProcedureKind,
|
||||
Component,
|
||||
Source,
|
||||
|
@ -713,6 +713,12 @@ class KernelTarget extends TargetImplementation {
|
|||
logger: (String msg) => ticker.logMs(msg));
|
||||
}
|
||||
|
||||
void runProcedureTransformations(Procedure procedure) {
|
||||
backendTarget.performTransformationsOnProcedure(
|
||||
loader.coreTypes, loader.hierarchy, procedure,
|
||||
logger: (String msg) => ticker.logMs(msg));
|
||||
}
|
||||
|
||||
void verify() {
|
||||
errors.addAll(verifyComponent(component));
|
||||
ticker.logMs("Verified component");
|
||||
|
|
|
@ -153,6 +153,15 @@ abstract class Target {
|
|||
void performGlobalTransformations(CoreTypes coreTypes, Component component,
|
||||
{void logger(String msg)});
|
||||
|
||||
/// Perform target-specific modular transformations on the given program.
|
||||
///
|
||||
/// This is used when an individual expression is compiled, e.g. for debugging
|
||||
/// purposes. It is illegal to modify any of the enclosing nodes of the
|
||||
/// procedure.
|
||||
void performTransformationsOnProcedure(
|
||||
CoreTypes coreTypes, ClassHierarchy hierarchy, Procedure procedure,
|
||||
{void logger(String msg)}) {}
|
||||
|
||||
/// Whether a platform library may define a restricted type, such as `bool`,
|
||||
/// `int`, `double`, `num`, and `String`.
|
||||
///
|
||||
|
|
|
@ -12,7 +12,7 @@ import '../core_types.dart';
|
|||
import '../transformations/mixin_full_resolution.dart' as transformMixins
|
||||
show transformLibraries;
|
||||
import '../transformations/continuation.dart' as transformAsync
|
||||
show transformLibraries;
|
||||
show transformLibraries, transformProcedure;
|
||||
|
||||
import 'targets.dart';
|
||||
|
||||
|
@ -74,6 +74,14 @@ class VmTarget extends Target {
|
|||
void performGlobalTransformations(CoreTypes coreTypes, Component component,
|
||||
{void logger(String msg)}) {}
|
||||
|
||||
@override
|
||||
void performTransformationsOnProcedure(
|
||||
CoreTypes coreTypes, ClassHierarchy hierarchy, Procedure procedure,
|
||||
{void logger(String msg)}) {
|
||||
transformAsync.transformProcedure(coreTypes, procedure, flags.syncAsync);
|
||||
logger?.call("Transformed async functions");
|
||||
}
|
||||
|
||||
@override
|
||||
Expression instantiateInvocation(CoreTypes coreTypes, Expression receiver,
|
||||
String name, Arguments arguments, int offset, bool isSuper) {
|
||||
|
|
|
@ -0,0 +1,29 @@
|
|||
// Copyright (c) 2018, 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.
|
||||
// VMOptions=--error_on_bad_type --error_on_bad_override
|
||||
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:observatory/service_io.dart';
|
||||
import 'package:unittest/unittest.dart';
|
||||
|
||||
import 'test_helper.dart';
|
||||
|
||||
var tests = <IsolateTest>[
|
||||
(Isolate isolate) async {
|
||||
// Silence analyzer on 'dart:async' import.
|
||||
expect(new Future.value(0) != null, isTrue);
|
||||
String test = "(){ "
|
||||
" var k = () { return Future.value(3); }; "
|
||||
" var w = () async { return await k(); }; "
|
||||
" return w(); "
|
||||
"}()";
|
||||
Library lib = await isolate.rootLibrary.load();
|
||||
|
||||
var result = await lib.evaluate(test);
|
||||
expect("$result", equals("Instance(a _Future)"));
|
||||
},
|
||||
];
|
||||
|
||||
main(args) => runIsolateTests(args, tests);
|
Loading…
Reference in a new issue