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

Side by Side Diff: vm/object.cc

Issue 9462003: Changes to shrink the token stream representation from two words to one word. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/runtime/
Patch Set: Created 8 years, 9 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/object.h ('k') | vm/object_store.h » ('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 #include "vm/object.h" 5 #include "vm/object.h"
6 6
7 #include "platform/assert.h" 7 #include "platform/assert.h"
8 #include "vm/assembler.h" 8 #include "vm/assembler.h"
9 #include "vm/bigint_operations.h" 9 #include "vm/bigint_operations.h"
10 #include "vm/bootstrap.h" 10 #include "vm/bootstrap.h"
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
63 RawClass* Object::type_parameter_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 63 RawClass* Object::type_parameter_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
64 RawClass* Object::instantiated_type_class_ = 64 RawClass* Object::instantiated_type_class_ =
65 reinterpret_cast<RawClass*>(RAW_NULL); 65 reinterpret_cast<RawClass*>(RAW_NULL);
66 RawClass* Object::abstract_type_arguments_class_ = 66 RawClass* Object::abstract_type_arguments_class_ =
67 reinterpret_cast<RawClass*>(RAW_NULL); 67 reinterpret_cast<RawClass*>(RAW_NULL);
68 RawClass* Object::type_arguments_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 68 RawClass* Object::type_arguments_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
69 RawClass* Object::instantiated_type_arguments_class_ = 69 RawClass* Object::instantiated_type_arguments_class_ =
70 reinterpret_cast<RawClass*>(RAW_NULL); 70 reinterpret_cast<RawClass*>(RAW_NULL);
71 RawClass* Object::function_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 71 RawClass* Object::function_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
72 RawClass* Object::field_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 72 RawClass* Object::field_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
73 RawClass* Object::literal_token_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
73 RawClass* Object::token_stream_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 74 RawClass* Object::token_stream_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
74 RawClass* Object::script_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 75 RawClass* Object::script_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
75 RawClass* Object::library_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 76 RawClass* Object::library_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
76 RawClass* Object::library_prefix_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 77 RawClass* Object::library_prefix_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
77 RawClass* Object::code_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 78 RawClass* Object::code_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
78 RawClass* Object::instructions_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 79 RawClass* Object::instructions_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
79 RawClass* Object::pc_descriptors_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 80 RawClass* Object::pc_descriptors_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
80 RawClass* Object::var_descriptors_class_ = 81 RawClass* Object::var_descriptors_class_ =
81 reinterpret_cast<RawClass*>(RAW_NULL); 82 reinterpret_cast<RawClass*>(RAW_NULL);
82 RawClass* Object::exception_handlers_class_ = 83 RawClass* Object::exception_handlers_class_ =
(...skipping 29 matching lines...) Expand all
112 } else if (raw_class == abstract_type_arguments_class()) { 113 } else if (raw_class == abstract_type_arguments_class()) {
113 return kAbstractTypeArgumentsClass; 114 return kAbstractTypeArgumentsClass;
114 } else if (raw_class == type_arguments_class()) { 115 } else if (raw_class == type_arguments_class()) {
115 return kTypeArgumentsClass; 116 return kTypeArgumentsClass;
116 } else if (raw_class == instantiated_type_arguments_class()) { 117 } else if (raw_class == instantiated_type_arguments_class()) {
117 return kInstantiatedTypeArgumentsClass; 118 return kInstantiatedTypeArgumentsClass;
118 } else if (raw_class == function_class()) { 119 } else if (raw_class == function_class()) {
119 return kFunctionClass; 120 return kFunctionClass;
120 } else if (raw_class == field_class()) { 121 } else if (raw_class == field_class()) {
121 return kFieldClass; 122 return kFieldClass;
123 } else if (raw_class == literal_token_class()) {
124 return kLiteralTokenClass;
122 } else if (raw_class == token_stream_class()) { 125 } else if (raw_class == token_stream_class()) {
123 return kTokenStreamClass; 126 return kTokenStreamClass;
124 } else if (raw_class == script_class()) { 127 } else if (raw_class == script_class()) {
125 return kScriptClass; 128 return kScriptClass;
126 } else if (raw_class == library_class()) { 129 } else if (raw_class == library_class()) {
127 return kLibraryClass; 130 return kLibraryClass;
128 } else if (raw_class == library_prefix_class()) { 131 } else if (raw_class == library_prefix_class()) {
129 return kLibraryPrefixClass; 132 return kLibraryPrefixClass;
130 } else if (raw_class == code_class()) { 133 } else if (raw_class == code_class()) {
131 return kCodeClass; 134 return kCodeClass;
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
165 case kUnresolvedClassClass: return unresolved_class_class(); 168 case kUnresolvedClassClass: return unresolved_class_class();
166 case kTypeClass: return type_class(); 169 case kTypeClass: return type_class();
167 case kTypeParameterClass: return type_parameter_class(); 170 case kTypeParameterClass: return type_parameter_class();
168 case kInstantiatedTypeClass: return instantiated_type_class(); 171 case kInstantiatedTypeClass: return instantiated_type_class();
169 case kAbstractTypeArgumentsClass: return abstract_type_arguments_class(); 172 case kAbstractTypeArgumentsClass: return abstract_type_arguments_class();
170 case kTypeArgumentsClass: return type_arguments_class(); 173 case kTypeArgumentsClass: return type_arguments_class();
171 case kInstantiatedTypeArgumentsClass: 174 case kInstantiatedTypeArgumentsClass:
172 return instantiated_type_arguments_class(); 175 return instantiated_type_arguments_class();
173 case kFunctionClass: return function_class(); 176 case kFunctionClass: return function_class();
174 case kFieldClass: return field_class(); 177 case kFieldClass: return field_class();
178 case kLiteralTokenClass: return literal_token_class();
175 case kTokenStreamClass: return token_stream_class(); 179 case kTokenStreamClass: return token_stream_class();
176 case kScriptClass: return script_class(); 180 case kScriptClass: return script_class();
177 case kLibraryClass: return library_class(); 181 case kLibraryClass: return library_class();
178 case kLibraryPrefixClass: return library_prefix_class(); 182 case kLibraryPrefixClass: return library_prefix_class();
179 case kCodeClass: return code_class(); 183 case kCodeClass: return code_class();
180 case kInstructionsClass: return instructions_class(); 184 case kInstructionsClass: return instructions_class();
181 case kPcDescriptorsClass: return pc_descriptors_class(); 185 case kPcDescriptorsClass: return pc_descriptors_class();
182 case kLocalVarDescriptorsClass: return var_descriptors_class(); 186 case kLocalVarDescriptorsClass: return var_descriptors_class();
183 case kExceptionHandlersClass: return exception_handlers_class(); 187 case kExceptionHandlersClass: return exception_handlers_class();
184 case kContextClass: return context_class(); 188 case kContextClass: return context_class();
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
328 332
329 cls = Class::New<InstantiatedTypeArguments>(); 333 cls = Class::New<InstantiatedTypeArguments>();
330 instantiated_type_arguments_class_ = cls.raw(); 334 instantiated_type_arguments_class_ = cls.raw();
331 335
332 cls = Class::New<Function>(); 336 cls = Class::New<Function>();
333 function_class_ = cls.raw(); 337 function_class_ = cls.raw();
334 338
335 cls = Class::New<Field>(); 339 cls = Class::New<Field>();
336 field_class_ = cls.raw(); 340 field_class_ = cls.raw();
337 341
342 cls = Class::New<LiteralToken>();
343 literal_token_class_ = cls.raw();
344
338 cls = Class::New<TokenStream>(); 345 cls = Class::New<TokenStream>();
339 token_stream_class_ = cls.raw(); 346 token_stream_class_ = cls.raw();
340 347
341 cls = Class::New<Script>(); 348 cls = Class::New<Script>();
342 script_class_ = cls.raw(); 349 script_class_ = cls.raw();
343 350
344 cls = Class::New<Library>(); 351 cls = Class::New<Library>();
345 library_class_ = cls.raw(); 352 library_class_ = cls.raw();
346 353
347 cls = Class::New<LibraryPrefix>(); 354 cls = Class::New<LibraryPrefix>();
(...skipping 3393 matching lines...) Expand 10 before | Expand all | Expand 10 after
3741 const char* cls_name = String::Handle(cls.Name()).ToCString(); 3748 const char* cls_name = String::Handle(cls.Name()).ToCString();
3742 intptr_t len = 3749 intptr_t len =
3743 OS::SNPrint(NULL, 0, kFormat, cls_name, field_name, kF0, kF1) + 1; 3750 OS::SNPrint(NULL, 0, kFormat, cls_name, field_name, kF0, kF1) + 1;
3744 char* chars = reinterpret_cast<char*>( 3751 char* chars = reinterpret_cast<char*>(
3745 Isolate::Current()->current_zone()->Allocate(len)); 3752 Isolate::Current()->current_zone()->Allocate(len));
3746 OS::SNPrint(chars, len, kFormat, cls_name, field_name, kF0, kF1); 3753 OS::SNPrint(chars, len, kFormat, cls_name, field_name, kF0, kF1);
3747 return chars; 3754 return chars;
3748 } 3755 }
3749 3756
3750 3757
3758 void LiteralToken::set_literal(const String& literal) const {
3759 StorePointer(&raw_ptr()->literal_, literal.raw());
3760 }
3761
3762
3763 void LiteralToken::set_value(const Object& value) const {
3764 StorePointer(&raw_ptr()->value_, value.raw());
3765 }
3766
3767
3768 RawLiteralToken* LiteralToken::New() {
3769 const Class& cls = Class::Handle(Object::literal_token_class());
3770 RawObject* raw = Object::Allocate(cls,
3771 LiteralToken::InstanceSize(),
3772 Heap::kOld);
3773 return reinterpret_cast<RawLiteralToken*>(raw);
3774 }
3775
3776
3777 RawLiteralToken* LiteralToken::New(Token::Kind kind, const String& literal) {
3778 const LiteralToken& result = LiteralToken::Handle(LiteralToken::New());
3779 result.set_kind(kind);
3780 result.set_literal(literal);
3781 if (kind == Token::kINTEGER) {
3782 const Integer& value = Integer::Handle(Integer::New(literal));
3783 result.set_value(value);
3784 } else if (kind == Token::kDOUBLE) {
3785 const Double& value = Double::Handle(Double::NewCanonical(literal));
3786 result.set_value(value);
3787 } else {
3788 ASSERT(Token::NeedsLiteralToken(kind));
3789 result.set_value(literal);
3790 }
3791 return result.raw();
3792 }
3793
3794
3795 const char* LiteralToken::ToCString() const {
3796 const String& token = String::Handle(literal());
3797 return token.ToCString();
3798 }
3799
3800
3751 void TokenStream::SetLength(intptr_t value) const { 3801 void TokenStream::SetLength(intptr_t value) const {
3752 raw_ptr()->length_ = Smi::New(value); 3802 raw_ptr()->length_ = Smi::New(value);
3753 } 3803 }
3754 3804
3755 3805
3756 void TokenStream::SetTokenAt(intptr_t index, 3806 void TokenStream::SetTokenAt(intptr_t index,
3757 Token::Kind kind, 3807 Token::Kind kind,
3758 const String& literal) { 3808 const String& literal) {
3759 *(SmiAddr(index, RawTokenStream::kKindEntry)) = Smi::New(kind); 3809 if (kind == Token::kIDENT) {
3760 StorePointer(EntryAddr(index, RawTokenStream::kLiteralEntry), 3810 if (FLAG_compiler_stats) {
3761 reinterpret_cast<RawObject*>(literal.raw())); 3811 CompilerStats::num_ident_tokens_total += 1;
3812 }
3813 StorePointer(EntryAddr(index), reinterpret_cast<RawObject*>(literal.raw()));
3814 } else if (Token::NeedsLiteralToken(kind)) {
3815 if (FLAG_compiler_stats) {
3816 CompilerStats::num_literal_tokens_total += 1;
3817 }
3818 StorePointer(
3819 EntryAddr(index),
3820 reinterpret_cast<RawObject*>(LiteralToken::New(kind, literal)));
3821 } else {
3822 ASSERT(kind < Token::kNumTokens);
3823 *(SmiAddr(index)) = Smi::New(kind);
3824 }
3825 }
3826
3827
3828 void TokenStream::SetTokenAt(intptr_t index, const Object& token) {
3829 StorePointer(EntryAddr(index), token.raw());
3830 }
3831
3832
3833 RawObject* TokenStream::TokenAt(intptr_t index) const {
3834 return *EntryAddr(index);
3835 }
3836
3837
3838 RawString* TokenStream::LiteralAt(intptr_t index) const {
3839 const Object& obj = Object::Handle(TokenAt(index));
3840 if (obj.IsString()) {
3841 return reinterpret_cast<RawString*>(obj.raw());
3842 } else if (obj.IsSmi()) {
3843 Token::Kind kind = static_cast<Token::Kind>(
3844 Smi::Value(reinterpret_cast<RawSmi*>(obj.raw())));
3845 ASSERT(kind < Token::kNumTokens);
3846 if (Token::IsPseudoKeyword(kind) || Token::IsKeyword(kind)) {
3847 Isolate* isolate = Isolate::Current();
3848 ObjectStore* object_store = isolate->object_store();
3849 String& str = String::Handle(isolate, String::null());
3850 const Array& symbols = Array::Handle(isolate,
3851 object_store->keyword_symbols());
3852 ASSERT(!symbols.IsNull());
3853 str ^= symbols.At(kind - Token::kFirstKeyword);
3854 ASSERT(!str.IsNull());
3855 return str.raw();
3856 }
3857 return String::NewSymbol(Token::Str(kind));
3858 } else {
3859 LiteralToken& token = LiteralToken::Handle();
3860 token ^= obj.raw(); // Must be a literal token.
3861 return token.literal();
3862 }
3762 } 3863 }
3763 3864
3764 3865
3765 RawTokenStream* TokenStream::New(intptr_t len) { 3866 RawTokenStream* TokenStream::New(intptr_t len) {
3766 const Class& token_stream_class = Class::Handle(Object::token_stream_class()); 3867 const Class& token_stream_class = Class::Handle(Object::token_stream_class());
3767 TokenStream& result = TokenStream::Handle(); 3868 TokenStream& result = TokenStream::Handle();
3768 { 3869 {
3769 RawObject* raw = Object::Allocate(token_stream_class, 3870 RawObject* raw = Object::Allocate(token_stream_class,
3770 TokenStream::InstanceSize(len), 3871 TokenStream::InstanceSize(len),
3771 Heap::kOld); 3872 Heap::kOld);
3772 NoGCScope no_gc; 3873 NoGCScope no_gc;
3773 result ^= raw; 3874 result ^= raw;
3774 result.SetLength(len); 3875 result.SetLength(len);
3775 } 3876 }
3776 return result.raw(); 3877 return result.raw();
3777 } 3878 }
3778 3879
3779 3880
3780 RawTokenStream* TokenStream::New(const Scanner::GrowableTokenStream& tokens) { 3881 RawTokenStream* TokenStream::New(const Scanner::GrowableTokenStream& tokens) {
3781 intptr_t len = tokens.length(); 3882 intptr_t len = tokens.length();
3782 3883
3783 TokenStream& result = TokenStream::Handle(New(len)); 3884 TokenStream& result = TokenStream::Handle(New(len));
3784 // Copy the relevant data out of the scanner's token stream. 3885 // Copy the relevant data out of the scanner's token stream.
3886 const String& empty_literal = String::Handle();
3785 for (intptr_t i = 0; i < len; i++) { 3887 for (intptr_t i = 0; i < len; i++) {
3786 Scanner::TokenDescriptor token = tokens[i]; 3888 Scanner::TokenDescriptor token = tokens[i];
3787 if (token.literal != NULL) { 3889 if (token.literal != NULL) {
3788 result.SetTokenAt(i, token.kind, *(token.literal)); 3890 result.SetTokenAt(i, token.kind, *(token.literal));
3789 } else { 3891 } else {
3790 result.SetTokenAt(i, token.kind, String::Handle()); 3892 result.SetTokenAt(i, token.kind, empty_literal);
3791 } 3893 }
3792 } 3894 }
3793 return result.raw(); 3895 return result.raw();
3794 } 3896 }
3795 3897
3796 3898
3797 const char* TokenStream::ToCString() const { 3899 const char* TokenStream::ToCString() const {
3798 return "TokenStream"; 3900 return "TokenStream";
3799 } 3901 }
3800 3902
(...skipping 4565 matching lines...) Expand 10 before | Expand all | Expand 10 after
8366 result.set_num_args_tested(num_args_tested); 8468 result.set_num_args_tested(num_args_tested);
8367 // Number of array elements in one test entry (num_args_tested + 1) 8469 // Number of array elements in one test entry (num_args_tested + 1)
8368 intptr_t len = num_args_tested + 1; 8470 intptr_t len = num_args_tested + 1;
8369 // IC data array must be null terminated (sentinel entry). 8471 // IC data array must be null terminated (sentinel entry).
8370 Array& ic_data = Array::Handle(Array::New(len, Heap::kOld)); 8472 Array& ic_data = Array::Handle(Array::New(len, Heap::kOld));
8371 result.set_ic_data(ic_data); 8473 result.set_ic_data(ic_data);
8372 return result.raw(); 8474 return result.raw();
8373 } 8475 }
8374 8476
8375 } // namespace dart 8477 } // namespace dart
OLDNEW
« no previous file with comments | « vm/object.h ('k') | vm/object_store.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698