OLD | NEW |
---|---|
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/dart_api_message.h" | 5 #include "vm/dart_api_message.h" |
6 #include "vm/object.h" | 6 #include "vm/object.h" |
7 #include "vm/object_store.h" | 7 #include "vm/object_store.h" |
8 | 8 |
9 namespace dart { | 9 namespace dart { |
10 | 10 |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
93 // up to this area. | 93 // up to this area. |
94 Dart_CObject* value = | 94 Dart_CObject* value = |
95 reinterpret_cast<Dart_CObject*>( | 95 reinterpret_cast<Dart_CObject*>( |
96 alloc_(NULL, 0, sizeof(Dart_CObject) + length + 1)); | 96 alloc_(NULL, 0, sizeof(Dart_CObject) + length + 1)); |
97 value->value.as_string = reinterpret_cast<char*>(value) + sizeof(*value); | 97 value->value.as_string = reinterpret_cast<char*>(value) + sizeof(*value); |
98 value->type = Dart_CObject::kString; | 98 value->type = Dart_CObject::kString; |
99 return value; | 99 return value; |
100 } | 100 } |
101 | 101 |
102 | 102 |
103 Dart_CObject* ApiMessageReader::AllocateDartCObjectByteArray(intptr_t length) { | |
104 // Allocate a Dart_CObject structure followed by an array of bytes | |
105 // for the byte array content. The pointer to the byte array content | |
106 // is set up to this area. | |
107 Dart_CObject* value = | |
108 reinterpret_cast<Dart_CObject*>( | |
109 alloc_(NULL, 0, sizeof(Dart_CObject) + length + 1)); | |
siva
2012/02/09 01:58:57
(sizeof(Dart_Cobject) + length + 1)
what is the +
Søren Gjesse
2012/02/09 09:34:16
Removed the + 1 (copy/paset from string allocation
| |
110 value->type = Dart_CObject::kByteArray; | |
111 value->value.as_array.length = length; | |
112 if (length > 0) { | |
113 value->value.as_byte_array.values = | |
114 reinterpret_cast<uint8_t*>(value) + sizeof(*value); | |
115 } else { | |
116 value->value.as_byte_array.values = NULL; | |
117 } | |
118 return value; | |
119 } | |
120 | |
121 | |
103 Dart_CObject* ApiMessageReader::AllocateDartCObjectArray(intptr_t length) { | 122 Dart_CObject* ApiMessageReader::AllocateDartCObjectArray(intptr_t length) { |
104 // Allocate a Dart_CObject structure followed by an array of | 123 // Allocate a Dart_CObject structure followed by an array of |
105 // pointers to Dart_CObject structures. The pointer to the array | 124 // pointers to Dart_CObject structures. The pointer to the array |
106 // content is set up to this area. | 125 // content is set up to this area. |
107 Dart_CObject* value = | 126 Dart_CObject* value = |
108 reinterpret_cast<Dart_CObject*>( | 127 reinterpret_cast<Dart_CObject*>( |
109 alloc_(NULL, 0, sizeof(Dart_CObject) + length * sizeof(value))); | 128 alloc_(NULL, 0, sizeof(Dart_CObject) + length * sizeof(value))); |
110 value->type = Dart_CObject::kArray; | 129 value->type = Dart_CObject::kArray; |
111 value->value.as_array.length = length; | 130 value->value.as_array.length = length; |
112 if (length > 0) { | 131 if (length > 0) { |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
190 break; | 209 break; |
191 } | 210 } |
192 case ObjectStore::kTwoByteStringClass: | 211 case ObjectStore::kTwoByteStringClass: |
193 // Two byte strings not supported. | 212 // Two byte strings not supported. |
194 return NULL; | 213 return NULL; |
195 break; | 214 break; |
196 case ObjectStore::kFourByteStringClass: | 215 case ObjectStore::kFourByteStringClass: |
197 // Four byte strings not supported. | 216 // Four byte strings not supported. |
198 return NULL; | 217 return NULL; |
199 break; | 218 break; |
219 case ObjectStore::kInternalByteArrayClass: { | |
220 intptr_t len = ReadSmiValue(); | |
221 Dart_CObject* object = AllocateDartCObjectByteArray(len); | |
222 AddBackwardReference(object_id, object); | |
223 if (len > 0) { | |
224 uint8_t* p = object->value.as_byte_array.values; | |
225 for (intptr_t i = 0; i < len; i++) { | |
226 *p = Read<uint8_t>(); | |
siva
2012/02/09 01:58:57
p[i] = Read<uint8_t>();
would avoid the need for
Søren Gjesse
2012/02/09 09:34:16
Done (for string as well).
| |
227 p++; | |
228 } | |
229 } | |
230 return object; | |
231 break; | |
232 } | |
200 default: | 233 default: |
201 // Everything else not supported. | 234 // Everything else not supported. |
202 return NULL; | 235 return NULL; |
203 } | 236 } |
204 } | 237 } |
205 | 238 |
206 | 239 |
207 Dart_CObject* ApiMessageReader::ReadIndexedObject(intptr_t object_id) { | 240 Dart_CObject* ApiMessageReader::ReadIndexedObject(intptr_t object_id) { |
208 if (object_id == Object::kNullObject) { | 241 if (object_id == Object::kNullObject) { |
209 return AllocateDartCObjectNull(); | 242 return AllocateDartCObjectNull(); |
210 } else if (object_id == ObjectStore::kTrueValue) { | 243 } else if (object_id == ObjectStore::kTrueValue) { |
211 return AllocateDartCObjectBool(true); | 244 return AllocateDartCObjectBool(true); |
212 } else if (object_id == ObjectStore::kFalseValue) { | 245 } else if (object_id == ObjectStore::kFalseValue) { |
213 return AllocateDartCObjectBool(false); | 246 return AllocateDartCObjectBool(false); |
214 } else if (object_id == ObjectStore::kDynamicType || | 247 } else if (object_id == ObjectStore::kDynamicType || |
215 object_id == ObjectStore::kDoubleInterface || | 248 object_id == ObjectStore::kDoubleInterface || |
216 object_id == ObjectStore::kIntInterface || | 249 object_id == ObjectStore::kIntInterface || |
217 object_id == ObjectStore::kBoolInterface || | 250 object_id == ObjectStore::kBoolInterface || |
218 object_id == ObjectStore::kStringInterface) { | 251 object_id == ObjectStore::kStringInterface || |
252 object_id == ObjectStore::kByteArrayInterface) { | |
219 // Always return dynamic type (this is only a marker). | 253 // Always return dynamic type (this is only a marker). |
220 return &dynamic_type_marker; | 254 return &dynamic_type_marker; |
221 } else { | 255 } else { |
222 intptr_t index = object_id - kMaxPredefinedObjectIds; | 256 intptr_t index = object_id - kMaxPredefinedObjectIds; |
223 ASSERT(index < backward_references_.length()); | 257 ASSERT(index < backward_references_.length()); |
224 ASSERT(backward_references_[index] != NULL); | 258 ASSERT(backward_references_[index] != NULL); |
225 return backward_references_[index]; | 259 return backward_references_[index]; |
226 } | 260 } |
227 return NULL; | 261 return NULL; |
228 } | 262 } |
(...skipping 21 matching lines...) Expand all Loading... | |
250 return ReadObjectImpl(value); | 284 return ReadObjectImpl(value); |
251 } | 285 } |
252 | 286 |
253 | 287 |
254 void ApiMessageReader::AddBackwardReference(intptr_t id, Dart_CObject* obj) { | 288 void ApiMessageReader::AddBackwardReference(intptr_t id, Dart_CObject* obj) { |
255 ASSERT((id - kMaxPredefinedObjectIds) == backward_references_.length()); | 289 ASSERT((id - kMaxPredefinedObjectIds) == backward_references_.length()); |
256 backward_references_.Add(obj); | 290 backward_references_.Add(obj); |
257 } | 291 } |
258 | 292 |
259 } // namespace dart | 293 } // namespace dart |
OLD | NEW |