| Index: runtime/bin/dartutils.cc
|
| diff --git a/runtime/bin/dartutils.cc b/runtime/bin/dartutils.cc
|
| index cb0ae2bac099356a22c9d3b2b502fd65866c60cd..b472e7975946cb8c2b8f01a183560ba6053f06e6 100644
|
| --- a/runtime/bin/dartutils.cc
|
| +++ b/runtime/bin/dartutils.cc
|
| @@ -252,9 +252,7 @@ const char* DartUtils::GetCanonicalPath(const char* reference_dir,
|
|
|
| bool DartUtils::PostNull(Dart_Port port_id) {
|
| // Post a message with just the null object.
|
| - Dart_CObject object;
|
| - object.type = Dart_CObject::kNull;
|
| - return Dart_PostCObject(port_id, &object);
|
| + return Dart_PostCObject(port_id, CObject::Null()->AsApiCObject());
|
| }
|
|
|
|
|
| @@ -268,3 +266,89 @@ bool DartUtils::PostInt32(Dart_Port port_id, int32_t value) {
|
| object.value.as_int32 = value;
|
| return Dart_PostCObject(port_id, &object);
|
| }
|
| +
|
| +
|
| +// Statically allocated Dart_CObject instances for immutable
|
| +// objects. As these will be used by different threads the use of
|
| +// these depends on the fact that the marking internally in the
|
| +// Dart_CObject structure is not marking simple value objects.
|
| +Dart_CObject CObject::api_null_ = { Dart_CObject::kNull , { 0 } };
|
| +Dart_CObject CObject::api_true_ = { Dart_CObject::kBool , { true } };
|
| +Dart_CObject CObject::api_false_ = { Dart_CObject::kBool, { false } };
|
| +CObject CObject::null_ = CObject(&api_null_);
|
| +CObject CObject::true_ = CObject(&api_true_);
|
| +CObject CObject::false_ = CObject(&api_false_);
|
| +
|
| +
|
| +CObject* CObject::Null() {
|
| + return &null_;
|
| +}
|
| +
|
| +
|
| +CObject* CObject::True() {
|
| + return &true_;
|
| +}
|
| +
|
| +
|
| +CObject* CObject::False() {
|
| + return &false_;
|
| +}
|
| +
|
| +
|
| +CObject* CObject::Bool(bool value) {
|
| + return value ? &true_ : &false_;
|
| +}
|
| +
|
| +
|
| +Dart_CObject* CObject::New(Dart_CObject::Type type, int additional_bytes) {
|
| + Dart_CObject* cobject = reinterpret_cast<Dart_CObject*>(
|
| + Dart_ScopeAllocate(sizeof(Dart_CObject) + additional_bytes));
|
| + cobject->type = type;
|
| + return cobject;
|
| +}
|
| +
|
| +
|
| +Dart_CObject* CObject::NewInt32(int32_t value) {
|
| + Dart_CObject* cobject = New(Dart_CObject::kInt32);
|
| + cobject->value.as_int32 = value;
|
| + return cobject;
|
| +}
|
| +
|
| +
|
| +Dart_CObject* CObject::NewInt64(int64_t value) {
|
| + Dart_CObject* cobject = New(Dart_CObject::kInt64);
|
| + cobject->value.as_int64 = value;
|
| + return cobject;
|
| +}
|
| +
|
| +
|
| +Dart_CObject* CObject::NewDouble(double value) {
|
| + Dart_CObject* cobject = New(Dart_CObject::kDouble);
|
| + cobject->value.as_double = value;
|
| + return cobject;
|
| +}
|
| +
|
| +
|
| +Dart_CObject* CObject::NewString(int length) {
|
| + Dart_CObject* cobject = New(Dart_CObject::kString, length + 1);
|
| + cobject->value.as_string = reinterpret_cast<char*>(cobject + 1);
|
| + return cobject;
|
| +}
|
| +
|
| +
|
| +Dart_CObject* CObject::NewString(const char* str) {
|
| + int length = strlen(str);
|
| + Dart_CObject* cobject = NewString(length);
|
| + memmove(cobject->value.as_string, str, length + 1);
|
| + return cobject;
|
| +}
|
| +
|
| +
|
| +Dart_CObject* CObject::NewArray(int length) {
|
| + Dart_CObject* cobject =
|
| + New(Dart_CObject::kArray, length * sizeof(Dart_CObject*)); // NOLINT
|
| + cobject->value.as_array.length = length;
|
| + cobject->value.as_array.values =
|
| + reinterpret_cast<Dart_CObject**>(cobject + 1);
|
| + return cobject;
|
| +}
|
|
|