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

Side by Side Diff: vm/object.h

Issue 10697055: Represent tokens as a compressed stream instead of an array. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/runtime/
Patch Set: Created 8 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
« no previous file with comments | « vm/datastream.h ('k') | vm/object.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 #ifndef VM_OBJECT_H_ 5 #ifndef VM_OBJECT_H_
6 #define VM_OBJECT_H_ 6 #define VM_OBJECT_H_
7 7
8 #include "include/dart_api.h" 8 #include "include/dart_api.h"
9 #include "platform/assert.h" 9 #include "platform/assert.h"
10 #include "platform/utils.h" 10 #include "platform/utils.h"
(...skipping 1671 matching lines...) Expand 10 before | Expand all | Expand 10 after
1682 1682
1683 HEAP_OBJECT_IMPLEMENTATION(LiteralToken, Object); 1683 HEAP_OBJECT_IMPLEMENTATION(LiteralToken, Object);
1684 friend class Class; 1684 friend class Class;
1685 }; 1685 };
1686 1686
1687 1687
1688 class TokenStream : public Object { 1688 class TokenStream : public Object {
1689 public: 1689 public:
1690 inline intptr_t Length() const; 1690 inline intptr_t Length() const;
1691 1691
1692 inline Token::Kind KindAt(intptr_t index) const; 1692 RawArray* TokenObjects() const;
1693 void SetTokenObjects(const Array& value) const;
1693 1694
1694 void SetTokenAt(intptr_t index, Token::Kind kind, const String& literal);
1695 void SetTokenAt(intptr_t index, const Object& token);
1696
1697 RawObject* TokenAt(intptr_t index) const;
1698 RawString* LiteralAt(intptr_t index) const;
1699 RawString* GenerateSource() const; 1695 RawString* GenerateSource() const;
1696 intptr_t ComputeSourcePosition(intptr_t tok_pos) const;
1697 intptr_t ComputeTokenPosition(intptr_t src_pos) const;
1700 1698
1701 static intptr_t InstanceSize() { 1699 static intptr_t InstanceSize() {
1702 ASSERT(sizeof(RawTokenStream) == OFFSET_OF(RawTokenStream, data_)); 1700 ASSERT(sizeof(RawTokenStream) == OFFSET_OF(RawTokenStream, data_));
1703 return 0; 1701 return 0;
1704 } 1702 }
1705 static intptr_t InstanceSize(intptr_t len) { 1703 static intptr_t InstanceSize(intptr_t len) {
1706 return RoundedAllocationSize(sizeof(RawTokenStream) + (len * kWordSize)); 1704 return RoundedAllocationSize(sizeof(RawTokenStream) + len);
1707 }
1708 static intptr_t StreamLength(intptr_t len) {
1709 return len;
1710 } 1705 }
1711 1706
1712 static RawTokenStream* New(intptr_t length); 1707 static RawTokenStream* New(intptr_t length);
1713 static RawTokenStream* New(const Scanner::GrowableTokenStream& tokens); 1708 static RawTokenStream* New(const Scanner::GrowableTokenStream& tokens);
1714 1709
1710 // The class Iterator encapsulates iteration over the tokens
1711 // in a TokenStream object.
1712 class Iterator : ValueObject {
1713 public:
1714 Iterator(const TokenStream& tokens, intptr_t token_pos);
1715
1716 bool IsValid() const;
1717
1718 inline Token::Kind CurrentTokenKind() const {
1719 return cur_token_kind_;
1720 }
1721
1722 Token::Kind LookaheadTokenKind(intptr_t num_tokens);
1723
1724 intptr_t CurrentPosition() const;
1725 void SetCurrentPosition(intptr_t value);
1726
1727 void Advance();
1728
1729 RawObject* CurrentToken() const;
1730 RawString* CurrentLiteral() const;
1731 RawString* MakeLiteralToken(const Object& obj) const;
1732
1733 private:
1734 // Read token from the token stream (could be a simple token or an index
1735 // into the token objects array for IDENT or literal tokens).
1736 intptr_t ReadToken();
1737 uint8_t ReadByte();
1738
1739 const TokenStream& tokens_;
1740 Array& token_objects_;
1741 Object& obj_;
1742 intptr_t cur_token_pos_;
1743 intptr_t stream_token_pos_;
1744 Token::Kind cur_token_kind_;
1745 intptr_t cur_token_obj_index_;
1746 };
1747
1715 private: 1748 private:
1716 void SetLength(intptr_t value) const; 1749 void SetLength(intptr_t value) const;
1717 1750
1718 RawObject** EntryAddr(intptr_t index) const { 1751 uint8_t* EntryAddr(intptr_t token_pos) const {
1719 ASSERT((index >=0) && (index < Length())); 1752 ASSERT((token_pos >=0) && (token_pos < Length()));
1720 return &raw_ptr()->data_[index]; 1753 return &raw_ptr()->data_[token_pos];
1721 }
1722
1723 RawSmi** SmiAddr(intptr_t index) const {
1724 return reinterpret_cast<RawSmi**>(EntryAddr(index));
1725 } 1754 }
1726 1755
1727 HEAP_OBJECT_IMPLEMENTATION(TokenStream, Object); 1756 HEAP_OBJECT_IMPLEMENTATION(TokenStream, Object);
1728 friend class Class; 1757 friend class Class;
1729 }; 1758 };
1730 1759
1731 1760
1732 class Script : public Object { 1761 class Script : public Object {
1733 public: 1762 public:
1734 RawString* url() const { return raw_ptr()->url_; } 1763 RawString* url() const { return raw_ptr()->url_; }
(...skipping 3343 matching lines...) Expand 10 before | Expand all | Expand 10 after
5078 ASSERT(!is_static()); // SetOffset is valid only for instance fields. 5107 ASSERT(!is_static()); // SetOffset is valid only for instance fields.
5079 raw_ptr()->value_ = Smi::New(value); 5108 raw_ptr()->value_ = Smi::New(value);
5080 } 5109 }
5081 5110
5082 5111
5083 intptr_t TokenStream::Length() const { 5112 intptr_t TokenStream::Length() const {
5084 return Smi::Value(raw_ptr()->length_); 5113 return Smi::Value(raw_ptr()->length_);
5085 } 5114 }
5086 5115
5087 5116
5088 Token::Kind TokenStream::KindAt(intptr_t index) const {
5089 const Object& obj = Object::Handle(TokenAt(index));
5090 if (obj.IsSmi()) {
5091 return static_cast<Token::Kind>(Smi::Cast(obj).Value());
5092 } else if (obj.IsLiteralToken()) {
5093 return LiteralToken::Cast(obj).kind();
5094 }
5095 ASSERT(obj.IsString()); // Must be an identifier.
5096 return Token::kIDENT;
5097 }
5098
5099
5100 void Context::SetAt(intptr_t index, const Instance& value) const { 5117 void Context::SetAt(intptr_t index, const Instance& value) const {
5101 StorePointer(InstanceAddr(index), value.raw()); 5118 StorePointer(InstanceAddr(index), value.raw());
5102 } 5119 }
5103 5120
5104 5121
5105 intptr_t Stackmap::SizeInBits() const { 5122 intptr_t Stackmap::SizeInBits() const {
5106 return (Smi::Value(raw_ptr()->bitmap_size_in_bytes_) * kBitsPerByte); 5123 return (Smi::Value(raw_ptr()->bitmap_size_in_bytes_) * kBitsPerByte);
5107 } 5124 }
5108 5125
5109 } // namespace dart 5126 } // namespace dart
5110 5127
5111 #endif // VM_OBJECT_H_ 5128 #endif // VM_OBJECT_H_
OLDNEW
« no previous file with comments | « vm/datastream.h ('k') | vm/object.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698