| // 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 inbound_references_test; |
| |
| import 'package:observatory_2/service_io.dart'; |
| import 'package:test/test.dart'; |
| import 'test_helper.dart'; |
| |
| // Make sure these variables are not removed by the tree shaker. |
| @pragma("vm:entry-point") |
| var cleanBlock; |
| @pragma("vm:entry-point") |
| var copyingBlock; |
| @pragma("vm:entry-point") |
| var fullBlock; |
| @pragma("vm:entry-point") |
| var fullBlockWithChain; |
| |
| Function genCleanBlock() { |
| block(x) => x; |
| return block; |
| } |
| |
| Function genCopyingBlock() { |
| final x = 'I could be copied into the block'; |
| block() => x; |
| return block; |
| } |
| |
| Function genFullBlock() { |
| var x = 42; // I must captured in a context. |
| block() => x; |
| x++; |
| return block; |
| } |
| |
| Function genFullBlockWithChain() { |
| var x = 420; // I must captured in a context. |
| outerBlock() { |
| var y = 4200; |
| innerBlock() => x + y; |
| y++; |
| return innerBlock; |
| } |
| |
| x++; |
| return outerBlock(); |
| } |
| |
| void script() { |
| cleanBlock = genCleanBlock(); |
| copyingBlock = genCopyingBlock(); |
| fullBlock = genFullBlock(); |
| fullBlockWithChain = genFullBlockWithChain(); |
| } |
| |
| var tests = <IsolateTest>[ |
| (Isolate isolate) async { |
| Library lib = await isolate.rootLibrary.load(); |
| Field field = lib.variables.singleWhere((v) => v.name == 'cleanBlock'); |
| await field.load(); |
| Instance block = await field.staticValue.load(); |
| expect(block.isClosure, isTrue); |
| expect(block.closureContext, isNull); |
| }, |
| (Isolate isolate) async { |
| Library lib = await isolate.rootLibrary.load(); |
| Field field = lib.variables.singleWhere((v) => v.name == 'copyingBlock'); |
| await field.load(); |
| Instance block = await field.staticValue.load(); |
| expect(block.isClosure, isTrue); |
| expect(block.closureContext.isContext, isTrue); |
| expect(block.closureContext.length, equals(1)); |
| Context ctxt = await block.closureContext.load(); |
| expect(ctxt.variables.single.value.asValue.isString, isTrue); |
| expect(ctxt.variables.single.value.asValue.valueAsString, |
| equals('I could be copied into the block')); |
| expect(ctxt.parentContext, isNull); |
| }, |
| (Isolate isolate) async { |
| Library lib = await isolate.rootLibrary.load(); |
| Field field = lib.variables.singleWhere((v) => v.name == 'fullBlock'); |
| await field.load(); |
| Instance block = await field.staticValue.load(); |
| expect(block.isClosure, isTrue); |
| expect(block.closureContext.isContext, isTrue); |
| expect(block.closureContext.length, equals(1)); |
| Context ctxt = await block.closureContext.load(); |
| expect(ctxt.variables.single.value.asValue.isInt, isTrue); |
| expect(ctxt.variables.single.value.asValue.valueAsString, equals('43')); |
| expect(ctxt.parentContext, isNull); |
| }, |
| (Isolate isolate) async { |
| Library lib = await isolate.rootLibrary.load(); |
| Field field = |
| lib.variables.singleWhere((v) => v.name == 'fullBlockWithChain'); |
| await field.load(); |
| Instance block = await field.staticValue.load(); |
| expect(block.isClosure, isTrue); |
| expect(block.closureContext.isContext, isTrue); |
| expect(block.closureContext.length, equals(1)); |
| Context ctxt = await block.closureContext.load(); |
| expect(ctxt.variables.single.value.asValue.isInt, isTrue); |
| expect(ctxt.variables.single.value.asValue.valueAsString, equals('4201')); |
| expect(ctxt.parentContext.isContext, isTrue); |
| expect(ctxt.parentContext.length, equals(1)); |
| Context outerCtxt = await ctxt.parentContext.load(); |
| expect(outerCtxt.variables.single.value.asValue.isInt, isTrue); |
| expect( |
| outerCtxt.variables.single.value.asValue.valueAsString, equals('421')); |
| expect(outerCtxt.parentContext, isNull); |
| }, |
| ]; |
| |
| main(args) => runIsolateTests(args, tests, testeeBefore: script); |