Chromium Code Reviews| Index: runtime/vm/message.h |
| diff --git a/runtime/vm/message.h b/runtime/vm/message.h |
| index 42a1eb1e1a353a1bb681b27ba33b56aa29301d57..cd3fb8ba919674f00bb51a8865f5eb8112b833c3 100644 |
| --- a/runtime/vm/message.h |
| +++ b/runtime/vm/message.h |
| @@ -37,6 +37,12 @@ class Message { |
| kDelayedIsolateLibOOBMsg = 3, |
| } OOBMsgTag; |
| + typedef enum { |
| + kDataType = 0, |
| + kIntegerType = 1, |
| + kNumTypes = 2, |
| + } MessageType; |
| + |
| // A port number which is never used. |
| static const Dart_Port kIllegalPort = 0; |
| @@ -51,20 +57,47 @@ class Message { |
| : next_(NULL), |
| dest_port_(dest_port), |
| delivery_failure_port_(delivery_failure_port), |
| - data_(data), |
| - len_(len), |
| - priority_(priority) { |
| + priority_(priority), |
| + type_(kDataType) { |
| + ASSERT((priority == kNormalPriority) || |
| + (delivery_failure_port == kIllegalPort)); |
| + data_.buffer.data = data; |
| + data_.buffer.len = len; |
| + } |
| + Message(Dart_Port dest_port, |
| + intptr_t data, |
| + Priority priority, |
| + Dart_Port delivery_failure_port = kIllegalPort) |
| + : next_(NULL), |
| + dest_port_(dest_port), |
| + delivery_failure_port_(delivery_failure_port), |
| + priority_(priority), |
| + type_(kIntegerType) { |
| ASSERT((priority == kNormalPriority) || |
| (delivery_failure_port == kIllegalPort)); |
| + data_.integer = data; |
| } |
| ~Message() { |
| ASSERT(delivery_failure_port_ == kIllegalPort); |
| - free(data_); |
| + if (type_ == kDataType) { |
| + free(data_.buffer.data); |
| + } |
| } |
| Dart_Port dest_port() const { return dest_port_; } |
| - uint8_t* data() const { return data_; } |
| - intptr_t len() const { return len_; } |
| + MessageType type() const { return type_; } |
| + uint8_t* data() const { |
| + ASSERT(type_ == kDataType); |
| + return data_.buffer.data; |
| + } |
| + intptr_t len() const { |
| + ASSERT(type_ == kDataType); |
| + return data_.buffer.len; |
| + } |
| + intptr_t integer() const { |
| + ASSERT(type_ == kIntegerType); |
| + return data_.integer; |
| + } |
| Priority priority() const { return priority_; } |
| bool IsOOB() const { return priority_ == Message::kOOBPriority; } |
| @@ -81,9 +114,15 @@ class Message { |
| Message* next_; |
| Dart_Port dest_port_; |
| Dart_Port delivery_failure_port_; |
| - uint8_t* data_; |
| - intptr_t len_; |
| + union { |
| + struct { |
| + uint8_t* data; |
| + intptr_t len; |
| + } buffer; // Avtive when type_ == kDataType. |
| + intptr_t integer; // Active when type_ == kIntegerType. |
|
Ivan Posva
2015/12/08 08:25:55
Let's discuss this change in person to figure out
|
| + } data_; |
| Priority priority_; |
| + MessageType type_; |
| DISALLOW_COPY_AND_ASSIGN(Message); |
| }; |