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

Side by Side Diff: runtime/vm/object.cc

Issue 1412633007: Save the native name on the function instead of finding it in the token stream for lazily-linked na… (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years, 1 month 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
« no previous file with comments | « runtime/vm/object.h ('k') | runtime/vm/parser.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 #include "vm/object.h" 5 #include "vm/object.h"
6 6
7 #include "include/dart_api.h" 7 #include "include/dart_api.h"
8 #include "platform/assert.h" 8 #include "platform/assert.h"
9 #include "vm/assembler.h" 9 #include "vm/assembler.h"
10 #include "vm/cpu.h" 10 #include "vm/cpu.h"
(...skipping 5554 matching lines...) Expand 10 before | Expand all | Expand 10 after
5565 } 5565 }
5566 5566
5567 5567
5568 RawFunction* Function::implicit_closure_function() const { 5568 RawFunction* Function::implicit_closure_function() const {
5569 if (IsClosureFunction() || 5569 if (IsClosureFunction() ||
5570 IsSignatureFunction() || 5570 IsSignatureFunction() ||
5571 IsFactory()) { 5571 IsFactory()) {
5572 return Function::null(); 5572 return Function::null();
5573 } 5573 }
5574 const Object& obj = Object::Handle(raw_ptr()->data_); 5574 const Object& obj = Object::Handle(raw_ptr()->data_);
5575 ASSERT(obj.IsNull() || obj.IsScript() || obj.IsFunction()); 5575 ASSERT(obj.IsNull() || obj.IsScript() || obj.IsFunction() || obj.IsArray());
5576 return (obj.IsNull() || obj.IsScript()) ? Function::null() 5576 if (obj.IsNull() || obj.IsScript()) {
5577 : Function::Cast(obj).raw(); 5577 return Function::null();
5578 }
5579 if (obj.IsFunction()) {
5580 return Function::Cast(obj).raw();
5581 }
5582 ASSERT(is_native());
5583 ASSERT(obj.IsArray());
5584 const Object& res = Object::Handle(Array::Cast(obj).At(1));
5585 return res.IsNull() ? Function::null() : Function::Cast(res).raw();
5578 } 5586 }
5579 5587
5580 5588
5581 void Function::set_implicit_closure_function(const Function& value) const { 5589 void Function::set_implicit_closure_function(const Function& value) const {
5582 ASSERT(!IsClosureFunction() && !IsSignatureFunction()); 5590 ASSERT(!IsClosureFunction() && !IsSignatureFunction());
5583 ASSERT(raw_ptr()->data_ == Object::null()); 5591 if (is_native()) {
5584 set_data(value); 5592 const Object& obj = Object::Handle(raw_ptr()->data_);
5593 ASSERT(obj.IsArray());
5594 ASSERT((Array::Cast(obj).At(1) == Object::null()) || value.IsNull());
5595 Array::Cast(obj).SetAt(1, value);
5596 } else {
5597 ASSERT((raw_ptr()->data_ == Object::null()) || value.IsNull());
5598 set_data(value);
5599 }
5585 } 5600 }
5586 5601
5587 5602
5588 RawClass* Function::signature_class() const { 5603 RawClass* Function::signature_class() const {
5589 if (IsSignatureFunction()) { 5604 if (IsSignatureFunction()) {
5590 const Object& obj = Object::Handle(raw_ptr()->data_); 5605 const Object& obj = Object::Handle(raw_ptr()->data_);
5591 ASSERT(obj.IsNull() || obj.IsClass()); 5606 ASSERT(obj.IsNull() || obj.IsClass());
5592 return (obj.IsNull()) ? Class::null() : Class::Cast(obj).raw(); 5607 return (obj.IsNull()) ? Class::null() : Class::Cast(obj).raw();
5593 } 5608 }
5594 if (IsClosureFunction()) { 5609 if (IsClosureFunction()) {
(...skipping 14 matching lines...) Expand all
5609 const Object& obj = Object::Handle(raw_ptr()->data_); 5624 const Object& obj = Object::Handle(raw_ptr()->data_);
5610 ASSERT(!obj.IsNull()); 5625 ASSERT(!obj.IsNull());
5611 ClosureData::Cast(obj).set_signature_class(value); 5626 ClosureData::Cast(obj).set_signature_class(value);
5612 return; 5627 return;
5613 } 5628 }
5614 UNREACHABLE(); 5629 UNREACHABLE();
5615 } 5630 }
5616 5631
5617 5632
5618 bool Function::IsRedirectingFactory() const { 5633 bool Function::IsRedirectingFactory() const {
5619 if (!IsFactory() || (raw_ptr()->data_ == Object::null())) { 5634 if (!IsFactory() || !is_redirecting()) {
5620 return false; 5635 return false;
5621 } 5636 }
5622 ASSERT(!IsClosureFunction()); // A factory cannot also be a closure. 5637 ASSERT(!IsClosureFunction()); // A factory cannot also be a closure.
5623 return true; 5638 return true;
5624 } 5639 }
5625 5640
5626 5641
5627 RawType* Function::RedirectionType() const { 5642 RawType* Function::RedirectionType() const {
5628 ASSERT(IsRedirectingFactory()); 5643 ASSERT(IsRedirectingFactory());
5644 ASSERT(!is_native());
5629 const Object& obj = Object::Handle(raw_ptr()->data_); 5645 const Object& obj = Object::Handle(raw_ptr()->data_);
5630 ASSERT(!obj.IsNull()); 5646 ASSERT(!obj.IsNull());
5631 return RedirectionData::Cast(obj).type(); 5647 return RedirectionData::Cast(obj).type();
5632 } 5648 }
5633 5649
5634 5650
5635 const char* Function::KindToCString(RawFunction::Kind kind) { 5651 const char* Function::KindToCString(RawFunction::Kind kind) {
5636 switch (kind) { 5652 switch (kind) {
5637 case RawFunction::kRegularFunction: 5653 case RawFunction::kRegularFunction:
5638 return "RegularFunction"; 5654 return "RegularFunction";
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
5722 ASSERT(IsFactory()); 5738 ASSERT(IsFactory());
5723 Object& obj = Object::Handle(raw_ptr()->data_); 5739 Object& obj = Object::Handle(raw_ptr()->data_);
5724 if (obj.IsNull()) { 5740 if (obj.IsNull()) {
5725 obj = RedirectionData::New(); 5741 obj = RedirectionData::New();
5726 set_data(obj); 5742 set_data(obj);
5727 } 5743 }
5728 RedirectionData::Cast(obj).set_target(target); 5744 RedirectionData::Cast(obj).set_target(target);
5729 } 5745 }
5730 5746
5731 5747
5748 // This field is heavily overloaded:
5749 // eval function: Script expression source
5750 // signature function: Class signature class
5751 // method extractor: Function extracted closure function
5752 // noSuchMethod dispatcher: Array arguments descriptor
5753 // invoke-field dispatcher: Array arguments descriptor
5754 // redirecting constructor: RedirectionData
5755 // closure function: ClosureData
5756 // irregexp function: Array[0] = JSRegExp
5757 // Array[1] = Smi string specialization cid
5758 // native function: Array[0] = String native name
5759 // Array[1] = Function implicit closure function
5760 // regular function: Function for implicit closure function
5732 void Function::set_data(const Object& value) const { 5761 void Function::set_data(const Object& value) const {
5733 StorePointer(&raw_ptr()->data_, value.raw()); 5762 StorePointer(&raw_ptr()->data_, value.raw());
5734 } 5763 }
5735 5764
5736 5765
5737 bool Function::IsInFactoryScope() const { 5766 bool Function::IsInFactoryScope() const {
5738 if (!IsLocalFunction()) { 5767 if (!IsLocalFunction()) {
5739 return IsFactory(); 5768 return IsFactory();
5740 } 5769 }
5741 Function& outer_function = Function::Handle(parent_function()); 5770 Function& outer_function = Function::Handle(parent_function());
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
5777 ASSERT(kind() == RawFunction::kIrregexpFunction); 5806 ASSERT(kind() == RawFunction::kIrregexpFunction);
5778 ASSERT(RawObject::IsStringClassId(string_specialization_cid)); 5807 ASSERT(RawObject::IsStringClassId(string_specialization_cid));
5779 ASSERT(raw_ptr()->data_ == Object::null()); 5808 ASSERT(raw_ptr()->data_ == Object::null());
5780 const Array& pair = Array::Handle(Array::New(2, Heap::kOld)); 5809 const Array& pair = Array::Handle(Array::New(2, Heap::kOld));
5781 pair.SetAt(0, regexp); 5810 pair.SetAt(0, regexp);
5782 pair.SetAt(1, Smi::Handle(Smi::New(string_specialization_cid))); 5811 pair.SetAt(1, Smi::Handle(Smi::New(string_specialization_cid)));
5783 set_data(pair); 5812 set_data(pair);
5784 } 5813 }
5785 5814
5786 5815
5816 RawString* Function::native_name() const {
5817 ASSERT(is_native());
5818 const Object& obj = Object::Handle(raw_ptr()->data_);
5819 ASSERT(obj.IsArray());
5820 return String::RawCast(Array::Cast(obj).At(0));
5821 }
5822
5823
5824 void Function::set_native_name(const String& value) const {
5825 ASSERT(is_native());
5826 ASSERT(raw_ptr()->data_ == Object::null());
5827 const Array& pair = Array::Handle(Array::New(2, Heap::kOld));
5828 pair.SetAt(0, value);
5829 // pair[1] will be the implicit closure function if needed.
5830 set_data(pair);
5831 }
5832
5833
5787 void Function::set_result_type(const AbstractType& value) const { 5834 void Function::set_result_type(const AbstractType& value) const {
5788 ASSERT(!value.IsNull()); 5835 ASSERT(!value.IsNull());
5789 StorePointer(&raw_ptr()->result_type_, value.raw()); 5836 StorePointer(&raw_ptr()->result_type_, value.raw());
5790 } 5837 }
5791 5838
5792 5839
5793 RawAbstractType* Function::ParameterTypeAt(intptr_t index) const { 5840 RawAbstractType* Function::ParameterTypeAt(intptr_t index) const {
5794 const Array& parameter_types = Array::Handle(raw_ptr()->parameter_types_); 5841 const Array& parameter_types = Array::Handle(raw_ptr()->parameter_types_);
5795 return AbstractType::RawCast(parameter_types.At(index)); 5842 return AbstractType::RawCast(parameter_types.At(index));
5796 } 5843 }
(...skipping 885 matching lines...) Expand 10 before | Expand all | Expand 10 after
6682 set_implicit_closure_function(closure_function); 6729 set_implicit_closure_function(closure_function);
6683 ASSERT(closure_function.IsImplicitClosureFunction()); 6730 ASSERT(closure_function.IsImplicitClosureFunction());
6684 return closure_function.raw(); 6731 return closure_function.raw();
6685 } 6732 }
6686 6733
6687 6734
6688 void Function::DropUncompiledImplicitClosureFunction() const { 6735 void Function::DropUncompiledImplicitClosureFunction() const {
6689 if (implicit_closure_function() != Function::null()) { 6736 if (implicit_closure_function() != Function::null()) {
6690 const Function& func = Function::Handle(implicit_closure_function()); 6737 const Function& func = Function::Handle(implicit_closure_function());
6691 if (!func.HasCode()) { 6738 if (!func.HasCode()) {
6692 set_data(Object::null_object()); 6739 set_implicit_closure_function(Function::Handle());
6693 } 6740 }
6694 } 6741 }
6695 } 6742 }
6696 6743
6697 6744
6698 RawString* Function::UserVisibleFormalParameters() const { 6745 RawString* Function::UserVisibleFormalParameters() const {
6699 // Typically 3, 5,.. elements in 'pieces', e.g.: 6746 // Typically 3, 5,.. elements in 'pieces', e.g.:
6700 // '_LoadRequest', CommaSpace, '_LoadError'. 6747 // '_LoadRequest', CommaSpace, '_LoadError'.
6701 GrowableHandlePtrArray<const String> pieces(Thread::Current()->zone(), 5); 6748 GrowableHandlePtrArray<const String> pieces(Thread::Current()->zone(), 5);
6702 const TypeArguments& instantiator = TypeArguments::Handle(); 6749 const TypeArguments& instantiator = TypeArguments::Handle();
(...skipping 2000 matching lines...) Expand 10 before | Expand all | Expand 10 after
8703 String& source = String::Handle(raw_ptr()->source_); 8750 String& source = String::Handle(raw_ptr()->source_);
8704 if (source.IsNull()) { 8751 if (source.IsNull()) {
8705 return GenerateSource(); 8752 return GenerateSource();
8706 } 8753 }
8707 return raw_ptr()->source_; 8754 return raw_ptr()->source_;
8708 } 8755 }
8709 8756
8710 8757
8711 RawString* Script::GenerateSource() const { 8758 RawString* Script::GenerateSource() const {
8712 const TokenStream& token_stream = TokenStream::Handle(tokens()); 8759 const TokenStream& token_stream = TokenStream::Handle(tokens());
8760 if (token_stream.IsNull()) {
8761 ASSERT(Dart::IsRunningPrecompiledCode());
8762 return String::null();
8763 }
8713 return token_stream.GenerateSource(); 8764 return token_stream.GenerateSource();
8714 } 8765 }
8715 8766
8716 8767
8717 RawGrowableObjectArray* Script::GenerateLineNumberArray() const { 8768 RawGrowableObjectArray* Script::GenerateLineNumberArray() const {
8718 Zone* zone = Thread::Current()->zone(); 8769 Zone* zone = Thread::Current()->zone();
8719 const GrowableObjectArray& info = 8770 const GrowableObjectArray& info =
8720 GrowableObjectArray::Handle(zone, GrowableObjectArray::New()); 8771 GrowableObjectArray::Handle(zone, GrowableObjectArray::New());
8721 const String& source = String::Handle(zone, Source()); 8772 const String& source = String::Handle(zone, Source());
8722 const String& key = Symbols::Empty(); 8773 const String& key = Symbols::Empty();
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
8866 StoreNonPointer(&raw_ptr()->col_offset_, col_offset); 8917 StoreNonPointer(&raw_ptr()->col_offset_, col_offset);
8867 } 8918 }
8868 8919
8869 8920
8870 void Script::GetTokenLocation(intptr_t token_pos, 8921 void Script::GetTokenLocation(intptr_t token_pos,
8871 intptr_t* line, 8922 intptr_t* line,
8872 intptr_t* column, 8923 intptr_t* column,
8873 intptr_t* token_len) const { 8924 intptr_t* token_len) const {
8874 ASSERT(line != NULL); 8925 ASSERT(line != NULL);
8875 const TokenStream& tkns = TokenStream::Handle(tokens()); 8926 const TokenStream& tkns = TokenStream::Handle(tokens());
8927 if (tkns.IsNull()) {
8928 ASSERT(Dart::IsRunningPrecompiledCode());
8929 *line = -1;
8930 if (column != NULL) {
8931 *column = -1;
8932 }
8933 if (token_len != NULL) {
8934 *token_len = 1;
8935 }
8936 return;
8937 }
8876 if (column == NULL) { 8938 if (column == NULL) {
8877 TokenStream::Iterator tkit(tkns, 0, TokenStream::Iterator::kAllTokens); 8939 TokenStream::Iterator tkit(tkns, 0, TokenStream::Iterator::kAllTokens);
8878 intptr_t cur_line = line_offset() + 1; 8940 intptr_t cur_line = line_offset() + 1;
8879 while (tkit.CurrentPosition() < token_pos && 8941 while (tkit.CurrentPosition() < token_pos &&
8880 tkit.CurrentTokenKind() != Token::kEOS) { 8942 tkit.CurrentTokenKind() != Token::kEOS) {
8881 if (tkit.CurrentTokenKind() == Token::kNEWLINE) { 8943 if (tkit.CurrentTokenKind() == Token::kNEWLINE) {
8882 cur_line++; 8944 cur_line++;
8883 } 8945 }
8884 tkit.Advance(); 8946 tkit.Advance();
8885 } 8947 }
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after
9108 jsobj.AddProperty("_kind", GetKindAsCString()); 9170 jsobj.AddProperty("_kind", GetKindAsCString());
9109 if (ref) { 9171 if (ref) {
9110 return; 9172 return;
9111 } 9173 }
9112 if (!lib.IsNull()) { 9174 if (!lib.IsNull()) {
9113 jsobj.AddProperty("library", lib); 9175 jsobj.AddProperty("library", lib);
9114 } 9176 }
9115 const String& source = String::Handle(Source()); 9177 const String& source = String::Handle(Source());
9116 jsobj.AddProperty("lineOffset", line_offset()); 9178 jsobj.AddProperty("lineOffset", line_offset());
9117 jsobj.AddProperty("columnOffset", col_offset()); 9179 jsobj.AddProperty("columnOffset", col_offset());
9118 jsobj.AddPropertyStr("source", source); 9180 if (!source.IsNull()) {
9181 jsobj.AddPropertyStr("source", source);
9182 }
9119 9183
9120 // Print the line number table 9184 // Print the line number table
9121 { 9185 if (!source.IsNull()) {
9122 JSONArray tokenPosTable(&jsobj, "tokenPosTable"); 9186 JSONArray tokenPosTable(&jsobj, "tokenPosTable");
9123 9187
9124 const GrowableObjectArray& lineNumberArray = 9188 const GrowableObjectArray& lineNumberArray =
9125 GrowableObjectArray::Handle(GenerateLineNumberArray()); 9189 GrowableObjectArray::Handle(GenerateLineNumberArray());
9126 Object& value = Object::Handle(); 9190 Object& value = Object::Handle();
9127 intptr_t pos = 0; 9191 intptr_t pos = 0;
9128 9192
9129 // Skip leading null. 9193 // Skip leading null.
9130 ASSERT(lineNumberArray.Length() > 0); 9194 ASSERT(lineNumberArray.Length() > 0);
9131 value = lineNumberArray.At(pos); 9195 value = lineNumberArray.At(pos);
(...skipping 12771 matching lines...) Expand 10 before | Expand all | Expand 10 after
21903 return tag_label.ToCString(); 21967 return tag_label.ToCString();
21904 } 21968 }
21905 21969
21906 21970
21907 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { 21971 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const {
21908 Instance::PrintJSONImpl(stream, ref); 21972 Instance::PrintJSONImpl(stream, ref);
21909 } 21973 }
21910 21974
21911 21975
21912 } // namespace dart 21976 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/object.h ('k') | runtime/vm/parser.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698