Version 2.14.0-48.0.dev

Merge commit 'ac2cd2d73cbd470445be789784f9a30c6927a873' into 'dev'
diff --git a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
index b1cb812..eed68f4 100644
--- a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
@@ -7277,6 +7277,15 @@
         r"""Try removing the other directives, or moving them to the library for which this is a part.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeNonPositiveArrayDimensions =
+    messageNonPositiveArrayDimensions;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageNonPositiveArrayDimensions = const MessageCode(
+    "NonPositiveArrayDimensions",
+    message: r"""Array dimensions must be positive numbers.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)>
     templateNonSimpleBoundViaReference =
     const Template<Message Function(String name)>(
diff --git a/pkg/compiler/lib/src/js_emitter/headers.dart b/pkg/compiler/lib/src/js_emitter/headers.dart
index 08fd664a..9953606 100644
--- a/pkg/compiler/lib/src/js_emitter/headers.dart
+++ b/pkg/compiler/lib/src/js_emitter/headers.dart
@@ -27,11 +27,12 @@
 //    directly. Instead, a closure that will invoke [main], and its arguments
 //    [args] is passed to [dartMainRunner].
 //
-// dartDeferredLibraryLoader(uri, successCallback, errorCallback):
+// dartDeferredLibraryLoader(uri, successCallback, errorCallback, loadId):
 //    if this function is defined, it will be called when a deferred library
 //    is loaded. It should load and eval the javascript of `uri`, and call
 //    successCallback. If it fails to do so, it should call errorCallback with
-//    an error.
+//    an error. The loadId argument is the deferred import that resulted in 
+//    this uri being loaded.
 //
 // dartCallInstrumentation(id, qualifiedName):
 //    if this function is defined, it will be called at each entry of a
diff --git a/pkg/front_end/lib/src/api_unstable/vm.dart b/pkg/front_end/lib/src/api_unstable/vm.dart
index bf01283..b2250cf 100644
--- a/pkg/front_end/lib/src/api_unstable/vm.dart
+++ b/pkg/front_end/lib/src/api_unstable/vm.dart
@@ -53,6 +53,7 @@
         messageFfiExceptionalReturnNull,
         messageFfiExpectedConstant,
         messageFfiPackedAnnotationAlignment,
+        messageNonPositiveArrayDimensions,
         noLength,
         templateFfiDartTypeMismatch,
         templateFfiEmptyStruct,
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index 23e753f..9c7263d 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -606,6 +606,7 @@
 NonNullableOptOutImplicit/example: Fail
 NonPartOfDirectiveInPart/part_wrapped_script1: Fail
 NonPartOfDirectiveInPart/script1: Fail
+NonPositiveArrayDimensions/analyzerCode: Fail
 NotAConstantExpression/example: Fail
 NotAType/example: Fail
 NotAnLvalue/example: Fail
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index e5d851a..82ad1a1 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -4646,6 +4646,11 @@
       <int>[...null];
     }
 
+NonPositiveArrayDimensions:
+  # Used by dart:ffi
+  template: "Array dimensions must be positive numbers."
+  external: test/ffi_test.dart
+
 InvalidTypeVariableInSupertype:
   template: "Can't use implicitly 'out' variable '#name' in an '#string2' position in supertype '#name2'."
   script: >
diff --git a/pkg/vm/lib/transformations/ffi_definitions.dart b/pkg/vm/lib/transformations/ffi_definitions.dart
index 6dc8a46..beed450 100644
--- a/pkg/vm/lib/transformations/ffi_definitions.dart
+++ b/pkg/vm/lib/transformations/ffi_definitions.dart
@@ -9,6 +9,7 @@
 import 'package:front_end/src/api_unstable/vm.dart'
     show
         messageFfiPackedAnnotationAlignment,
+        messageNonPositiveArrayDimensions,
         templateFfiEmptyStruct,
         templateFfiFieldAnnotation,
         templateFfiFieldNull,
@@ -323,7 +324,8 @@
               compoundClassDependencies[node].add(clazz);
               _checkPacking(node, packing, clazz, f);
             }
-            if (arrayDimensions(type) != sizeAnnotations.single.length) {
+            final dimensions = sizeAnnotations.single;
+            if (arrayDimensions(type) != dimensions.length) {
               diagnosticReporter.report(
                   templateFfiSizeAnnotationDimensions
                       .withArguments(f.name.text),
@@ -331,6 +333,15 @@
                   f.name.text.length,
                   f.fileUri);
             }
+            for (var dimension in dimensions) {
+              if (dimension < 0) {
+                diagnosticReporter.report(
+                    messageNonPositiveArrayDimensions, f.fileOffset,
+                    f.name.text.length,
+                    f.fileUri);
+                success = false;
+              }
+            }
           } else {
             diagnosticReporter.report(
                 templateFfiSizeAnnotation.withArguments(f.name.text),
@@ -478,8 +489,8 @@
         final sizeAnnotations = _getArraySizeAnnotations(m).toList();
         if (sizeAnnotations.length == 1) {
           final arrayDimensions = sizeAnnotations.single;
-          type = NativeTypeCfe(this, dartType,
-              compoundCache: compoundCache, arrayDimensions: arrayDimensions);
+          type = NativeTypeCfe(this, dartType, compoundCache: compoundCache,
+              arrayDimensions: arrayDimensions);
         }
       } else if (isPointerType(dartType) || isCompoundSubtype(dartType)) {
         type = NativeTypeCfe(this, dartType, compoundCache: compoundCache);
@@ -749,7 +760,7 @@
 abstract class NativeTypeCfe {
   factory NativeTypeCfe(FfiTransformer transformer, DartType dartType,
       {List<int> arrayDimensions,
-      Map<Class, CompoundNativeTypeCfe> compoundCache = const {}}) {
+        Map<Class, CompoundNativeTypeCfe> compoundCache = const {}}) {
     if (transformer.isPrimitiveType(dartType)) {
       final clazz = (dartType as InterfaceType).classNode;
       final nativeType = transformer.getType(clazz);
@@ -772,7 +783,7 @@
       }
       final elementType = transformer.arraySingleElementType(dartType);
       final elementCfeType =
-          NativeTypeCfe(transformer, elementType, compoundCache: compoundCache);
+      NativeTypeCfe(transformer, elementType, compoundCache: compoundCache);
       return ArrayNativeTypeCfe.multi(elementCfeType, arrayDimensions);
     }
     throw "Invalid type $dartType";
@@ -1135,8 +1146,8 @@
 
   ArrayNativeTypeCfe(this.elementType, this.length);
 
-  factory ArrayNativeTypeCfe.multi(
-      NativeTypeCfe elementType, List<int> dimensions) {
+  factory ArrayNativeTypeCfe.multi(NativeTypeCfe elementType,
+      List<int> dimensions) {
     if (dimensions.length == 1) {
       return ArrayNativeTypeCfe(elementType, dimensions.single);
     }
diff --git a/runtime/observatory/BUILD.gn b/runtime/observatory/BUILD.gn
index 022498e..80b6d6e 100644
--- a/runtime/observatory/BUILD.gn
+++ b/runtime/observatory/BUILD.gn
@@ -21,19 +21,7 @@
     outputs += [ "$target_gen_dir/observatory/web/main.dart.js.map" ]
   }
 
-  version_string = exec_script("../../tools/make_version.py",
-                               [
-                                 "--quiet",
-                                 "--no_git_hash",
-                               ],  # Arguments to the script
-                               "trim string",  # Input conversions
-                               [
-                                 "../../tools/VERSION",
-                                 "../tools/utils.py",
-                               ])  # Dependencies
-
   args = [
-    "-DOBS_VER=${version_string}",
     "-o",
     rebase_path(output),
     "--packages=" + rebase_path("../../.packages"),
diff --git a/runtime/observatory/tests/service/bad_reload_test.dart b/runtime/observatory/tests/service/bad_reload_test.dart
index eb40b71..3825f85 100644
--- a/runtime/observatory/tests/service/bad_reload_test.dart
+++ b/runtime/observatory/tests/service/bad_reload_test.dart
@@ -2,6 +2,9 @@
 // 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.
 
+// OtherResources=bad_reload/v1/main.dart
+// OtherResources=bad_reload/v2/main.dart
+
 import 'test_helper.dart';
 import 'dart:async';
 import 'dart:developer';
@@ -37,6 +40,14 @@
   return result.valueAsString as String;
 }
 
+Future<void> invokeTestWithError(Isolate isolate) async {
+  await isolate.reload();
+  Library lib = isolate.rootLibrary;
+  await lib.load();
+  final result = await lib.evaluate('test()');
+  expect(result.isError, isTrue);
+}
+
 var tests = <IsolateTest>[
   // Stopped at 'debugger' statement.
   hasStoppedAtBreakpoint,
@@ -65,14 +76,13 @@
     );
     // Observe that it failed.
     expect(response['success'], isFalse);
-    List notices = response['details']['notices'];
+    List notices = response['notices'];
     expect(notices.length, equals(1));
     Map<String, dynamic> reasonForCancelling = notices[0];
     expect(reasonForCancelling['type'], equals('ReasonForCancelling'));
     expect(reasonForCancelling['message'], contains('library_isnt_here_man'));
 
-    String v2 = await invokeTest(spawnedIsolate);
-    expect(v2, 'apple');
+    await invokeTestWithError(spawnedIsolate);
   }
 ];
 
diff --git a/runtime/observatory/tests/service/service_kernel.status b/runtime/observatory/tests/service/service_kernel.status
index a06ae74..62bdfcc 100644
--- a/runtime/observatory/tests/service/service_kernel.status
+++ b/runtime/observatory/tests/service/service_kernel.status
@@ -7,7 +7,6 @@
 [ $compiler == app_jitk ]
 add_breakpoint_rpc_kernel_test: SkipByDesign # No incremental compiler available.
 async_generator_breakpoint_test: SkipByDesign # No incremental compiler available.
-bad_reload_test: RuntimeError
 break_on_activation_test: SkipByDesign # No incremental compiler available.
 complex_reload_test: RuntimeError
 debugger_inspect_test: SkipByDesign # No incremental compiler available.
@@ -24,7 +23,6 @@
 sigquit_starts_service_test: SkipByDesign # Spawns a secondary process using Platform.executable.
 
 [ $compiler == dartk ]
-bad_reload_test: RuntimeError # Issue 34025
 coverage_optimized_function_test: Pass, Slow
 evaluate_activation_test/instance: RuntimeError # http://dartbug.com/20047
 evaluate_activation_test/scope: RuntimeError # http://dartbug.com/20047
diff --git a/runtime/observatory_2/BUILD.gn b/runtime/observatory_2/BUILD.gn
index 1762e1a..412e378 100644
--- a/runtime/observatory_2/BUILD.gn
+++ b/runtime/observatory_2/BUILD.gn
@@ -21,19 +21,7 @@
     outputs += [ "$target_gen_dir/observatory/web/main.dart.js.map" ]
   }
 
-  version_string = exec_script("../../tools/make_version.py",
-                               [
-                                 "--quiet",
-                                 "--no_git_hash",
-                               ],  # Arguments to the script
-                               "trim string",  # Input conversions
-                               [
-                                 "../../tools/VERSION",
-                                 "../tools/utils.py",
-                               ])  # Dependencies
-
   args = [
-    "-DOBS_VER=${version_string}",
     "-o",
     rebase_path(output),
     "--packages=" + rebase_path("../../.packages"),
diff --git a/runtime/observatory_2/lib/src/app/analytics.dart b/runtime/observatory_2/lib/src/app/analytics.dart
deleted file mode 100644
index a34c2da..0000000
--- a/runtime/observatory_2/lib/src/app/analytics.dart
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright (c) 2015, 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.
-
-part of app;
-
-// TODO(eernst): Use 'bool.fromEnvironment' below when possible;
-// for now we use a dual `defaultValue` rewrite.
-const _obsVer = (String.fromEnvironment('OBS_VER', defaultValue: '1') ==
-        String.fromEnvironment('OBS_VER', defaultValue: '2'))
-    ? String.fromEnvironment('OBS_VER')
-    : null;
-
-class Analytics {
-  static final _UA = 'UA-26406144-17';
-  static final _name = 'Observatory';
-  static final _version = _obsVer;
-  static final _googleAnalytics = new AnalyticsHtml(_UA, _name, _version);
-
-  static initialize() {
-    // We only send screen views. This is allowed without user permission.
-    // Note, before flipping this to be true we need a UI to allow users to
-    // control this.
-    _googleAnalytics.analyticsOpt = AnalyticsOpt.optOut;
-  }
-
-  /// Called whenever an Observatory page is viewed.
-  static Future reportPageView(Uri uri) {
-    // Only report analytics when running in JavaScript.
-    if (Utils.runningInJavaScript()) {
-      // The screen name is the uri's path. e.g. inspect, profile.
-      final screenName = uri.path;
-      return _googleAnalytics.sendScreenView(screenName);
-    } else {
-      return new Future.value(null);
-    }
-  }
-}
diff --git a/runtime/observatory_2/observatory_sources.gni b/runtime/observatory_2/observatory_sources.gni
index 9ad1b96..7bf2bbb 100644
--- a/runtime/observatory_2/observatory_sources.gni
+++ b/runtime/observatory_2/observatory_sources.gni
@@ -66,6 +66,7 @@
   "lib/src/elements/helpers/nav_menu.dart",
   "lib/src/elements/helpers/rendering_queue.dart",
   "lib/src/elements/helpers/rendering_scheduler.dart",
+  "lib/src/elements/helpers/tag.dart",
   "lib/src/elements/helpers/uris.dart",
   "lib/src/elements/icdata_ref.dart",
   "lib/src/elements/icdata_view.dart",
diff --git a/runtime/observatory_2/tests/service_2/bad_reload_test.dart b/runtime/observatory_2/tests/service_2/bad_reload_test.dart
index 1aad2dc..0dab172 100644
--- a/runtime/observatory_2/tests/service_2/bad_reload_test.dart
+++ b/runtime/observatory_2/tests/service_2/bad_reload_test.dart
@@ -2,6 +2,9 @@
 // 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.
 
+// OtherResources=bad_reload/v1/main.dart
+// OtherResources=bad_reload/v2/main.dart
+
 import 'test_helper.dart';
 import 'dart:async';
 import 'dart:developer';
@@ -37,6 +40,14 @@
   return result.valueAsString;
 }
 
+Future<void> invokeTestWithError(Isolate isolate) async {
+  await isolate.reload();
+  Library lib = isolate.rootLibrary;
+  await lib.load();
+  final result = await lib.evaluate('test()');
+  expect(result.isError, isTrue);
+}
+
 var tests = <IsolateTest>[
   // Stopped at 'debugger' statement.
   hasStoppedAtBreakpoint,
@@ -65,14 +76,13 @@
     );
     // Observe that it failed.
     expect(response['success'], isFalse);
-    List notices = response['details']['notices'];
+    List notices = response['notices'];
     expect(notices.length, equals(1));
     Map<String, dynamic> reasonForCancelling = notices[0];
     expect(reasonForCancelling['type'], equals('ReasonForCancelling'));
     expect(reasonForCancelling['message'], contains('library_isnt_here_man'));
 
-    String v2 = await invokeTest(spawnedIsolate);
-    expect(v2, 'apple');
+    await invokeTestWithError(spawnedIsolate);
   }
 ];
 
diff --git a/runtime/observatory_2/tests/service_2/service_2_kernel.status b/runtime/observatory_2/tests/service_2/service_2_kernel.status
index a06ae74..62bdfcc 100644
--- a/runtime/observatory_2/tests/service_2/service_2_kernel.status
+++ b/runtime/observatory_2/tests/service_2/service_2_kernel.status
@@ -7,7 +7,6 @@
 [ $compiler == app_jitk ]
 add_breakpoint_rpc_kernel_test: SkipByDesign # No incremental compiler available.
 async_generator_breakpoint_test: SkipByDesign # No incremental compiler available.
-bad_reload_test: RuntimeError
 break_on_activation_test: SkipByDesign # No incremental compiler available.
 complex_reload_test: RuntimeError
 debugger_inspect_test: SkipByDesign # No incremental compiler available.
@@ -24,7 +23,6 @@
 sigquit_starts_service_test: SkipByDesign # Spawns a secondary process using Platform.executable.
 
 [ $compiler == dartk ]
-bad_reload_test: RuntimeError # Issue 34025
 coverage_optimized_function_test: Pass, Slow
 evaluate_activation_test/instance: RuntimeError # http://dartbug.com/20047
 evaluate_activation_test/scope: RuntimeError # http://dartbug.com/20047
diff --git a/runtime/vm/dwarf.cc b/runtime/vm/dwarf.cc
index f940ef7..59d7893 100644
--- a/runtime/vm/dwarf.cc
+++ b/runtime/vm/dwarf.cc
@@ -723,7 +723,7 @@
   }
 }
 
-static constexpr char kResolvedFileRoot[] = "file://";
+static constexpr char kResolvedFileRoot[] = "file:///";
 static constexpr intptr_t kResolvedFileRootLen = sizeof(kResolvedFileRoot) - 1;
 static constexpr char kResolvedSdkRoot[] = "org-dartlang-sdk:///sdk/";
 static constexpr intptr_t kResolvedSdkRootLen = sizeof(kResolvedSdkRoot) - 1;
@@ -732,7 +732,11 @@
   const intptr_t len = strlen(str);
   if (len > kResolvedFileRootLen &&
       strncmp(str, kResolvedFileRoot, kResolvedFileRootLen) == 0) {
-    return str + kResolvedFileRootLen;
+#if defined(HOST_OS_WINDOWS)
+    return str + kResolvedFileRootLen;  // Strip off the entire prefix.
+#else
+    return str + kResolvedFileRootLen - 1;  // Leave a '/' on the front.
+#endif
   }
   if (len > kResolvedSdkRootLen &&
       strncmp(str, kResolvedSdkRoot, kResolvedSdkRootLen) == 0) {
diff --git a/sdk/lib/_internal/js_runtime/lib/js_helper.dart b/sdk/lib/_internal/js_runtime/lib/js_helper.dart
index cfaaeee..3f2302d 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_helper.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_helper.dart
@@ -2736,7 +2736,7 @@
       waitingForLoad[i] = false;
       return new Future.value();
     }
-    return _loadHunk(uris[i]).then((Null _) {
+    return _loadHunk(uris[i], loadId).then((Null _) {
       waitingForLoad[i] = false;
       initializeSomeLoadedHunks();
     });
@@ -2833,7 +2833,7 @@
   throw new UnsupportedError('Cannot extract URI from "$stack"');
 }
 
-Future<Null> _loadHunk(String hunkName) {
+Future<Null> _loadHunk(String hunkName, String loadId) {
   var future = _loadingLibraries[hunkName];
   _eventLog.add(' - _loadHunk: $hunkName');
   if (future != null) {
@@ -2873,8 +2873,10 @@
 
   if (JS('bool', 'typeof # === "function"', deferredLibraryLoader)) {
     try {
-      JS('void', '#(#, #, #)', deferredLibraryLoader, uri, jsSuccess,
-          jsFailure);
+      // Share the loadId that hunk belongs to, this will allow for any
+      // additional loadId based bundling optimizations.
+      JS('void', '#(#, #, #, #)', deferredLibraryLoader, uri, jsSuccess,
+          jsFailure, loadId);
     } catch (error, stackTrace) {
       failure(error, "invoking dartDeferredLibraryLoader hook", stackTrace);
     }
diff --git a/tests/ffi/vmspecific_static_checks_test.dart b/tests/ffi/vmspecific_static_checks_test.dart
index 72636d8..4998b31 100644
--- a/tests/ffi/vmspecific_static_checks_test.dart
+++ b/tests/ffi/vmspecific_static_checks_test.dart
@@ -760,3 +760,24 @@
   external Array<TestStruct1604> //# 1606: compile-time error
       nestedLooselyPacked; //# 1606: compile-time error
 }
+
+class TestStruct1800 extends Struct {
+  external Pointer<Uint8> notEmpty;
+
+  @Array(-1) //# 1800: compile-time error
+  external Array<Uint8> inlineArray; //# 1800: compile-time error
+}
+
+class TestStruct1801 extends Struct {
+  external Pointer<Uint8> notEmpty;
+
+  @Array(1, -1) //# 1801: compile-time error
+  external Array<Uint8> inlineArray; //# 1801: compile-time error
+}
+
+class TestStruct1802 extends Struct {
+  external Pointer<Uint8> notEmpty;
+
+  @Array.multi([2, 2, 2, 2, 2, 2, -1]) //# 1802: compile-time error
+  external Array<Uint8> inlineArray; //# 1802: compile-time error
+}
\ No newline at end of file
diff --git a/tests/ffi_2/vmspecific_static_checks_test.dart b/tests/ffi_2/vmspecific_static_checks_test.dart
index 48e85b8..a81e206 100644
--- a/tests/ffi_2/vmspecific_static_checks_test.dart
+++ b/tests/ffi_2/vmspecific_static_checks_test.dart
@@ -759,3 +759,24 @@
   @Array(2) //# 1606: compile-time error
   Array<TestStruct1604> nestedLooselyPacked; //# 1606: compile-time error
 }
+
+class TestStruct1800 extends Struct {
+  Pointer<Uint8> notEmpty;
+
+  @Array(-1) //# 1800: compile-time error
+  Array<Uint8> inlineArray; //# 1800: compile-time error
+}
+
+class TestStruct1801 extends Struct {
+  Pointer<Uint8> notEmpty;
+
+  @Array(1, -1) //# 1801: compile-time error
+  Array<Uint8> inlineArray; //# 1801: compile-time error
+}
+
+class TestStruct1802 extends Struct {
+  Pointer<Uint8> notEmpty;
+
+  @Array.multi([2, 2, 2, 2, 2, 2, -1]) //# 1802: compile-time error
+  Array<Uint8> inlineArray; //# 1802: compile-time error
+}
\ No newline at end of file
diff --git a/tools/VERSION b/tools/VERSION
index 1c0c045..c93e31d 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 14
 PATCH 0
-PRERELEASE 47
+PRERELEASE 48
 PRERELEASE_PATCH 0
\ No newline at end of file