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:
Samir Jindel 2018-05-08 13:35:52 +00:00 committed by commit-bot@chromium.org
parent c9cd32fb58
commit 2296f9d637
5 changed files with 56 additions and 2 deletions

View file

@ -452,6 +452,8 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
userCode.uriToSource.remove(debugExprUri);
userCode.loader.sourceBytes.remove(debugExprUri);
userCode.runProcedureTransformations(procedure);
return procedure;
});
}

View file

@ -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");

View file

@ -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`.
///

View file

@ -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) {

View file

@ -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);