// 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/reference_counting.h" #include "platform/syslog.h" namespace dart { namespace bin { class NamespaceImpl; class Namespace : public ReferenceCounted { public: // Assumes namespc is a value that can be directly used as namespc_. static Namespace* Create(intptr_t namespc); // Uses path to compute a value that can be used as namespc_. static Namespace* Create(const char* path); // Gives a safe default 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); NamespaceImpl* namespc() const { return namespc_; } private: // When namespc_ has this value, it indicates that there is currently // no namespace for resolving absolute paths. static constexpr intptr_t kNone = 0; explicit Namespace(NamespaceImpl* 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. static void ResolvePath(Namespace* namespc, const char* path, intptr_t* dirfd, const char** resolved_path); NamespaceImpl* 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; DISALLOW_COPY_AND_ASSIGN(Namespace); }; class NamespaceScope { public: 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_; DISALLOW_ALLOCATION(); DISALLOW_COPY_AND_ASSIGN(NamespaceScope); }; } // namespace bin } // namespace dart #endif // RUNTIME_BIN_NAMESPACE_H_