[dart] Runtime utilities do not depend on libfsl anymore.

Bug: DX-1073
Change-Id: I7237562c0f4532c457d7d166fadf70524b39e059
diff --git a/runtime/dart/utils/BUILD.gn b/runtime/dart/utils/BUILD.gn
index d710739..373d9c0 100644
--- a/runtime/dart/utils/BUILD.gn
+++ b/runtime/dart/utils/BUILD.gn
@@ -22,7 +22,6 @@
   ]
 
   deps = [
-    "//garnet/public/lib/fsl",
     "//garnet/public/lib/fxl",
     "//third_party/tonic",
     "//zircon/public/fidl/fuchsia-crash",
diff --git a/runtime/dart/utils/handle_exception.cc b/runtime/dart/utils/handle_exception.cc
index 82b3555..1bc825f 100644
--- a/runtime/dart/utils/handle_exception.cc
+++ b/runtime/dart/utils/handle_exception.cc
@@ -8,13 +8,35 @@
 
 #include <fuchsia/crash/cpp/fidl.h>
 #include <fuchsia/mem/cpp/fidl.h>
-#include <lib/fsl/vmo/strings.h>
 #include <lib/fxl/logging.h>
+#include <lib/zx/vmo.h>
 #include <sys/types.h>
 #include <third_party/tonic/converter/dart_converter.h>
 #include <zircon/errors.h>
 #include <zircon/status.h>
 
+namespace {
+static bool FillBuffer(const std::string& data, fuchsia::mem::Buffer* buffer) {
+  uint64_t num_bytes = data.size();
+  zx::vmo vmo;
+
+  if (zx::vmo::create(num_bytes, 0u, &vmo) < 0) {
+    return false;
+  }
+
+  if (num_bytes > 0) {
+    if (vmo.write(data.data(), 0, num_bytes) < 0) {
+      return false;
+    }
+  }
+
+  buffer->vmo = std::move(vmo);
+  buffer->size = num_bytes;
+
+  return true;
+}
+}  // namespace
+
 namespace fuchsia {
 namespace dart {
 
@@ -38,7 +60,7 @@
                             const std::string& error,
                             const std::string& stack_trace) {
   fuchsia::mem::Buffer stack_trace_vmo;
-  if (!fsl::VmoFromString(stack_trace, &stack_trace_vmo)) {
+  if (!FillBuffer(stack_trace, &stack_trace_vmo)) {
     FXL_LOG(ERROR) << "failed to convert Dart stack trace to VMO";
     return ZX_ERR_INTERNAL;
   }