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

Side by Side Diff: src/serialize.h

Issue 373713006: Introduce code serializer/deserializer. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 5 months 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 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef V8_SERIALIZE_H_ 5 #ifndef V8_SERIALIZE_H_
6 #define V8_SERIALIZE_H_ 6 #define V8_SERIALIZE_H_
7 7
8 #include "src/hashmap.h" 8 #include "src/hashmap.h"
9 #include "src/heap-profiler.h" 9 #include "src/heap-profiler.h"
10 #include "src/isolate.h" 10 #include "src/isolate.h"
11 #include "src/parser.h"
vogelheim 2014/07/07 15:20:01 parser.h draws in a rather large amount of headers
Yang 2014/07/08 09:01:05 Yup. Doing this later.
11 #include "src/snapshot-source-sink.h" 12 #include "src/snapshot-source-sink.h"
12 13
13 namespace v8 { 14 namespace v8 {
14 namespace internal { 15 namespace internal {
15 16
16 // A TypeCode is used to distinguish different kinds of external reference. 17 // A TypeCode is used to distinguish different kinds of external reference.
17 // It is a single bit to make testing for types easy. 18 // It is a single bit to make testing for types easy.
18 enum TypeCode { 19 enum TypeCode {
19 UNCLASSIFIED, // One-of-a-kind references. 20 UNCLASSIFIED, // One-of-a-kind references.
20 BUILTIN, 21 BUILTIN,
(...skipping 441 matching lines...) Expand 10 before | Expand all | Expand 10 after
462 Isolate* isolate_; 463 Isolate* isolate_;
463 // Keep track of the fullness of each space in order to generate 464 // Keep track of the fullness of each space in order to generate
464 // relative addresses for back references. 465 // relative addresses for back references.
465 int fullness_[LAST_SPACE + 1]; 466 int fullness_[LAST_SPACE + 1];
466 SnapshotByteSink* sink_; 467 SnapshotByteSink* sink_;
467 ExternalReferenceEncoder* external_reference_encoder_; 468 ExternalReferenceEncoder* external_reference_encoder_;
468 469
469 SerializationAddressMapper address_mapper_; 470 SerializationAddressMapper address_mapper_;
470 intptr_t root_index_wave_front_; 471 intptr_t root_index_wave_front_;
471 void Pad(); 472 void Pad();
473 void PadByte();
472 474
473 friend class ObjectSerializer; 475 friend class ObjectSerializer;
474 friend class Deserializer; 476 friend class Deserializer;
475 477
476 // We may not need the code address map for logging for every instance 478 // We may not need the code address map for logging for every instance
477 // of the serializer. Initialize it on demand. 479 // of the serializer. Initialize it on demand.
478 void InitializeCodeAddressMap(); 480 void InitializeCodeAddressMap();
479 481
480 private: 482 private:
481 CodeAddressMap* code_address_map_; 483 CodeAddressMap* code_address_map_;
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
544 int skip); 546 int skip);
545 void SerializeWeakReferences(); 547 void SerializeWeakReferences();
546 void Serialize() { 548 void Serialize() {
547 SerializeStrongReferences(); 549 SerializeStrongReferences();
548 SerializeWeakReferences(); 550 SerializeWeakReferences();
549 Pad(); 551 Pad();
550 } 552 }
551 }; 553 };
552 554
553 555
556 class CodeSerializer : public Serializer {
557 public:
558 CodeSerializer(Isolate* isolate, SnapshotByteSink* sink)
559 : Serializer(isolate, sink) {
560 set_root_index_wave_front(Heap::kStrongRootListLength);
561 InitializeCodeAddressMap();
562 }
563
564 static ScriptData* Serialize(Handle<SharedFunctionInfo> info);
565 virtual void SerializeObject(Object* o, HowToCode how_to_code,
566 WhereToPoint where_to_point, int skip);
567
568 static Object* Deserialize(Isolate* isolate, ScriptData* data);
569
570 // The data header consists of
571 // [0] version hash
vogelheim 2014/07/07 15:20:01 nitpick: It took me a while to understand these ar
Yang 2014/07/08 09:01:05 Done.
572 // [1] length in bytes
573 // [2..8] reservation sizes for spaces from NEW_SPACE to PROPERTY_CELL_SPACE.
574 static const int kHeaderSize = 9;
575 static const int kVersionHashOffset = 0;
576 static const int kPayloadLengthOffset = 1;
577 static const int kReservationsOffset = 2;
578 };
579
580
581 class DummySnapshotSink : public SnapshotByteSink {
vogelheim 2014/07/07 15:20:01 If these (and the following) *Sinks are of general
Yang 2014/07/08 09:01:05 Done.
582 public:
583 DummySnapshotSink() : length_(0) {}
584 virtual ~DummySnapshotSink() {}
585 virtual void Put(int byte, const char* description) { length_++; }
586 virtual int Position() { return length_; }
587
588 private:
589 int length_;
590 };
591
592
593 // Wrap a SnapshotByteSink into a DebugSnapshotSink to get debugging output.
594 class DebugSnapshotSink : public SnapshotByteSink {
595 public:
596 explicit DebugSnapshotSink(SnapshotByteSink* chained) : sink_(chained) {}
597 virtual ~DebugSnapshotSink() {}
598 virtual void Put(int byte, const char* description) {
599 printf("%24s: %x\n", description, byte);
vogelheim 2014/07/07 15:20:01 nitpick: This header does not include stdio.h (and
Yang 2014/07/08 09:01:05 Using PrintF instead.
600 sink_->Put(byte, description);
601 }
602 virtual int Position() { return sink_->Position(); }
603
604 private:
605 SnapshotByteSink* sink_;
606 };
607
608
609 class ListSnapshotSink : public i::SnapshotByteSink {
610 public:
611 explicit ListSnapshotSink(i::List<char>* data) : data_(data) {}
612 virtual ~ListSnapshotSink() {}
613 virtual void Put(int byte, const char* description) { data_->Add(byte); }
614 virtual int Position() { return data_->length(); }
615
616 private:
617 i::List<char>* data_;
618 };
554 } } // namespace v8::internal 619 } } // namespace v8::internal
555 620
556 #endif // V8_SERIALIZE_H_ 621 #endif // V8_SERIALIZE_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698