Port more String and HashMap usages

BUG=
R=abarth@chromium.org

Review URL: https://codereview.chromium.org/1237973004 .
This commit is contained in:
John McCutchan 2015-07-16 07:30:56 -07:00
parent 3fff8ce303
commit eb2cef413d
11 changed files with 137 additions and 49 deletions

View File

@ -115,7 +115,7 @@ void DartController::RunFromLibrary(const String& name,
loader.set_library_provider(library_provider);
DartDependencyCatcher dependency_catcher(loader);
loader.LoadLibrary(name);
loader.LoadLibrary(name.toUTF8());
loader.WaitForDependencies(dependency_catcher.dependencies(),
base::Bind(&DartController::DidLoadMainLibrary,
weak_factory_.GetWeakPtr(), name));

View File

@ -6,10 +6,84 @@
#include "sky/engine/tonic/dart_converter.h"
#include "sky/engine/tonic/dart_builtin.h"
#include "sky/engine/wtf/text/StringBuilder.h"
namespace blink {
// TODO(johnmccutchan): Move this into another file.
class StdStringBuilder {
public:
StdStringBuilder() {
}
void Append(const char* s, intptr_t length) {
if (s == NULL) {
return;
}
for (intptr_t i = 0; i < length; i++) {
buffer_.push_back(s[i]);
}
}
void Append(const char* s) {
if (s == NULL) {
return;
}
for (intptr_t i = 0; s[i] != '\0'; i++) {
buffer_.push_back(s[i]);
}
}
void Append(char ch) {
buffer_.push_back(ch);
}
void Append(std::string s) {
if (s.length() == 0) {
return;
}
const char* c_str = s.data();
intptr_t c_str_length = s.size();
Append(c_str, c_str_length);
}
void AppendNumber(int num) {
Append(std::to_string(num));
}
void Clear() {
buffer_.resize(0);
}
void ShrinkToFit() {
buffer_.shrink_to_fit();
}
void Reserve(intptr_t capacity) {
buffer_.reserve(capacity);
}
std::string ToString() {
return std::string(buffer_.data(), buffer_.size());
}
const char* data() const {
return buffer_.data();
}
char* data() {
return buffer_.data();
}
intptr_t size() const {
return buffer_.size();
}
private:
std::vector<char> buffer_;
DISALLOW_COPY_AND_ASSIGN(StdStringBuilder);
};
DartExceptionFactory::DartExceptionFactory(DartState* dart_state)
: dart_state_(dart_state) {
}
@ -18,24 +92,30 @@ DartExceptionFactory::~DartExceptionFactory() {
}
Dart_Handle DartExceptionFactory::CreateNullArgumentException(int index) {
StringBuilder message;
message.appendLiteral("Argument ");
message.appendNumber(index);
message.appendLiteral(" cannot be null.");
return CreateException("ArgumentError", message.toString());
StdStringBuilder builder;
builder.Append("Argument ");
builder.AppendNumber(index);
builder.Append(" cannot be null.");
Dart_Handle message_handle = Dart_NewStringFromUTF8(
reinterpret_cast<const uint8_t*>(builder.data()), builder.size());
return CreateException("ArgumentError", message_handle);
}
Dart_Handle DartExceptionFactory::CreateException(const String& class_name,
const String& message) {
Dart_Handle DartExceptionFactory::CreateException(const std::string& class_name,
const std::string& message) {
return CreateException(class_name, StdStringToDart(message));
}
Dart_Handle DartExceptionFactory::CreateException(const std::string& class_name,
Dart_Handle message) {
if (core_library_.is_empty()) {
Dart_Handle library = DartBuiltin::LookupLibrary("dart:core");
core_library_.Set(dart_state_, library);
}
Dart_Handle exception_class = Dart_GetType(
core_library_.value(), StringToDart(dart_state_, class_name), 0, 0);
Dart_Handle message_handle = StringToDart(dart_state_, message);
return Dart_New(exception_class, Dart_EmptyString(), 1, &message_handle);
core_library_.value(), StdStringToDart(class_name), 0, 0);
return Dart_New(exception_class, Dart_EmptyString(), 1, &message);
}
} // namespace blink

View File

@ -5,9 +5,11 @@
#ifndef SKY_ENGINE_TONIC_DART_EXCEPTION_FACTORY_H_
#define SKY_ENGINE_TONIC_DART_EXCEPTION_FACTORY_H_
#include <string>
#include <vector>
#include "dart/runtime/include/dart_api.h"
#include "sky/engine/tonic/dart_persistent_value.h"
#include "sky/engine/wtf/text/WTFString.h"
namespace blink {
class DartState;
@ -18,7 +20,10 @@ class DartExceptionFactory {
~DartExceptionFactory();
Dart_Handle CreateNullArgumentException(int index);
Dart_Handle CreateException(const String& class_name, const String& message);
Dart_Handle CreateException(const std::string& class_name,
const std::string& message);
Dart_Handle CreateException(const std::string& class_name,
Dart_Handle message);
private:
DartState* dart_state_;

View File

@ -26,13 +26,13 @@ namespace blink {
class DartLibraryLoader::Job : public DartDependency,
public DataPipeDrainer::Client {
public:
Job(DartLibraryLoader* loader, const String& name)
Job(DartLibraryLoader* loader, const std::string& name)
: loader_(loader), name_(name), weak_factory_(this) {
loader->library_provider()->GetLibraryAsStream(
name, base::Bind(&Job::OnStreamAvailable, weak_factory_.GetWeakPtr()));
}
const String& name() const { return name_; }
const std::string& name() const { return name_; }
protected:
DartLibraryLoader* loader_;
@ -55,7 +55,7 @@ class DartLibraryLoader::Job : public DartDependency,
}
// Subclasses must implement OnDataComplete.
String name_;
std::string name_;
OwnPtr<DataPipeDrainer> drainer_;
base::WeakPtrFactory<Job> weak_factory_;
@ -63,9 +63,9 @@ class DartLibraryLoader::Job : public DartDependency,
class DartLibraryLoader::ImportJob : public Job {
public:
ImportJob(DartLibraryLoader* loader, const String& name) : Job(loader, name) {
ImportJob(DartLibraryLoader* loader, const std::string& name) : Job(loader, name) {
TRACE_EVENT_ASYNC_BEGIN1("sky", "DartLibraryLoader::ImportJob", this, "url",
name.ascii().toStdString());
name);
}
private:
@ -78,10 +78,10 @@ class DartLibraryLoader::ImportJob : public Job {
class DartLibraryLoader::SourceJob : public Job {
public:
SourceJob(DartLibraryLoader* loader, const String& name, Dart_Handle library)
SourceJob(DartLibraryLoader* loader, const std::string& name, Dart_Handle library)
: Job(loader, name), library_(loader->dart_state(), library) {
TRACE_EVENT_ASYNC_BEGIN1("sky", "DartLibraryLoader::SourceJob", this, "url",
name.ascii().toStdString());
name);
}
Dart_PersistentHandle library() const { return library_.value(); }
@ -207,24 +207,26 @@ void DartLibraryLoader::WaitForDependencies(
adoptPtr(new DependencyWatcher(dependencies, callback)));
}
void DartLibraryLoader::LoadLibrary(const String& name) {
const auto& result = pending_libraries_.add(name, nullptr);
if (result.isNewEntry) {
void DartLibraryLoader::LoadLibrary(const std::string& name) {
const auto& result = pending_libraries_.insert(std::make_pair(name, nullptr));
if (result.second) {
// New entry.
OwnPtr<Job> job = adoptPtr(new ImportJob(this, name));
result.storedValue->value = job.get();
result.first->second = job.get();
jobs_.add(job.release());
}
if (dependency_catcher_)
dependency_catcher_->AddDependency(result.storedValue->value);
dependency_catcher_->AddDependency(result.first->second);
}
Dart_Handle DartLibraryLoader::Import(Dart_Handle library, Dart_Handle url) {
LoadLibrary(StringFromDart(url));
LoadLibrary(StdStringFromDart(url));
return Dart_True();
}
Dart_Handle DartLibraryLoader::Source(Dart_Handle library, Dart_Handle url) {
OwnPtr<Job> job = adoptPtr(new SourceJob(this, StringFromDart(url), library));
OwnPtr<Job> job =
adoptPtr(new SourceJob(this, StdStringFromDart(url), library));
if (dependency_catcher_)
dependency_catcher_->AddDependency(job.get());
jobs_.add(job.release());
@ -245,14 +247,14 @@ void DartLibraryLoader::DidCompleteImportJob(
WatcherSignaler watcher_signaler(*this, job);
Dart_Handle result = Dart_LoadLibrary(
StringToDart(dart_state_, job->name()),
StdStringToDart(job->name()),
Dart_NewStringFromUTF8(buffer.data(), buffer.size()), 0, 0);
if (Dart_IsError(result)) {
LOG(ERROR) << "Error Loading " << job->name().utf8().data() << " "
LOG(ERROR) << "Error Loading " << job->name() << " "
<< Dart_GetError(result);
}
pending_libraries_.remove(job->name());
pending_libraries_.erase(job->name());
jobs_.remove(job);
}
@ -266,11 +268,11 @@ void DartLibraryLoader::DidCompleteSourceJob(
Dart_Handle result = Dart_LoadSource(
Dart_HandleFromPersistent(job->library()),
StringToDart(dart_state_, job->name()),
StdStringToDart(job->name()),
Dart_NewStringFromUTF8(buffer.data(), buffer.size()), 0, 0);
if (Dart_IsError(result)) {
LOG(ERROR) << "Error Loading " << job->name().utf8().data() << " "
LOG(ERROR) << "Error Loading " << job->name() << " "
<< Dart_GetError(result);
}
@ -283,7 +285,7 @@ void DartLibraryLoader::DidFailJob(Job* job) {
WatcherSignaler watcher_signaler(*this, job);
LOG(ERROR) << "Library Load failed: " << job->name().utf8().data();
LOG(ERROR) << "Library Load failed: " << job->name();
// TODO(eseidel): Call Dart_LibraryHandleError in the SourceJob case?
jobs_.remove(job);

View File

@ -5,15 +5,16 @@
#ifndef SKY_ENGINE_TONIC_DART_LIBRARY_LOADER_H_
#define SKY_ENGINE_TONIC_DART_LIBRARY_LOADER_H_
#include <string>
#include <unordered_map>
#include <vector>
#include "base/callback_forward.h"
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "dart/runtime/include/dart_api.h"
#include "sky/engine/wtf/HashMap.h"
#include "sky/engine/wtf/HashSet.h"
#include "sky/engine/wtf/OwnPtr.h"
#include "sky/engine/wtf/text/WTFString.h"
namespace blink {
class DartDependency;
@ -35,7 +36,7 @@ class DartLibraryLoader {
Dart_Handle library,
Dart_Handle url);
void LoadLibrary(const String& name);
void LoadLibrary(const std::string& name);
void WaitForDependencies(const HashSet<DartDependency*>& dependencies,
const base::Closure& callback);
@ -70,7 +71,7 @@ class DartLibraryLoader {
DartState* dart_state_;
DartLibraryProvider* library_provider_;
HashMap<String, Job*> pending_libraries_;
std::unordered_map<std::string, Job*> pending_libraries_;
HashSet<OwnPtr<Job>> jobs_;
HashSet<OwnPtr<DependencyWatcher>> dependency_watchers_;
DartDependencyCatcher* dependency_catcher_;

View File

@ -5,10 +5,11 @@
#ifndef SKY_ENGINE_TONIC_DART_LIBRARY_PROVIDER_H_
#define SKY_ENGINE_TONIC_DART_LIBRARY_PROVIDER_H_
#include <string>
#include "base/callback.h"
#include "dart/runtime/include/dart_api.h"
#include "mojo/public/cpp/system/data_pipe.h"
#include "sky/engine/wtf/text/WTFString.h"
namespace blink {
@ -17,7 +18,7 @@ typedef base::Callback<void(mojo::ScopedDataPipeConsumerHandle)>
class DartLibraryProvider {
public:
virtual void GetLibraryAsStream(const String& name,
virtual void GetLibraryAsStream(const std::string& name,
DataPipeConsumerCallback callback) = 0;
virtual Dart_Handle CanonicalizeURL(Dart_Handle library, Dart_Handle url) = 0;

View File

@ -13,7 +13,6 @@
#include "dart/runtime/include/dart_api.h"
#include "mojo/common/data_pipe_drainer.h"
#include "sky/engine/wtf/OwnPtr.h"
#include "sky/engine/wtf/text/WTFString.h"
namespace blink {
class DartState;

View File

@ -50,12 +50,12 @@ DartLibraryProviderFiles::~DartLibraryProviderFiles() {
}
void DartLibraryProviderFiles::GetLibraryAsStream(
const String& name,
const std::string& name,
blink::DataPipeConsumerCallback callback) {
mojo::DataPipe pipe;
callback.Run(pipe.consumer_handle.Pass());
base::FilePath source(name.toUTF8());
base::FilePath source(name);
scoped_refptr<base::TaskRunner> runner =
base::WorkerPool::GetTaskRunner(true);
mojo::common::CopyFromFile(source, pipe.producer_handle.Pass(), 0,

View File

@ -18,7 +18,7 @@ class DartLibraryProviderFiles : public blink::DartLibraryProvider {
protected:
// |DartLibraryProvider| implementation:
void GetLibraryAsStream(const String& name,
void GetLibraryAsStream(const std::string& name,
blink::DataPipeConsumerCallback callback) override;
Dart_Handle CanonicalizeURL(Dart_Handle library, Dart_Handle url) override;

View File

@ -14,13 +14,13 @@ namespace shell {
namespace {
mojo::URLLoaderPtr Fetch(mojo::NetworkService* network_service,
const String& url,
const std::string& url,
base::Callback<void(mojo::URLResponsePtr)> callback) {
mojo::URLLoaderPtr loader;
network_service->CreateURLLoader(GetProxy(&loader));
mojo::URLRequestPtr request = mojo::URLRequest::New();
request->url = url.toUTF8();
request->url = url;
request->auto_follow_redirects = true;
loader->Start(request.Pass(), callback);
@ -32,7 +32,7 @@ mojo::URLLoaderPtr Fetch(mojo::NetworkService* network_service,
class DartLibraryProviderNetwork::Job {
public:
Job(DartLibraryProviderNetwork* provider,
const String& name,
const std::string& name,
blink::DataPipeConsumerCallback callback)
: provider_(provider), callback_(callback), weak_factory_(this) {
url_loader_ =
@ -66,7 +66,7 @@ DartLibraryProviderNetwork::~DartLibraryProviderNetwork() {
}
void DartLibraryProviderNetwork::GetLibraryAsStream(
const String& name,
const std::string& name,
blink::DataPipeConsumerCallback callback) {
jobs_.add(adoptPtr(new Job(this, name, callback)));
}

View File

@ -22,7 +22,7 @@ class DartLibraryProviderNetwork : public blink::DartLibraryProvider {
protected:
// |DartLibraryProvider| implementation:
void GetLibraryAsStream(const String& name,
void GetLibraryAsStream(const std::string& name,
blink::DataPipeConsumerCallback callback) override;
Dart_Handle CanonicalizeURL(Dart_Handle library, Dart_Handle url) override;