Index: runtime/bin/namespace.h |
diff --git a/runtime/bin/namespace.h b/runtime/bin/namespace.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..7b36245a6e36ae88ddb37f0988b319f835f8246e |
--- /dev/null |
+++ b/runtime/bin/namespace.h |
@@ -0,0 +1,98 @@ |
+// Copyright (c) 2017, 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. |
+ |
+#ifndef RUNTIME_BIN_NAMESPACE_H_ |
+#define RUNTIME_BIN_NAMESPACE_H_ |
+ |
+#include "bin/builtin.h" |
+#include "bin/dartutils.h" |
+#include "bin/log.h" |
+#include "bin/reference_counting.h" |
+ |
+namespace dart { |
+namespace bin { |
+ |
+class Namespace : public ReferenceCounted<Namespace> { |
+ public: |
+ // Assumes napespc is a value that can be directly used as namespc_. |
+ static Namespace* Create(intptr_t namespc) { |
+ return new Namespace(namespc); |
+ } |
+ |
+ // Uses path to compute a value that can be used as namespc_. |
+ static Namespace* Create(const char* path); |
+ |
+ // Gives a safe defautl value for namespc_ for the standalone Dart VM. |
+ static intptr_t Default(); |
+ |
+ // Tells whether the given namespace is the default namespace. |
+ static bool IsDefault(Namespace* namespc); |
+ |
+ // Returns the native namespace wrapper if the argument at the supplied index |
+ // is a _NamespaceImpl object. If it is not, calls Dart_PropagateError(). |
+ static Namespace* GetNamespace(Dart_NativeArguments args, intptr_t index); |
+ |
+ // Get and set the current working directory through the namespace if there |
+ // is one. |
+ static const char* GetCurrent(Namespace* namespc); |
+ static bool SetCurrent(Namespace* namespc, const char* path); |
+ |
+ intptr_t namespc() const { return namespc_; } |
+ |
+ private: |
+ // When namespc_ has this value, it indicates that there is currently |
+ // no namespace for resolving absolute paths. |
+ static const intptr_t kNone = 0; |
+ |
+ explicit Namespace(intptr_t namespc) |
+ : ReferenceCounted(), namespc_(namespc) {} |
+ |
+ ~Namespace(); |
+ |
+ // When the native argument at |index| is a _NamespaceImpl object, |
+ // write the valueof its native field into |namespc|. |
+ static Dart_Handle GetNativeNamespaceArgument(Dart_NativeArguments args, |
+ intptr_t index, |
+ Namespace** namespc); |
+ |
+ // Given a namespace and a path, computes the information needed to access the |
+ // path relative to the namespace. This can include massaging the path and |
+ // returning a platform specific value in dirfd that together are used to |
+ // access the path. Returns true if the caller should take ownership of |
+ // dirfd, and false if the namespace retains ownership of dirfd. |
+ static bool ResolvePath(Namespace* namespc, |
+ const char* path, |
+ intptr_t* dirfd, |
+ const char** resolved_path); |
+ |
+ intptr_t namespc_; |
+ // TODO(zra): When Isolate-specific cwds are added, we'll need some more |
+ // fields here to track them. |
+ |
+ friend class NamespaceScope; |
+ friend class ReferenceCounted<Namespace>; |
+ DISALLOW_COPY_AND_ASSIGN(Namespace); |
+}; |
+ |
+class NamespaceScope { |
+ public: |
+ explicit NamespaceScope(Namespace* namespc, const char* path); |
+ ~NamespaceScope(); |
+ |
+ intptr_t fd() const { return fd_; } |
+ const char* path() const { return path_; } |
+ |
+ private: |
+ intptr_t fd_; |
+ const char* path_; |
+ bool owns_fd_; |
+ |
+ DISALLOW_ALLOCATION(); |
+ DISALLOW_COPY_AND_ASSIGN(NamespaceScope); |
+}; |
+ |
+} // namespace bin |
+} // namespace dart |
+ |
+#endif // RUNTIME_BIN_NAMESPACE_H_ |