Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(449)

Side by Side Diff: Source/WebCore/bindings/v8/SerializedScriptValue.cpp

Issue 8806015: Changes to support a second VM. (Closed) Base URL: svn://svn.chromium.org/dash/experimental/chrome/src/webkit-full
Patch Set: . Created 9 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2010 Google Inc. All rights reserved. 2 * Copyright (C) 2010 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 29 matching lines...) Expand all
40 #include "ExceptionCode.h" 40 #include "ExceptionCode.h"
41 #include "File.h" 41 #include "File.h"
42 #include "FileList.h" 42 #include "FileList.h"
43 #include "Float32Array.h" 43 #include "Float32Array.h"
44 #include "Float64Array.h" 44 #include "Float64Array.h"
45 #include "ImageData.h" 45 #include "ImageData.h"
46 #include "Int16Array.h" 46 #include "Int16Array.h"
47 #include "Int32Array.h" 47 #include "Int32Array.h"
48 #include "Int8Array.h" 48 #include "Int8Array.h"
49 #include "MessagePort.h" 49 #include "MessagePort.h"
50 #include "ScriptValueDeserializer.h"
51 #include "ScriptValueSerializer.h"
50 #include "SharedBuffer.h" 52 #include "SharedBuffer.h"
51 #include "Uint16Array.h" 53 #include "Uint16Array.h"
52 #include "Uint32Array.h" 54 #include "Uint32Array.h"
53 #include "Uint8Array.h" 55 #include "Uint8Array.h"
54 #include "V8ArrayBuffer.h" 56 #include "V8ArrayBuffer.h"
55 #include "V8ArrayBufferView.h" 57 #include "V8ArrayBufferView.h"
56 #include "V8Binding.h" 58 #include "V8Binding.h"
57 #include "V8Blob.h" 59 #include "V8Blob.h"
58 #include "V8DataView.h" 60 #include "V8DataView.h"
59 #include "V8File.h" 61 #include "V8File.h"
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after
260 value >>= 1; 262 value >>= 1;
261 return value; 263 return value;
262 } 264 }
263 265
264 private: 266 private:
265 ZigZag(); 267 ZigZag();
266 }; 268 };
267 269
268 // Writer is responsible for serializing primitive types and storing 270 // Writer is responsible for serializing primitive types and storing
269 // information used to reconstruct composite types. 271 // information used to reconstruct composite types.
270 class Writer { 272 class Writer : public ScriptValueWriter {
271 WTF_MAKE_NONCOPYABLE(Writer); 273 WTF_MAKE_NONCOPYABLE(Writer);
272 public: 274 public:
273 Writer() 275 Writer()
274 : m_position(0) 276 : m_position(0)
275 { 277 {
276 } 278 }
277 279
278 // Write functions for primitive types. 280 // Write functions for primitive types.
279 281
280 void writeUndefined() { append(UndefinedTag); } 282 void writeUndefined() { append(UndefinedTag); }
(...skipping 819 matching lines...) Expand 10 before | Expand all | Expand 10 after
1100 if (isHostObject(jsObject) || jsObject->IsCallable() || value->IsNat iveError()) 1102 if (isHostObject(jsObject) || jsObject->IsCallable() || value->IsNat iveError())
1101 return handleError(DataCloneError, next); 1103 return handleError(DataCloneError, next);
1102 m_writer.writeGenerateFreshObject(); 1104 m_writer.writeGenerateFreshObject();
1103 return push(newObjectState(jsObject, next)); 1105 return push(newObjectState(jsObject, next));
1104 } else 1106 } else
1105 return handleError(DataCloneError, next); 1107 return handleError(DataCloneError, next);
1106 } 1108 }
1107 return 0; 1109 return 0;
1108 } 1110 }
1109 1111
1110 // Interface used by Reader to create objects of composite types.
1111 class CompositeCreator {
1112 public:
1113 virtual ~CompositeCreator() { }
1114
1115 virtual bool consumeTopOfStack(v8::Handle<v8::Value>*) = 0;
1116 virtual uint32_t objectReferenceCount() = 0;
1117 virtual void pushObjectReference(const v8::Handle<v8::Value>&) = 0;
1118 virtual bool tryGetObjectFromObjectReference(uint32_t reference, v8::Handle< v8::Value>*) = 0;
1119 virtual bool tryGetTransferredMessagePort(uint32_t index, v8::Handle<v8::Val ue>*) = 0;
1120 virtual bool newArray(uint32_t length) = 0;
1121 virtual bool newObject() = 0;
1122 virtual bool completeArray(uint32_t length, v8::Handle<v8::Value>*) = 0;
1123 virtual bool completeObject(uint32_t numProperties, v8::Handle<v8::Value>*) = 0;
1124 virtual bool completeSparseArray(uint32_t numProperties, uint32_t length, v8 ::Handle<v8::Value>*) = 0;
1125 };
1126
1127 // Reader is responsible for deserializing primitive types and 1112 // Reader is responsible for deserializing primitive types and
1128 // restoring information about saved objects of composite types. 1113 // restoring information about saved objects of composite types.
1129 class Reader { 1114 class Reader {
1130 public: 1115 public:
1131 Reader(const uint8_t* buffer, int length) 1116 Reader(const uint8_t* buffer, int length)
1132 : m_buffer(buffer) 1117 : m_buffer(buffer)
1133 , m_length(length) 1118 , m_length(length)
1134 , m_position(0) 1119 , m_position(0)
1135 , m_version(0) 1120 , m_version(0)
1136 { 1121 {
1137 ASSERT(length >= 0); 1122 ASSERT(length >= 0);
1138 } 1123 }
1139 1124
1125 uint32_t version() const { return m_version; }
1126
1127 bool read(ScriptValueDeserializer& deserializer)
1128 {
1129 if (!readVersion(m_version) || m_version > wireFormatVersion)
1130 return false;
1131
1132 while (!isEof()) {
1133 SerializationTag tag;
1134 if (!readTag(&tag))
1135 return false;
1136 switch (tag) {
1137 case ReferenceCountTag: {
1138 if (m_version <= 0)
1139 return false;
1140 uint32_t referenceTableSize;
1141 if (!doReadUint32(&referenceTableSize))
1142 return false;
1143 // If this test fails, then the serializer and deserializer disa gree about the assignment
1144 // of object reference IDs.
1145 if (referenceTableSize != deserializer.objectReferenceCount())
1146 return false;
1147 break;
1148 }
1149 case InvalidTag:
1150 return false;
1151 case PaddingTag:
1152 break;
1153 case UndefinedTag:
1154 if (!deserializer.pushUndefined())
1155 return false;
1156 break;
1157 case NullTag:
1158 if (!deserializer.pushNull())
1159 return false;
1160 break;
1161 case TrueTag:
1162 if (!deserializer.pushTrue())
1163 return false;
1164 break;
1165 case FalseTag:
1166 if (!deserializer.pushFalse())
1167 return false;
1168 break;
1169 case TrueObjectTag:
1170 if (!deserializer.pushTrueObject())
1171 return false;
1172 deserializer.addReferenceForTop();
1173 break;
1174 case FalseObjectTag:
1175 if (!deserializer.pushFalseObject())
1176 return false;
1177 deserializer.addReferenceForTop();
1178 break;
1179 case StringTag:
1180 if (!readString(deserializer))
1181 return false;
1182 break;
1183 case StringObjectTag:
1184 if (!readStringObject(deserializer))
1185 return false;
1186 break;
1187 case Int32Tag:
1188 if (!readInt32(deserializer))
1189 return false;
1190 break;
1191 case Uint32Tag:
1192 if (!readUint32(deserializer))
1193 return false;
1194 break;
1195 case DateTag:
1196 if (!readDate(deserializer))
1197 return false;
1198 break;
1199 case NumberTag:
1200 if (!readNumber(deserializer))
1201 return false;
1202 break;
1203 case NumberObjectTag:
1204 if (!readNumberObject(deserializer))
1205 return false;
1206 break;
1207 case BlobTag:
1208 if (!readBlob(deserializer))
1209 return false;
1210 break;
1211 case FileTag:
1212 if (!readFile(deserializer))
1213 return false;
1214 break;
1215 case FileListTag:
1216 if (!readFileList(deserializer))
1217 return false;
1218 break;
1219 case ImageDataTag:
1220 if (!readImageData(deserializer))
1221 return false;
1222 break;
1223 case ArrayTag: {
1224 uint32_t length;
1225 if (!doReadUint32(&length))
1226 return false;
1227 if (!deserializer.pushArray(length))
1228 return false;
1229 break;
1230 }
1231 case RegExpTag:
1232 if (!readRegExp(deserializer))
1233 return false;
1234 break;
1235 case ObjectTag: {
1236 uint32_t numProperties;
1237 if (!doReadUint32(&numProperties))
1238 return false;
1239 if (!deserializer.pushObject(numProperties))
1240 return false;
1241 break;
1242 }
1243 case SparseArrayTag: {
1244 uint32_t numProperties;
1245 uint32_t length;
1246 if (!doReadUint32(&numProperties))
1247 return false;
1248 if (!doReadUint32(&length))
1249 return false;
1250 if (!deserializer.pushSparseArray(numProperties, length))
1251 return false;
1252 break;
1253 }
1254 case ArrayBufferViewTag: {
1255 if (m_version <= 0)
1256 return false;
1257 if (!readArrayBufferView(deserializer))
1258 return false;
1259 break;
1260 }
1261 case ArrayBufferTag: {
1262 if (m_version <= 0)
1263 return false;
1264 if (!readArrayBuffer(deserializer))
1265 return false;
1266 break;
1267 }
1268 case GenerateFreshObjectTag: {
1269 if (m_version <= 0)
1270 return false;
1271 if (!deserializer.newObject())
1272 return false;
1273 break;
1274 }
1275 case GenerateFreshArrayTag: {
1276 if (m_version <= 0)
1277 return false;
1278 uint32_t length;
1279 if (!doReadUint32(&length))
1280 return false;
1281 if (!deserializer.newArray(length))
1282 return false;
1283 break;
1284 }
1285 // FIXMEDART: uncomment this.
1286 /*
1287 case MessagePortTag: {
1288 if (m_version <= 0)
1289 return false;
1290 uint32_t index;
1291 if (!doReadUint32(&index))
1292 return false;
1293 if (!deserializer.tryGetTransferredMessagePort(index, value))
1294 return false;
1295 break;
1296 }
1297 */
1298 case ObjectReferenceTag: {
1299 if (m_version <= 0)
1300 return false;
1301 uint32_t reference;
1302 if (!doReadUint32(&reference))
1303 return false;
1304 if (!deserializer.tryGetObjectFromObjectReference(reference))
1305 return false;
1306 break;
1307 }
1308 default:
1309 return false;
1310 }
1311 }
1312
1313 return true;
1314 }
1315
1316 private:
1140 bool isEof() const { return m_position >= m_length; } 1317 bool isEof() const { return m_position >= m_length; }
1141 1318
1142 bool read(v8::Handle<v8::Value>* value, CompositeCreator& creator)
1143 {
1144 SerializationTag tag;
1145 if (!readTag(&tag))
1146 return false;
1147 switch (tag) {
1148 case ReferenceCountTag: {
1149 if (m_version <= 0)
1150 return false;
1151 uint32_t referenceTableSize;
1152 if (!doReadUint32(&referenceTableSize))
1153 return false;
1154 // If this test fails, then the serializer and deserializer disagree about the assignment
1155 // of object reference IDs. On the deserialization side, this means there are too many or too few
1156 // calls to pushObjectReference.
1157 if (referenceTableSize != creator.objectReferenceCount())
1158 return false;
1159 return true;
1160 }
1161 case InvalidTag:
1162 return false;
1163 case PaddingTag:
1164 return true;
1165 case UndefinedTag:
1166 *value = v8::Undefined();
1167 break;
1168 case NullTag:
1169 *value = v8::Null();
1170 break;
1171 case TrueTag:
1172 *value = v8::True();
1173 break;
1174 case FalseTag:
1175 *value = v8::False();
1176 break;
1177 case TrueObjectTag:
1178 *value = v8::BooleanObject::New(true);
1179 creator.pushObjectReference(*value);
1180 break;
1181 case FalseObjectTag:
1182 *value = v8::BooleanObject::New(false);
1183 creator.pushObjectReference(*value);
1184 break;
1185 case StringTag:
1186 if (!readString(value))
1187 return false;
1188 break;
1189 case StringObjectTag:
1190 if (!readStringObject(value))
1191 return false;
1192 creator.pushObjectReference(*value);
1193 break;
1194 case Int32Tag:
1195 if (!readInt32(value))
1196 return false;
1197 break;
1198 case Uint32Tag:
1199 if (!readUint32(value))
1200 return false;
1201 break;
1202 case DateTag:
1203 if (!readDate(value))
1204 return false;
1205 creator.pushObjectReference(*value);
1206 break;
1207 case NumberTag:
1208 if (!readNumber(value))
1209 return false;
1210 break;
1211 case NumberObjectTag:
1212 if (!readNumberObject(value))
1213 return false;
1214 creator.pushObjectReference(*value);
1215 break;
1216 case BlobTag:
1217 if (!readBlob(value))
1218 return false;
1219 creator.pushObjectReference(*value);
1220 break;
1221 case FileTag:
1222 if (!readFile(value))
1223 return false;
1224 creator.pushObjectReference(*value);
1225 break;
1226 case FileListTag:
1227 if (!readFileList(value))
1228 return false;
1229 creator.pushObjectReference(*value);
1230 break;
1231 case ImageDataTag:
1232 if (!readImageData(value))
1233 return false;
1234 creator.pushObjectReference(*value);
1235 break;
1236
1237 case ArrayTag: {
1238 uint32_t length;
1239 if (!doReadUint32(&length))
1240 return false;
1241 if (!creator.completeArray(length, value))
1242 return false;
1243 break;
1244 }
1245 case RegExpTag:
1246 if (!readRegExp(value))
1247 return false;
1248 creator.pushObjectReference(*value);
1249 break;
1250 case ObjectTag: {
1251 uint32_t numProperties;
1252 if (!doReadUint32(&numProperties))
1253 return false;
1254 if (!creator.completeObject(numProperties, value))
1255 return false;
1256 break;
1257 }
1258 case SparseArrayTag: {
1259 uint32_t numProperties;
1260 uint32_t length;
1261 if (!doReadUint32(&numProperties))
1262 return false;
1263 if (!doReadUint32(&length))
1264 return false;
1265 if (!creator.completeSparseArray(numProperties, length, value))
1266 return false;
1267 break;
1268 }
1269 case ArrayBufferViewTag: {
1270 if (m_version <= 0)
1271 return false;
1272 if (!readArrayBufferView(value, creator))
1273 return false;
1274 creator.pushObjectReference(*value);
1275 break;
1276 }
1277 case ArrayBufferTag: {
1278 if (m_version <= 0)
1279 return false;
1280 if (!readArrayBuffer(value))
1281 return false;
1282 creator.pushObjectReference(*value);
1283 break;
1284 }
1285 case GenerateFreshObjectTag: {
1286 if (m_version <= 0)
1287 return false;
1288 if (!creator.newObject())
1289 return false;
1290 return true;
1291 }
1292 case GenerateFreshArrayTag: {
1293 if (m_version <= 0)
1294 return false;
1295 uint32_t length;
1296 if (!doReadUint32(&length))
1297 return false;
1298 if (!creator.newArray(length))
1299 return false;
1300 return true;
1301 }
1302 case MessagePortTag: {
1303 if (m_version <= 0)
1304 return false;
1305 uint32_t index;
1306 if (!doReadUint32(&index))
1307 return false;
1308 if (!creator.tryGetTransferredMessagePort(index, value))
1309 return false;
1310 break;
1311 }
1312 case ObjectReferenceTag: {
1313 if (m_version <= 0)
1314 return false;
1315 uint32_t reference;
1316 if (!doReadUint32(&reference))
1317 return false;
1318 if (!creator.tryGetObjectFromObjectReference(reference, value))
1319 return false;
1320 break;
1321 }
1322 default:
1323 return false;
1324 }
1325 return !value->IsEmpty();
1326 }
1327
1328 bool readVersion(uint32_t& version) 1319 bool readVersion(uint32_t& version)
1329 { 1320 {
1330 SerializationTag tag; 1321 SerializationTag tag;
1331 if (!readTag(&tag)) { 1322 if (!readTag(&tag)) {
1332 // This is a nullary buffer. We're still version 0. 1323 // This is a nullary buffer. We're still version 0.
1333 version = 0; 1324 version = 0;
1334 return true; 1325 return true;
1335 } 1326 }
1336 if (tag != VersionTag) { 1327 if (tag != VersionTag) {
1337 // Versions of the format past 0 start with the version tag. 1328 // Versions of the format past 0 start with the version tag.
1338 version = 0; 1329 version = 0;
1339 // Put back the tag. 1330 // Put back the tag.
1340 undoReadTag(); 1331 undoReadTag();
1341 return true; 1332 return true;
1342 } 1333 }
1343 // Version-bearing messages are obligated to finish the version tag. 1334 // Version-bearing messages are obligated to finish the version tag.
1344 return doReadUint32(&version); 1335 return doReadUint32(&version);
1345 } 1336 }
1346 1337
1347 void setVersion(uint32_t version)
1348 {
1349 m_version = version;
1350 }
1351
1352 private:
1353 bool readTag(SerializationTag* tag) 1338 bool readTag(SerializationTag* tag)
1354 { 1339 {
1355 if (m_position >= m_length) 1340 if (m_position >= m_length)
1356 return false; 1341 return false;
1357 *tag = static_cast<SerializationTag>(m_buffer[m_position++]); 1342 *tag = static_cast<SerializationTag>(m_buffer[m_position++]);
1358 return true; 1343 return true;
1359 } 1344 }
1360 1345
1361 void undoReadTag() 1346 void undoReadTag()
1362 { 1347 {
1363 if (m_position > 0) 1348 if (m_position > 0)
1364 --m_position; 1349 --m_position;
1365 } 1350 }
1366 1351
1367 bool readArrayBufferViewSubTag(ArrayBufferViewSubTag* tag) 1352 bool readArrayBufferViewSubTag(ArrayBufferViewSubTag* tag)
1368 { 1353 {
1369 if (m_position >= m_length) 1354 if (m_position >= m_length)
1370 return false; 1355 return false;
1371 *tag = static_cast<ArrayBufferViewSubTag>(m_buffer[m_position++]); 1356 *tag = static_cast<ArrayBufferViewSubTag>(m_buffer[m_position++]);
1372 return true; 1357 return true;
1373 } 1358 }
1374 1359
1375 bool readString(v8::Handle<v8::Value>* value) 1360 bool readString(ScriptValueDeserializer& deserializer)
1376 { 1361 {
1377 uint32_t length; 1362 uint32_t length;
1378 if (!doReadUint32(&length)) 1363 if (!doReadUint32(&length))
1379 return false; 1364 return false;
1380 if (m_position + length > m_length) 1365 if (m_position + length > m_length)
1381 return false; 1366 return false;
1382 *value = v8::String::New(reinterpret_cast<const char*>(m_buffer + m_posi tion), length); 1367 const char* data = reinterpret_cast<const char*>(m_buffer + m_position);
1383 m_position += length; 1368 m_position += length;
1369 return deserializer.pushScriptString(data, length);
1370 }
1371
1372 bool readStringObject(ScriptValueDeserializer& deserializer)
1373 {
1374 if (!readString(deserializer))
1375 return false;
1376 if (!deserializer.pushScriptStringObject())
1377 return false;
1378 deserializer.addReferenceForTop();
1384 return true; 1379 return true;
1385 } 1380 }
1386 1381
1387 bool readStringObject(v8::Handle<v8::Value>* value)
1388 {
1389 v8::Handle<v8::Value> stringValue;
1390 if (!readString(&stringValue) || !stringValue->IsString())
1391 return false;
1392 *value = v8::StringObject::New(stringValue.As<v8::String>());
1393 return true;
1394 }
1395
1396 bool readWebCoreString(String* string) 1382 bool readWebCoreString(String* string)
1397 { 1383 {
1398 uint32_t length; 1384 uint32_t length;
1399 if (!doReadUint32(&length)) 1385 if (!doReadUint32(&length))
1400 return false; 1386 return false;
1401 if (m_position + length > m_length) 1387 if (m_position + length > m_length)
1402 return false; 1388 return false;
1403 *string = String::fromUTF8(reinterpret_cast<const char*>(m_buffer + m_po sition), length); 1389 *string = String::fromUTF8(reinterpret_cast<const char*>(m_buffer + m_po sition), length);
1404 m_position += length; 1390 m_position += length;
1405 return true; 1391 return true;
1406 } 1392 }
1407 1393
1408 bool readInt32(v8::Handle<v8::Value>* value) 1394 bool readInt32(ScriptValueDeserializer& deserializer)
1409 { 1395 {
1410 uint32_t rawValue; 1396 uint32_t rawValue;
1411 if (!doReadUint32(&rawValue)) 1397 if (!doReadUint32(&rawValue))
1412 return false; 1398 return false;
1413 *value = v8::Integer::New(static_cast<int32_t>(ZigZag::decode(rawValue)) ); 1399 return deserializer.pushInt32(static_cast<int32_t>(ZigZag::decode(rawVal ue)));
1414 return true;
1415 } 1400 }
1416 1401
1417 bool readUint32(v8::Handle<v8::Value>* value) 1402 bool readUint32(ScriptValueDeserializer& deserializer)
1418 { 1403 {
1419 uint32_t rawValue; 1404 uint32_t rawValue;
1420 if (!doReadUint32(&rawValue)) 1405 if (!doReadUint32(&rawValue))
1421 return false; 1406 return false;
1422 *value = v8::Integer::NewFromUnsigned(rawValue); 1407 return deserializer.pushUInt32(rawValue);
1423 return true;
1424 } 1408 }
1425 1409
1426 bool readDate(v8::Handle<v8::Value>* value) 1410 bool readDate(ScriptValueDeserializer& deserializer)
1427 { 1411 {
1428 double numberValue; 1412 double numberValue;
1429 if (!doReadNumber(&numberValue)) 1413 if (!doReadNumber(&numberValue))
1430 return false; 1414 return false;
1431 *value = v8::Date::New(numberValue); 1415 if (!deserializer.pushDate(numberValue))
1416 return false;
1417 deserializer.addReferenceForTop();
1432 return true; 1418 return true;
1433 } 1419 }
1434 1420
1435 bool readNumber(v8::Handle<v8::Value>* value) 1421 bool readNumber(ScriptValueDeserializer& deserializer)
1436 { 1422 {
1437 double number; 1423 double number;
1438 if (!doReadNumber(&number)) 1424 if (!doReadNumber(&number))
1439 return false; 1425 return false;
1440 *value = v8::Number::New(number); 1426 return deserializer.pushNumber(number);
1441 return true;
1442 } 1427 }
1443 1428
1444 bool readNumberObject(v8::Handle<v8::Value>* value) 1429 bool readNumberObject(ScriptValueDeserializer& deserializer)
1445 { 1430 {
1446 double number; 1431 double number;
1447 if (!doReadNumber(&number)) 1432 if (!doReadNumber(&number))
1448 return false; 1433 return false;
1449 *value = v8::NumberObject::New(number); 1434 if (!deserializer.pushNumberObject(number))
1435 return false;
1436 deserializer.addReferenceForTop();
1450 return true; 1437 return true;
1451 } 1438 }
1452 1439
1453 bool readImageData(v8::Handle<v8::Value>* value) 1440 bool readImageData(ScriptValueDeserializer& deserializer)
1454 { 1441 {
1455 uint32_t width; 1442 uint32_t width;
1456 uint32_t height; 1443 uint32_t height;
1457 uint32_t pixelDataLength; 1444 uint32_t pixelDataLength;
1458 if (!doReadUint32(&width)) 1445 if (!doReadUint32(&width))
1459 return false; 1446 return false;
1460 if (!doReadUint32(&height)) 1447 if (!doReadUint32(&height))
1461 return false; 1448 return false;
1462 if (!doReadUint32(&pixelDataLength)) 1449 if (!doReadUint32(&pixelDataLength))
1463 return false; 1450 return false;
1464 if (m_position + pixelDataLength > m_length) 1451 if (m_position + pixelDataLength > m_length)
1465 return false; 1452 return false;
1466 RefPtr<ImageData> imageData = ImageData::create(IntSize(width, height)); 1453 RefPtr<ImageData> imageData = ImageData::create(IntSize(width, height));
1467 WTF::ByteArray* pixelArray = imageData->data()->data(); 1454 WTF::ByteArray* pixelArray = imageData->data()->data();
1468 ASSERT(pixelArray); 1455 ASSERT(pixelArray);
1469 ASSERT(pixelArray->length() >= pixelDataLength); 1456 ASSERT(pixelArray->length() >= pixelDataLength);
1470 memcpy(pixelArray->data(), m_buffer + m_position, pixelDataLength); 1457 memcpy(pixelArray->data(), m_buffer + m_position, pixelDataLength);
1471 m_position += pixelDataLength; 1458 m_position += pixelDataLength;
1472 *value = toV8(imageData.release()); 1459 if (!deserializer.pushImageData(imageData))
1460 return false;
1461 deserializer.addReferenceForTop();
1473 return true; 1462 return true;
1474 } 1463 }
1475 1464
1476 PassRefPtr<ArrayBuffer> doReadArrayBuffer() 1465 PassRefPtr<ArrayBuffer> doReadArrayBuffer()
1477 { 1466 {
1478 uint32_t byteLength; 1467 uint32_t byteLength;
1479 if (!doReadUint32(&byteLength)) 1468 if (!doReadUint32(&byteLength))
1480 return 0; 1469 return 0;
1481 if (m_position + byteLength > m_length) 1470 if (m_position + byteLength > m_length)
1482 return 0; 1471 return 0;
1483 const void* bufferStart = m_buffer + m_position; 1472 const void* bufferStart = m_buffer + m_position;
1484 RefPtr<ArrayBuffer> arrayBuffer = ArrayBuffer::create(bufferStart, byteL ength); 1473 RefPtr<ArrayBuffer> arrayBuffer = ArrayBuffer::create(bufferStart, byteL ength);
1485 m_position += byteLength; 1474 m_position += byteLength;
1486 return arrayBuffer.release(); 1475 return arrayBuffer.release();
1487 } 1476 }
1488 1477
1489 bool readArrayBuffer(v8::Handle<v8::Value>* value) 1478 bool readArrayBuffer(ScriptValueDeserializer& deserializer)
1490 { 1479 {
1491 RefPtr<ArrayBuffer> arrayBuffer = doReadArrayBuffer(); 1480 RefPtr<ArrayBuffer> arrayBuffer = doReadArrayBuffer();
1492 if (!arrayBuffer) 1481 if (!arrayBuffer)
1493 return false; 1482 return false;
1494 *value = toV8(arrayBuffer.release()); 1483 if (!deserializer.pushArrayBuffer(arrayBuffer))
1484 return false;
1485 deserializer.addReferenceForTop();
1495 return true; 1486 return true;
1496 } 1487 }
1497 1488
1498 bool readArrayBufferView(v8::Handle<v8::Value>* value, CompositeCreator& cre ator) 1489 bool readArrayBufferView(ScriptValueDeserializer& deserializer)
1499 { 1490 {
1500 ArrayBufferViewSubTag subTag; 1491 ArrayBufferViewSubTag subTag;
1501 uint32_t byteOffset; 1492 uint32_t byteOffset;
1502 uint32_t byteLength; 1493 uint32_t byteLength;
1503 RefPtr<ArrayBuffer> arrayBuffer; 1494 RefPtr<ArrayBuffer> arrayBuffer;
1504 v8::Handle<v8::Value> arrayBufferV8Value;
1505 if (!readArrayBufferViewSubTag(&subTag)) 1495 if (!readArrayBufferViewSubTag(&subTag))
1506 return false; 1496 return false;
1507 if (!doReadUint32(&byteOffset)) 1497 if (!doReadUint32(&byteOffset))
1508 return false; 1498 return false;
1509 if (!doReadUint32(&byteLength)) 1499 if (!doReadUint32(&byteLength))
1510 return false; 1500 return false;
1511 if (!creator.consumeTopOfStack(&arrayBufferV8Value))
1512 return false;
1513 arrayBuffer = V8ArrayBuffer::toNative(arrayBufferV8Value.As<v8::Object>( ));
1514 if (!arrayBuffer)
1515 return false;
1516 switch (subTag) { 1501 switch (subTag) {
1517 case ByteArrayTag: 1502 case ByteArrayTag:
1518 *value = toV8(Int8Array::create(arrayBuffer.release(), byteOffset, b yteLength)); 1503 if (!deserializer.pushInt8Array(byteOffset, byteLength))
1519 break; 1504 return false;
1505 deserializer.addReferenceForTop();
1506 return true;
1520 case UnsignedByteArrayTag: 1507 case UnsignedByteArrayTag:
1521 *value = toV8(Uint8Array::create(arrayBuffer.release(), byteOffset, byteLength)); 1508 return deserializer.pushUint8Array(byteOffset, byteLength);
1522 break;
1523 case ShortArrayTag: { 1509 case ShortArrayTag: {
1524 uint32_t shortLength = byteLength / sizeof(int16_t); 1510 uint32_t shortLength = byteLength / sizeof(int16_t);
1525 if (shortLength * sizeof(int16_t) != byteLength) 1511 if (shortLength * sizeof(int16_t) != byteLength)
1526 return false; 1512 return false;
1527 *value = toV8(Int16Array::create(arrayBuffer.release(), byteOffset, shortLength)); 1513 if (!deserializer.pushInt16Array(byteOffset, byteLength))
1528 break; 1514 return false;
1515 deserializer.addReferenceForTop();
1516 return true;
1529 } 1517 }
1530 case UnsignedShortArrayTag: { 1518 case UnsignedShortArrayTag: {
1531 uint32_t shortLength = byteLength / sizeof(uint16_t); 1519 uint32_t shortLength = byteLength / sizeof(uint16_t);
1532 if (shortLength * sizeof(uint16_t) != byteLength) 1520 if (shortLength * sizeof(uint16_t) != byteLength)
1533 return false; 1521 return false;
1534 *value = toV8(Uint16Array::create(arrayBuffer.release(), byteOffset, shortLength)); 1522 if (!deserializer.pushUint16Array(byteOffset, byteLength))
1535 break; 1523 return false;
1524 deserializer.addReferenceForTop();
1525 return true;
1536 } 1526 }
1537 case IntArrayTag: { 1527 case IntArrayTag: {
1538 uint32_t intLength = byteLength / sizeof(int32_t); 1528 uint32_t intLength = byteLength / sizeof(int32_t);
1539 if (intLength * sizeof(int32_t) != byteLength) 1529 if (intLength * sizeof(int32_t) != byteLength)
1540 return false; 1530 return false;
1541 *value = toV8(Int32Array::create(arrayBuffer.release(), byteOffset, intLength)); 1531 if (!deserializer.pushInt32Array(byteOffset, byteLength))
1542 break; 1532 return false;
1533 deserializer.addReferenceForTop();
1534 return true;
1543 } 1535 }
1544 case UnsignedIntArrayTag: { 1536 case UnsignedIntArrayTag: {
1545 uint32_t intLength = byteLength / sizeof(uint32_t); 1537 uint32_t intLength = byteLength / sizeof(uint32_t);
1546 if (intLength * sizeof(uint32_t) != byteLength) 1538 if (intLength * sizeof(uint32_t) != byteLength)
1547 return false; 1539 return false;
1548 *value = toV8(Uint32Array::create(arrayBuffer.release(), byteOffset, intLength)); 1540 if (!deserializer.pushUint32Array(byteOffset, byteLength))
1549 break; 1541 return false;
1542 deserializer.addReferenceForTop();
1543 return true;
1550 } 1544 }
1551 case FloatArrayTag: { 1545 case FloatArrayTag: {
1552 uint32_t floatLength = byteLength / sizeof(float); 1546 uint32_t floatLength = byteLength / sizeof(float);
1553 if (floatLength * sizeof(float) != byteLength) 1547 if (floatLength * sizeof(float) != byteLength)
1554 return false; 1548 return false;
1555 *value = toV8(Float32Array::create(arrayBuffer.release(), byteOffset , floatLength)); 1549 if (!deserializer.pushFloat32Array(byteOffset, byteLength))
1556 break; 1550 return false;
1551 deserializer.addReferenceForTop();
1552 return true;
1557 } 1553 }
1558 case DoubleArrayTag: { 1554 case DoubleArrayTag: {
1559 uint32_t floatLength = byteLength / sizeof(double); 1555 uint32_t floatLength = byteLength / sizeof(double);
1560 if (floatLength * sizeof(double) != byteLength) 1556 if (floatLength * sizeof(double) != byteLength)
1561 return false; 1557 return false;
1562 *value = toV8(Float64Array::create(arrayBuffer.release(), byteOffset , floatLength)); 1558 if (!deserializer.pushFloat64Array(byteOffset, byteLength))
1563 break; 1559 return false;
1560 deserializer.addReferenceForTop();
1561 return true;
1564 } 1562 }
1565 case DataViewTag: 1563 case DataViewTag:
1566 *value = toV8(DataView::create(arrayBuffer.release(), byteOffset, by teLength)); 1564 if (!deserializer.pushDataView(byteOffset, byteLength))
1567 break; 1565 return false;
1566 deserializer.addReferenceForTop();
1567 return true;
1568 default: 1568 default:
1569 return false; 1569 return false;
1570 } 1570 }
1571 // The various *Array::create() methods will return null if the range th e view expects is
1572 // mismatched with the range the buffer can provide or if the byte offse t is not aligned
1573 // to the size of the element type.
1574 return !value->IsEmpty();
1575 } 1571 }
1576 1572
1577 bool readRegExp(v8::Handle<v8::Value>* value) 1573 bool readRegExp(ScriptValueDeserializer& deserializer)
1578 { 1574 {
1579 v8::Handle<v8::Value> pattern; 1575 if (!readString(deserializer))
1580 if (!readString(&pattern))
1581 return false; 1576 return false;
1582 uint32_t flags; 1577 uint32_t flags;
1583 if (!doReadUint32(&flags)) 1578 if (!doReadUint32(&flags))
1584 return false; 1579 return false;
1585 *value = v8::RegExp::New(pattern.As<v8::String>(), static_cast<v8::RegEx p::Flags>(flags)); 1580 if (!deserializer.pushRegExp(flags))
1581 return false;
1582 deserializer.addReferenceForTop();
1586 return true; 1583 return true;
1587 } 1584 }
1588 1585
1589 bool readBlob(v8::Handle<v8::Value>* value) 1586 bool readBlob(ScriptValueDeserializer& deserializer)
1590 { 1587 {
1591 String url; 1588 String url;
1592 String type; 1589 String type;
1593 uint64_t size; 1590 uint64_t size;
1594 if (!readWebCoreString(&url)) 1591 if (!readWebCoreString(&url))
1595 return false; 1592 return false;
1596 if (!readWebCoreString(&type)) 1593 if (!readWebCoreString(&type))
1597 return false; 1594 return false;
1598 if (!doReadUint64(&size)) 1595 if (!doReadUint64(&size))
1599 return false; 1596 return false;
1600 PassRefPtr<Blob> blob = Blob::create(KURL(ParsedURLString, url), type, s ize); 1597 if (!deserializer.pushBlob(Blob::create(KURL(ParsedURLString, url), type , size)))
1601 *value = toV8(blob); 1598 return false;
1599 deserializer.addReferenceForTop();
1602 return true; 1600 return true;
1603 } 1601 }
1604 1602
1605 bool readFile(v8::Handle<v8::Value>* value) 1603 bool readFile(ScriptValueDeserializer& deserializer)
1606 { 1604 {
1607 String path; 1605 String path;
1608 String url; 1606 String url;
1609 String type; 1607 String type;
1610 if (!readWebCoreString(&path)) 1608 if (!readWebCoreString(&path))
1611 return false; 1609 return false;
1612 if (!readWebCoreString(&url)) 1610 if (!readWebCoreString(&url))
1613 return false; 1611 return false;
1614 if (!readWebCoreString(&type)) 1612 if (!readWebCoreString(&type))
1615 return false; 1613 return false;
1616 PassRefPtr<File> file = File::create(path, KURL(ParsedURLString, url), t ype); 1614 if (!deserializer.pushFile(File::create(path, KURL(ParsedURLString, url) , type)))
1617 *value = toV8(file); 1615 return false;
1616 deserializer.addReferenceForTop();
1618 return true; 1617 return true;
1619 } 1618 }
1620 1619
1621 bool readFileList(v8::Handle<v8::Value>* value) 1620 bool readFileList(ScriptValueDeserializer& deserializer)
1622 { 1621 {
1623 uint32_t length; 1622 uint32_t length;
1624 if (!doReadUint32(&length)) 1623 if (!doReadUint32(&length))
1625 return false; 1624 return false;
1626 PassRefPtr<FileList> fileList = FileList::create(); 1625 RefPtr<FileList> fileList = FileList::create();
1627 for (unsigned i = 0; i < length; ++i) { 1626 for (unsigned i = 0; i < length; ++i) {
1628 String path; 1627 String path;
1629 String urlString; 1628 String urlString;
1630 String type; 1629 String type;
1631 if (!readWebCoreString(&path)) 1630 if (!readWebCoreString(&path))
1632 return false; 1631 return false;
1633 if (!readWebCoreString(&urlString)) 1632 if (!readWebCoreString(&urlString))
1634 return false; 1633 return false;
1635 if (!readWebCoreString(&type)) 1634 if (!readWebCoreString(&type))
1636 return false; 1635 return false;
1637 fileList->append(File::create(path, KURL(ParsedURLString, urlString) , type)); 1636 fileList->append(File::create(path, KURL(ParsedURLString, urlString) , type));
1638 } 1637 }
1639 *value = toV8(fileList); 1638 if (!deserializer.pushFileList(fileList))
1639 return false;
1640 deserializer.addReferenceForTop();
1640 return true; 1641 return true;
1641 } 1642 }
1642 1643
1643 template<class T> 1644 template<class T>
1644 bool doReadUintHelper(T* value) 1645 bool doReadUintHelper(T* value)
1645 { 1646 {
1646 *value = 0; 1647 *value = 0;
1647 uint8_t currentByte; 1648 uint8_t currentByte;
1648 int shift = 0; 1649 int shift = 0;
1649 do { 1650 do {
(...skipping 25 matching lines...) Expand all
1675 numberAsByteArray[i] = m_buffer[m_position++]; 1676 numberAsByteArray[i] = m_buffer[m_position++];
1676 return true; 1677 return true;
1677 } 1678 }
1678 1679
1679 const uint8_t* m_buffer; 1680 const uint8_t* m_buffer;
1680 const unsigned m_length; 1681 const unsigned m_length;
1681 unsigned m_position; 1682 unsigned m_position;
1682 uint32_t m_version; 1683 uint32_t m_version;
1683 }; 1684 };
1684 1685
1685 class Deserializer : public CompositeCreator { 1686 class V8Deserializer : public ScriptValueDeserializer {
1686 public: 1687 public:
1687 explicit Deserializer(Reader& reader, MessagePortArray* messagePorts) 1688 explicit V8Deserializer(Reader& reader, MessagePortArray* messagePorts)
1688 : m_reader(reader) 1689 : m_reader(reader)
1689 , m_transferredMessagePorts(messagePorts) 1690 , m_transferredMessagePorts(messagePorts)
1690 , m_version(0) 1691 , m_version(0)
1691 { 1692 {
1692 } 1693 }
1693 1694
1694 v8::Handle<v8::Value> deserialize() 1695 v8::Handle<v8::Value> deserialize()
1695 { 1696 {
1696 if (!m_reader.readVersion(m_version) || m_version > wireFormatVersion) 1697 v8::HandleScope scope;
1698 if (!m_reader.read(*this))
1697 return v8::Null(); 1699 return v8::Null();
1698 m_reader.setVersion(m_version);
1699 v8::HandleScope scope;
1700 while (!m_reader.isEof()) {
1701 if (!doDeserialize())
1702 return v8::Null();
1703 }
1704 if (stackDepth() != 1 || m_openCompositeReferenceStack.size()) 1700 if (stackDepth() != 1 || m_openCompositeReferenceStack.size())
1705 return v8::Null(); 1701 return v8::Null();
1706 v8::Handle<v8::Value> result = scope.Close(element(0)); 1702 return scope.Close(element(0));
1707 return result;
1708 } 1703 }
1709 1704
1710 virtual bool newArray(uint32_t length) 1705 virtual bool newArray(uint32_t length)
1711 { 1706 {
1712 v8::Local<v8::Array> array = v8::Array::New(length); 1707 v8::Local<v8::Array> array = v8::Array::New(length);
1713 if (array.IsEmpty()) 1708 if (array.IsEmpty())
1714 return false; 1709 return false;
1715 openComposite(array); 1710 openComposite(array);
1716 return true; 1711 return true;
1717 } 1712 }
1718 1713
1719 virtual bool consumeTopOfStack(v8::Handle<v8::Value>* object) 1714 virtual bool newObject()
1715 {
1716 v8::Local<v8::Object> object = v8::Object::New();
1717 if (object.IsEmpty())
1718 return false;
1719 openComposite(object);
1720 return true;
1721 }
1722
1723 virtual bool tryGetObjectFromObjectReference(uint32_t reference)
1724 {
1725 if (reference >= m_objectPool.size())
1726 return false;
1727 v8::Handle<v8::Value> value = m_objectPool[reference];
1728 ASSERT(!value.IsEmpty());
1729 return push(value);
1730 }
1731
1732 virtual bool tryGetTransferredMessagePort(uint32_t index, v8::Handle<v8::Val ue>* object)
1733 {
1734 if (!m_transferredMessagePorts)
1735 return false;
1736 if (index >= m_transferredMessagePorts->size())
1737 return false;
1738 *object = V8MessagePort::wrap(m_transferredMessagePorts->at(index).get() );
1739 return true;
1740 }
1741
1742 virtual uint32_t objectReferenceCount()
1743 {
1744 return m_objectPool.size();
1745 }
1746
1747 virtual void addReferenceForTop()
1748 {
1749 ASSERT(stackDepth() > 0);
1750 v8::Handle<v8::Value> value = element(stackDepth() - 1);
1751 ASSERT(!value.IsEmpty());
1752 m_objectPool.append(value);
1753 }
1754
1755
1756 virtual bool pushUndefined() { return push(v8::Undefined()); }
1757 virtual bool pushNull() { return push(v8::Null()); }
1758 virtual bool pushTrue() { return push(v8::True()); }
1759 virtual bool pushTrueObject() { return push(v8::BooleanObject::New(true)); }
1760 virtual bool pushFalse() { return push(v8::False()); }
1761 virtual bool pushFalseObject() { return push(v8::BooleanObject::New(false)); }
1762 virtual bool pushScriptString(const char* data, uint32_t length) { return pu sh(v8::String::New(data, length)); }
1763 virtual bool pushScriptStringObject()
1720 { 1764 {
1721 if (stackDepth() < 1) 1765 if (stackDepth() < 1)
1722 return false; 1766 return false;
1723 *object = element(stackDepth() - 1); 1767 v8::Handle<v8::Value> string = popValue();
1724 pop(1); 1768 return push(v8::StringObject::New(string.As<v8::String>()));
1725 return true;
1726 } 1769 }
1770 virtual bool pushInt32(int32_t value) { return push(v8::Integer::New(value)) ; }
1771 virtual bool pushUInt32(uint32_t value) { return push(v8::Integer::NewFromUn signed(value)); }
1772 virtual bool pushDate(double numberValue) { return push(v8::Date::New(number Value)); }
1773 virtual bool pushNumber(double value) { return push(v8::Number::New(value)); }
1774 virtual bool pushNumberObject(double value) { return push(v8::NumberObject:: New(value)); }
1775 virtual bool pushBlob(PassRefPtr<Blob> blob) { return push(toV8(blob)); }
1776 virtual bool pushFile(PassRefPtr<File> file) { return push(toV8(file)); }
1777 virtual bool pushFileList(PassRefPtr<FileList> fileList) { return push(toV8( fileList)); }
1778 virtual bool pushImageData(PassRefPtr<ImageData> imageData) { return push(to V8(imageData)); }
1727 1779
1728 virtual bool completeArray(uint32_t length, v8::Handle<v8::Value>* value) 1780 virtual bool pushArray(uint32_t length)
1729 { 1781 {
1730 if (length > stackDepth()) 1782 if (length > stackDepth())
1731 return false; 1783 return false;
1732 v8::Local<v8::Array> array; 1784 v8::Local<v8::Array> array;
1733 if (m_version > 0) { 1785 if (m_reader.version() > 0) {
1734 v8::Local<v8::Value> composite; 1786 v8::Local<v8::Value> composite;
1735 if (!closeComposite(&composite)) 1787 if (!closeComposite(&composite))
1736 return false; 1788 return false;
1737 array = composite.As<v8::Array>(); 1789 array = composite.As<v8::Array>();
1738 } else 1790 } else
1739 array = v8::Array::New(length); 1791 array = v8::Array::New(length);
1740 if (array.IsEmpty()) 1792 if (array.IsEmpty())
1741 return false; 1793 return false;
1742 const int depth = stackDepth() - length; 1794 const int depth = stackDepth() - length;
1743 // The V8 API ensures space exists for any index argument to Set; it wil l (eg) resize arrays as necessary. 1795 // The V8 API ensures space exists for any index argument to Set; it wil l (eg) resize arrays as necessary.
1744 for (unsigned i = 0; i < length; ++i) 1796 for (unsigned i = 0; i < length; ++i)
1745 array->Set(i, element(depth + i)); 1797 array->Set(i, element(depth + i));
1746 pop(length); 1798 pop(length);
1747 *value = array; 1799 return push(array);
1748 return true;
1749 } 1800 }
1750 1801
1751 virtual bool newObject() 1802 virtual bool pushRegExp(uint32_t flags)
1752 { 1803 {
1753 v8::Local<v8::Object> object = v8::Object::New(); 1804 if (stackDepth() < 1)
1754 if (object.IsEmpty())
1755 return false; 1805 return false;
1756 openComposite(object); 1806 v8::Handle<v8::Value> pattern = popValue();
1757 return true; 1807 return push(v8::RegExp::New(pattern.As<v8::String>(), static_cast<v8::Re gExp::Flags>(flags)));
1758 } 1808 }
1759 1809
1760 virtual bool completeObject(uint32_t numProperties, v8::Handle<v8::Value>* v alue) 1810 virtual bool pushObject(uint32_t numProperties)
1761 { 1811 {
1762 v8::Local<v8::Object> object; 1812 v8::Local<v8::Object> object;
1763 if (m_version > 0) { 1813 if (m_reader.version() > 0) {
1764 v8::Local<v8::Value> composite; 1814 v8::Local<v8::Value> composite;
1765 if (!closeComposite(&composite)) 1815 if (!closeComposite(&composite))
1766 return false; 1816 return false;
1767 object = composite.As<v8::Object>(); 1817 object = composite.As<v8::Object>();
1768 } else 1818 } else
1769 object = v8::Object::New(); 1819 object = v8::Object::New();
1770 if (object.IsEmpty()) 1820 if (object.IsEmpty())
1771 return false; 1821 return false;
1772 return initializeObject(object, numProperties, value); 1822 return initializeObject(object, numProperties);
1773 } 1823 }
1774 1824
1775 virtual bool completeSparseArray(uint32_t numProperties, uint32_t length, v8 ::Handle<v8::Value>* value) 1825 virtual bool pushSparseArray(uint32_t numProperties, uint32_t length)
1776 { 1826 {
1777 v8::Local<v8::Array> array; 1827 v8::Local<v8::Array> array;
1778 if (m_version > 0) { 1828 if (m_reader.version() > 0) {
1779 v8::Local<v8::Value> composite; 1829 v8::Local<v8::Value> composite;
1780 if (!closeComposite(&composite)) 1830 if (!closeComposite(&composite))
1781 return false; 1831 return false;
1782 array = composite.As<v8::Array>(); 1832 array = composite.As<v8::Array>();
1783 } else 1833 } else
1784 array = v8::Array::New(length); 1834 array = v8::Array::New(length);
1785 if (array.IsEmpty()) 1835 if (array.IsEmpty())
1786 return false; 1836 return false;
1787 return initializeObject(array, numProperties, value); 1837 return initializeObject(array, numProperties);
1788 } 1838 }
1789 1839
1790 virtual void pushObjectReference(const v8::Handle<v8::Value>& object) 1840 virtual bool pushInt8Array(uint32_t byteOffset, uint32_t byteLength) { retur n pushTypedArray<Int8Array>(byteOffset, byteLength); }
1841 virtual bool pushUint8Array(uint32_t byteOffset, uint32_t byteLength) { retu rn pushTypedArray<Uint8Array>(byteOffset, byteLength); }
1842 virtual bool pushInt16Array(uint32_t byteOffset, uint32_t byteLength) { retu rn pushTypedArray<Int16Array>(byteOffset, byteLength); }
1843 virtual bool pushUint16Array(uint32_t byteOffset, uint32_t byteLength) { ret urn pushTypedArray<Uint16Array>(byteOffset, byteLength); }
1844 virtual bool pushInt32Array(uint32_t byteOffset, uint32_t byteLength) { retu rn pushTypedArray<Int32Array>(byteOffset, byteLength); }
1845 virtual bool pushUint32Array(uint32_t byteOffset, uint32_t byteLength) { ret urn pushTypedArray<Uint32Array>(byteOffset, byteLength); }
1846 virtual bool pushFloat32Array(uint32_t byteOffset, uint32_t byteLength) { re turn pushTypedArray<Float32Array>(byteOffset, byteLength); }
1847 virtual bool pushFloat64Array(uint32_t byteOffset, uint32_t byteLength) { re turn pushTypedArray<Float64Array>(byteOffset, byteLength); }
1848 virtual bool pushDataView(uint32_t byteOffset, uint32_t byteLength) { return pushTypedArray<DataView>(byteOffset, byteLength); }
1849 virtual bool pushArrayBuffer(PassRefPtr<ArrayBuffer> arrayBuffer) { return p ush(toV8(arrayBuffer)); }
1850
1851 private:
1852 template <class C>
1853 bool pushTypedArray(uint32_t byteOffset, uint32_t byteLength)
1791 { 1854 {
1792 m_objectPool.append(object); 1855 if (stackDepth() < 1)
1856 return false;
1857 RefPtr<ArrayBuffer> arrayBuffer = V8ArrayBuffer::toNative(popValue().As< v8::Object>());
1858 if (!arrayBuffer)
1859 return false;
1860
1861 // The various *Array::create() methods will return null if the range th e view expects is
1862 // mismatched with the range the buffer can provide or if the byte offse t is not aligned
1863 // to the size of the element type.
1864 return push(toV8(C::create(arrayBuffer.release(), byteOffset, byteLength )));
1793 } 1865 }
1794 1866
1795 virtual bool tryGetTransferredMessagePort(uint32_t index, v8::Handle<v8::Val ue>* object) 1867 bool initializeObject(v8::Handle<v8::Object> object, uint32_t numProperties)
1796 { 1868 {
1797 if (!m_transferredMessagePorts) 1869 ASSERT(!object.IsEmpty());
1798 return false;
1799 if (index >= m_transferredMessagePorts->size())
1800 return false;
1801 *object = V8MessagePort::wrap(m_transferredMessagePorts->at(index).get() );
1802 return true;
1803 }
1804
1805 virtual bool tryGetObjectFromObjectReference(uint32_t reference, v8::Handle< v8::Value>* object)
1806 {
1807 if (reference >= m_objectPool.size())
1808 return false;
1809 *object = m_objectPool[reference];
1810 return object;
1811 }
1812
1813 virtual uint32_t objectReferenceCount()
1814 {
1815 return m_objectPool.size();
1816 }
1817
1818 private:
1819 bool initializeObject(v8::Handle<v8::Object> object, uint32_t numProperties, v8::Handle<v8::Value>* value)
1820 {
1821 unsigned length = 2 * numProperties; 1870 unsigned length = 2 * numProperties;
1822 if (length > stackDepth()) 1871 if (length > stackDepth())
1823 return false; 1872 return false;
1824 for (unsigned i = stackDepth() - length; i < stackDepth(); i += 2) { 1873 for (unsigned i = stackDepth() - length; i < stackDepth(); i += 2) {
1825 v8::Local<v8::Value> propertyName = element(i); 1874 v8::Handle<v8::Value> propertyName = element(i);
1826 v8::Local<v8::Value> propertyValue = element(i + 1); 1875 v8::Handle<v8::Value> propertyValue = element(i + 1);
1827 object->Set(propertyName, propertyValue); 1876 object->Set(propertyName, propertyValue);
1828 } 1877 }
1829 pop(length); 1878 pop(length);
1830 *value = object; 1879 return push(object);
1880 }
1881
1882 bool push(v8::Handle<v8::Value> value)
1883 {
1884 if (value.IsEmpty())
1885 return false;
1886 m_stack.append(value);
1831 return true; 1887 return true;
1832 } 1888 }
1833 1889
1834 bool doDeserialize()
1835 {
1836 v8::Local<v8::Value> value;
1837 if (!m_reader.read(&value, *this))
1838 return false;
1839 if (!value.IsEmpty())
1840 push(value);
1841 return true;
1842 }
1843
1844 void push(v8::Local<v8::Value> value) { m_stack.append(value); }
1845
1846 void pop(unsigned length) 1890 void pop(unsigned length)
1847 { 1891 {
1848 ASSERT(length <= m_stack.size()); 1892 ASSERT(length <= m_stack.size());
1849 m_stack.shrink(m_stack.size() - length); 1893 m_stack.shrink(m_stack.size() - length);
1850 } 1894 }
1851 1895
1896 v8::Handle<v8::Value> popValue()
1897 {
1898 ASSERT(stackDepth() >= 1);
1899 v8::Handle<v8::Value> top = element(stackDepth() - 1);
1900 pop(1);
1901 return top;
1902 }
1903
1852 unsigned stackDepth() const { return m_stack.size(); } 1904 unsigned stackDepth() const { return m_stack.size(); }
1853 1905
1854 v8::Local<v8::Value> element(unsigned index) 1906 v8::Handle<v8::Value> element(unsigned index)
1855 { 1907 {
1856 ASSERT(index < m_stack.size()); 1908 ASSERT(index < m_stack.size());
1857 return m_stack[index]; 1909 return m_stack[index];
1858 } 1910 }
1859 1911
1860 void openComposite(const v8::Local<v8::Value>& object) 1912 void openComposite(const v8::Local<v8::Value>& object)
1861 { 1913 {
1862 uint32_t newObjectReference = m_objectPool.size(); 1914 uint32_t newObjectReference = m_objectPool.size();
1863 m_openCompositeReferenceStack.append(newObjectReference); 1915 m_openCompositeReferenceStack.append(newObjectReference);
1864 m_objectPool.append(object); 1916 m_objectPool.append(object);
1865 } 1917 }
1866 1918
1867 bool closeComposite(v8::Handle<v8::Value>* object) 1919 bool closeComposite(v8::Handle<v8::Value>* object)
1868 { 1920 {
1869 if (!m_openCompositeReferenceStack.size()) 1921 if (!m_openCompositeReferenceStack.size())
1870 return false; 1922 return false;
1871 uint32_t objectReference = m_openCompositeReferenceStack[m_openComposite ReferenceStack.size() - 1]; 1923 uint32_t objectReference = m_openCompositeReferenceStack[m_openComposite ReferenceStack.size() - 1];
1872 m_openCompositeReferenceStack.shrink(m_openCompositeReferenceStack.size( ) - 1); 1924 m_openCompositeReferenceStack.shrink(m_openCompositeReferenceStack.size( ) - 1);
1873 if (objectReference >= m_objectPool.size()) 1925 if (objectReference >= m_objectPool.size())
1874 return false; 1926 return false;
1875 *object = m_objectPool[objectReference]; 1927 *object = m_objectPool[objectReference];
1876 return true; 1928 return true;
1877 } 1929 }
1878 1930
1879 Reader& m_reader; 1931 Reader& m_reader;
1880 Vector<v8::Local<v8::Value> > m_stack; 1932 Vector<v8::Handle<v8::Value> > m_stack;
1881 Vector<v8::Handle<v8::Value> > m_objectPool; 1933 Vector<v8::Handle<v8::Value> > m_objectPool;
1882 Vector<uint32_t> m_openCompositeReferenceStack; 1934 Vector<uint32_t> m_openCompositeReferenceStack;
1883 MessagePortArray* m_transferredMessagePorts; 1935 MessagePortArray* m_transferredMessagePorts;
1884 uint32_t m_version; 1936 uint32_t m_version;
1885 }; 1937 };
1886 1938
1887 } // namespace 1939 } // namespace
1888 void SerializedScriptValue::deserializeAndSetProperty(v8::Handle<v8::Object> obj ect, const char* propertyName, 1940 void SerializedScriptValue::deserializeAndSetProperty(v8::Handle<v8::Object> obj ect, const char* propertyName,
1889 v8::PropertyAttribute attr ibute, SerializedScriptValue* value) 1941 v8::PropertyAttribute attr ibute, SerializedScriptValue* value)
1890 { 1942 {
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
2008 { 2060 {
2009 m_data = wireData.isolatedCopy(); 2061 m_data = wireData.isolatedCopy();
2010 } 2062 }
2011 2063
2012 v8::Handle<v8::Value> SerializedScriptValue::deserialize(MessagePortArray* messa gePorts) 2064 v8::Handle<v8::Value> SerializedScriptValue::deserialize(MessagePortArray* messa gePorts)
2013 { 2065 {
2014 if (!m_data.impl()) 2066 if (!m_data.impl())
2015 return v8::Null(); 2067 return v8::Null();
2016 COMPILE_ASSERT(sizeof(BufferValueType) == 2, BufferValueTypeIsTwoBytes); 2068 COMPILE_ASSERT(sizeof(BufferValueType) == 2, BufferValueTypeIsTwoBytes);
2017 Reader reader(reinterpret_cast<const uint8_t*>(m_data.impl()->characters()), 2 * m_data.length()); 2069 Reader reader(reinterpret_cast<const uint8_t*>(m_data.impl()->characters()), 2 * m_data.length());
2018 Deserializer deserializer(reader, messagePorts); 2070 V8Deserializer deserializer(reader, messagePorts);
2019 return deserializer.deserialize(); 2071 return deserializer.deserialize();
2020 } 2072 }
2021 2073
2074 PassRefPtr<SerializedScriptValue> SerializedScriptValue::create(ScriptValueSeria lizer* serializer)
2075 {
2076 Writer writer;
2077 serializer->serialize(&writer);
2078 return adoptRef(new SerializedScriptValue(StringImpl::adopt(writer.data()))) ;
2079 }
2080
2081 bool SerializedScriptValue::deserialize(ScriptValueDeserializer* deserializer)
2082 {
2083 if (!m_data.impl())
2084 return false;
2085 COMPILE_ASSERT(sizeof(BufferValueType) == 2, BufferValueTypeIsTwoBytes);
2086 Reader reader(reinterpret_cast<const uint8_t*>(m_data.impl()->characters()), 2 * m_data.length());
2087 return reader.read(*deserializer);
2088 }
2089
2022 } // namespace WebCore 2090 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698