| 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/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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |