Version 1.1.3 (stable)
svn merge -c 32031 https://dart.googlecode.com/svn/branches/bleeding_edge 1.1
svn merge -c 32046 https://dart.googlecode.com/svn/branches/bleeding_edge 1.1
svn merge -c 32070 https://dart.googlecode.com/svn/branches/bleeding_edge 1.1
svn merge -c 32102 https://dart.googlecode.com/svn/branches/bleeding_edge 1.1
R=whesse@google.com
Review URL: https://codereview.chromium.org//143153006
git-svn-id: http://dart.googlecode.com/svn/branches/1.1@32314 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/runtime/bin/builtin.dart b/runtime/bin/builtin.dart
index 51e6dce..99e80ca 100644
--- a/runtime/bin/builtin.dart
+++ b/runtime/bin/builtin.dart
@@ -216,14 +216,18 @@
// Relative URIs with scheme dart-ext should be resolved as if with no
// scheme.
resolved = baseUri.resolve(uri.path);
- var path = resolved.path;
if (resolved.scheme == 'package') {
// If we are resolving relative to a package URI we go directly to the
// file path and keep the dart-ext scheme. Otherwise, we will lose the
// package URI path part.
- path = _filePathFromPackageUri(resolved);
+ var path = _filePathFromPackageUri(resolved);
+ if (path.startsWith('http:')) {
+ throw "Native extensions not supported in "
+ "packages loaded over http: %path";
+ }
+ resolved = new Uri.file(path);
}
- resolved = new Uri(scheme: 'dart-ext', path: path);
+ resolved = new Uri(scheme: 'dart-ext', path: resolved.path);
} else {
resolved = baseUri.resolve(userString);
}
@@ -244,7 +248,9 @@
return uri.toFilePath();
break;
case 'dart-ext':
- return new Uri(scheme: 'file',
+ // Relative file URIs don't start with file:///.
+ var scheme = (uri.path.startsWith('/') ? 'file' : '');
+ return new Uri(scheme: scheme,
host: uri.host,
path: uri.path).toFilePath();
break;
diff --git a/runtime/vm/gc_marker.cc b/runtime/vm/gc_marker.cc
index 4a9eabd..074619d 100644
--- a/runtime/vm/gc_marker.cc
+++ b/runtime/vm/gc_marker.cc
@@ -6,6 +6,7 @@
#include <map>
#include <utility>
+#include <vector>
#include "vm/allocation.h"
#include "vm/dart_api_state.h"
@@ -192,10 +193,14 @@
std::pair<DelaySet::iterator, DelaySet::iterator> ret;
// Visit all elements with a key equal to raw_obj.
ret = delay_set_.equal_range(raw_obj);
- for (DelaySet::iterator it = ret.first; it != ret.second; ++it) {
+ // Create a copy of the range in a temporary vector to iterate over it
+ // while delay_set_ may be modified.
+ std::vector<DelaySetEntry> temp_copy(ret.first, ret.second);
+ delay_set_.erase(ret.first, ret.second);
+ for (std::vector<DelaySetEntry>::iterator it = temp_copy.begin();
+ it != temp_copy.end(); ++it) {
it->second->VisitPointers(this);
}
- delay_set_.erase(ret.first, ret.second);
raw_obj->ClearWatchedBit();
}
marking_stack_->Push(raw_obj);
@@ -261,6 +266,7 @@
MarkingStack* marking_stack_;
RawObject* visiting_old_object_;
typedef std::multimap<RawObject*, RawWeakProperty*> DelaySet;
+ typedef std::pair<RawObject*, RawWeakProperty*> DelaySetEntry;
DelaySet delay_set_;
const bool visit_function_code_;
GrowableArray<RawFunction*> skipped_code_functions_;
diff --git a/sdk/lib/core/uri.dart b/sdk/lib/core/uri.dart
index d2e2a7a..41130ad 100644
--- a/sdk/lib/core/uri.dart
+++ b/sdk/lib/core/uri.dart
@@ -390,9 +390,9 @@
segments.skip(firstSegment).forEach((segment) {
if (segment.contains(new RegExp(r'["*/:<>?\\|]'))) {
if (argumentError) {
- throw new ArgumentError("Illegal character in path}");
+ throw new ArgumentError("Illegal character in path");
} else {
- throw new UnsupportedError("Illegal character in path}");
+ throw new UnsupportedError("Illegal character in path");
}
}
});
diff --git a/tools/VERSION b/tools/VERSION
index d0a7398..0e21058 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -26,6 +26,6 @@
CHANNEL stable
MAJOR 1
MINOR 1
-PATCH 2
+PATCH 3
PRERELEASE 0
PRERELEASE_PATCH 0