Index: runtime/vm/object.cc |
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc |
index f466a1007ce04a82191c854bf66b399735f39d3e..6e181729e5cd930ad7fbafb10dda91f72b20b409 100644 |
--- a/runtime/vm/object.cc |
+++ b/runtime/vm/object.cc |
@@ -3422,14 +3422,16 @@ TokenPosition Class::ComputeEndTokenPos() const { |
if (is_synthesized_class() || IsMixinApplication() || IsTopLevel()) { |
return token_pos(); |
} |
- const Script& scr = Script::Handle(script()); |
+ Zone* zone = Thread::Current()->zone(); |
+ const Script& scr = Script::Handle(zone, script()); |
ASSERT(!scr.IsNull()); |
- const TokenStream& tkns = TokenStream::Handle(scr.tokens()); |
+ const TokenStream& tkns = TokenStream::Handle(zone, scr.tokens()); |
if (tkns.IsNull()) { |
ASSERT(Dart::IsRunningPrecompiledCode()); |
return TokenPosition::kNoSource; |
} |
- TokenStream::Iterator tkit(tkns, |
+ TokenStream::Iterator tkit(zone, |
+ tkns, |
token_pos(), |
TokenStream::Iterator::kNoNewlines); |
intptr_t level = 0; |
@@ -7077,20 +7079,20 @@ bool Function::HasInstantiatedSignature() const { |
RawClass* Function::Owner() const { |
- const Object& obj = Object::Handle(raw_ptr()->owner_); |
- if (obj.IsClass()) { |
- return Class::Cast(obj).raw(); |
+ if (raw_ptr()->owner_->IsClass()) { |
+ return Class::RawCast(raw_ptr()->owner_); |
} |
+ const Object& obj = Object::Handle(raw_ptr()->owner_); |
ASSERT(obj.IsPatchClass()); |
return PatchClass::Cast(obj).patched_class(); |
} |
RawClass* Function::origin() const { |
- const Object& obj = Object::Handle(raw_ptr()->owner_); |
- if (obj.IsClass()) { |
- return Class::Cast(obj).raw(); |
+ if (raw_ptr()->owner_->IsClass()) { |
+ return Class::RawCast(raw_ptr()->owner_); |
} |
+ const Object& obj = Object::Handle(raw_ptr()->owner_); |
ASSERT(obj.IsPatchClass()); |
return PatchClass::Cast(obj).origin_class(); |
} |
@@ -7163,15 +7165,16 @@ RawString* Function::GetSource() const { |
// constructor from the mixin to use. |
return String::null(); |
} |
- const Script& func_script = Script::Handle(script()); |
- const TokenStream& stream = TokenStream::Handle(func_script.tokens()); |
+ Zone* zone = Thread::Current()->zone(); |
+ const Script& func_script = Script::Handle(zone, script()); |
+ const TokenStream& stream = TokenStream::Handle(zone, func_script.tokens()); |
if (!func_script.HasSource()) { |
// When source is not available, avoid printing the whole token stream and |
// doing expensive position calculations. |
return stream.GenerateSource(token_pos(), end_token_pos().Next()); |
} |
- const TokenStream::Iterator tkit(stream, end_token_pos()); |
+ const TokenStream::Iterator tkit(zone, stream, end_token_pos()); |
intptr_t from_line; |
intptr_t from_col; |
intptr_t to_line; |
@@ -7188,10 +7191,10 @@ RawString* Function::GetSource() const { |
if ((tkit.CurrentTokenKind() == Token::kCOMMA) || // Case 1. |
(tkit.CurrentTokenKind() == Token::kRPAREN) || // Case 2. |
(tkit.CurrentTokenKind() == Token::kSEMICOLON && |
- String::Handle(name()).Equals("<anonymous closure>"))) { // Case 3. |
+ String::Handle(zone, name()).Equals("<anonymous closure>"))) { // Cas 3. |
last_tok_len = 0; |
} |
- const String& result = String::Handle(func_script.GetSnippet( |
+ const String& result = String::Handle(zone, func_script.GetSnippet( |
from_line, from_col, to_line, to_col + last_tok_len)); |
ASSERT(!result.IsNull()); |
return result.raw(); |
@@ -7202,10 +7205,13 @@ RawString* Function::GetSource() const { |
// arguments. |
int32_t Function::SourceFingerprint() const { |
uint32_t result = 0; |
- TokenStream::Iterator tokens_iterator(TokenStream::Handle( |
- Script::Handle(script()).tokens()), token_pos()); |
- Object& obj = Object::Handle(); |
- String& literal = String::Handle(); |
+ Zone* zone = Thread::Current()->zone(); |
+ TokenStream::Iterator tokens_iterator( |
+ zone, |
+ TokenStream::Handle(zone, Script::Handle(zone, script()).tokens()), |
+ token_pos()); |
+ Object& obj = Object::Handle(zone); |
+ String& literal = String::Handle(zone); |
while (tokens_iterator.CurrentPosition() < end_token_pos()) { |
uint32_t val = 0; |
obj = tokens_iterator.CurrentToken(); |
@@ -8220,18 +8226,20 @@ RawString* TokenStream::GenerateSource() const { |
RawString* TokenStream::GenerateSource(TokenPosition start_pos, |
TokenPosition end_pos) const { |
- Iterator iterator(*this, start_pos, Iterator::kAllTokens); |
- const ExternalTypedData& data = ExternalTypedData::Handle(GetStream()); |
+ Zone* zone = Thread::Current()->zone(); |
+ Iterator iterator(zone, *this, start_pos, Iterator::kAllTokens); |
+ const ExternalTypedData& data = ExternalTypedData::Handle(zone, GetStream()); |
const GrowableObjectArray& literals = |
- GrowableObjectArray::Handle(GrowableObjectArray::New(data.Length())); |
- const String& private_key = String::Handle(PrivateKey()); |
+ GrowableObjectArray::Handle(zone, |
+ GrowableObjectArray::New(data.Length())); |
+ const String& private_key = String::Handle(zone, PrivateKey()); |
intptr_t private_len = private_key.Length(); |
Token::Kind curr = iterator.CurrentTokenKind(); |
Token::Kind prev = Token::kILLEGAL; |
// Handles used in the loop. |
- Object& obj = Object::Handle(); |
- String& literal = String::Handle(); |
+ Object& obj = Object::Handle(zone); |
+ String& literal = String::Handle(zone); |
// Current indentation level. |
int indent = 0; |
@@ -8405,7 +8413,11 @@ RawString* TokenStream::GenerateSource(TokenPosition start_pos, |
TokenPosition TokenStream::ComputeSourcePosition( |
TokenPosition tok_pos) const { |
- Iterator iterator(*this, TokenPosition::kMinSource, Iterator::kAllTokens); |
+ Zone* zone = Thread::Current()->zone(); |
+ Iterator iterator(zone, |
+ *this, |
+ TokenPosition::kMinSource, |
+ Iterator::kAllTokens); |
TokenPosition src_pos = TokenPosition::kMinSource; |
Token::Kind kind = iterator.CurrentTokenKind(); |
while ((iterator.CurrentPosition() < tok_pos) && (kind != Token::kEOS)) { |
@@ -8669,15 +8681,16 @@ const char* TokenStream::ToCString() const { |
} |
-TokenStream::Iterator::Iterator(const TokenStream& tokens, |
+TokenStream::Iterator::Iterator(Zone* zone, |
+ const TokenStream& tokens, |
TokenPosition token_pos, |
Iterator::StreamType stream_type) |
- : tokens_(TokenStream::Handle(tokens.raw())), |
- data_(ExternalTypedData::Handle(tokens.GetStream())), |
+ : tokens_(TokenStream::Handle(zone, tokens.raw())), |
+ data_(ExternalTypedData::Handle(zone, tokens.GetStream())), |
stream_(reinterpret_cast<uint8_t*>(data_.DataAddr(0)), data_.Length()), |
- token_objects_(Array::Handle( |
- GrowableObjectArray::Handle(tokens.TokenObjects()).data())), |
- obj_(Object::Handle()), |
+ token_objects_(Array::Handle(zone, |
+ GrowableObjectArray::Handle(zone, tokens.TokenObjects()).data())), |
+ obj_(Object::Handle(zone)), |
cur_token_pos_(token_pos.Pos()), |
cur_token_kind_(Token::kILLEGAL), |
cur_token_obj_index_(-1), |
@@ -8840,7 +8853,8 @@ RawGrowableObjectArray* Script::GenerateLineNumberArray() const { |
Smi& value = Smi::Handle(zone); |
String& tokenValue = String::Handle(zone); |
ASSERT(!tkns.IsNull()); |
- TokenStream::Iterator tkit(tkns, |
+ TokenStream::Iterator tkit(zone, |
+ tkns, |
TokenPosition::kMinSource, |
TokenStream::Iterator::kAllTokens); |
int current_line = -1; |
@@ -8989,7 +9003,8 @@ void Script::GetTokenLocation(TokenPosition token_pos, |
intptr_t* column, |
intptr_t* token_len) const { |
ASSERT(line != NULL); |
- const TokenStream& tkns = TokenStream::Handle(tokens()); |
+ Zone* zone = Thread::Current()->zone(); |
+ const TokenStream& tkns = TokenStream::Handle(zone, tokens()); |
if (tkns.IsNull()) { |
ASSERT(Dart::IsRunningPrecompiledCode()); |
*line = -1; |
@@ -9002,7 +9017,8 @@ void Script::GetTokenLocation(TokenPosition token_pos, |
return; |
} |
if (column == NULL) { |
- TokenStream::Iterator tkit(tkns, |
+ TokenStream::Iterator tkit(zone, |
+ tkns, |
TokenPosition::kMinSource, |
TokenStream::Iterator::kAllTokens); |
intptr_t cur_line = line_offset() + 1; |
@@ -9015,7 +9031,7 @@ void Script::GetTokenLocation(TokenPosition token_pos, |
} |
*line = cur_line; |
} else { |
- const String& src = String::Handle(Source()); |
+ const String& src = String::Handle(zone, Source()); |
TokenPosition src_pos = tkns.ComputeSourcePosition(token_pos); |
Scanner scanner(src, Symbols::Empty()); |
scanner.ScanTo(src_pos); |
@@ -9042,12 +9058,14 @@ void Script::TokenRangeAtLine(intptr_t line_number, |
TokenPosition* last_token_index) const { |
ASSERT(first_token_index != NULL && last_token_index != NULL); |
ASSERT(line_number > 0); |
+ Zone* zone = Thread::Current()->zone(); |
*first_token_index = TokenPosition::kNoSource; |
*last_token_index = TokenPosition::kNoSource; |
- const TokenStream& tkns = TokenStream::Handle(tokens()); |
+ const TokenStream& tkns = TokenStream::Handle(zone, tokens()); |
line_number -= line_offset(); |
if (line_number < 1) line_number = 1; |
- TokenStream::Iterator tkit(tkns, |
+ TokenStream::Iterator tkit(zone, |
+ tkns, |
TokenPosition::kMinSource, |
TokenStream::Iterator::kAllTokens); |
// Scan through the token stream to the required line. |
@@ -16365,10 +16383,11 @@ bool Type::IsMalformed() const { |
if (raw_ptr()->sig_or_err_.error_ == LanguageError::null()) { |
return false; // Valid type, but not a function type. |
} |
- const LanguageError& type_error = LanguageError::Handle(error()); |
- if (type_error.IsNull()) { |
+ if (!raw_ptr()->sig_or_err_.error_->IsLanguageError()) { |
return false; // Valid function type. |
} |
+ const LanguageError& type_error = LanguageError::Handle(error()); |
+ ASSERT(!type_error.IsNull()); |
return type_error.kind() == Report::kMalformedType; |
} |
@@ -16380,10 +16399,11 @@ bool Type::IsMalbounded() const { |
if (!Isolate::Current()->type_checks()) { |
return false; |
} |
- const LanguageError& type_error = LanguageError::Handle(error()); |
- if (type_error.IsNull()) { |
+ if (!raw_ptr()->sig_or_err_.error_->IsLanguageError()) { |
return false; // Valid function type. |
} |
+ const LanguageError& type_error = LanguageError::Handle(error()); |
+ ASSERT(!type_error.IsNull()); |
return type_error.kind() == Report::kMalboundedType; |
} |
@@ -16405,9 +16425,8 @@ bool Type::IsMalformedOrMalbounded() const { |
RawLanguageError* Type::error() const { |
- const Object& type_error = Object::Handle(raw_ptr()->sig_or_err_.error_); |
- if (type_error.IsLanguageError()) { |
- return LanguageError::RawCast(type_error.raw()); |
+ if (raw_ptr()->sig_or_err_.error_->IsLanguageError()) { |
+ return LanguageError::RawCast(raw_ptr()->sig_or_err_.error_); |
} |
return LanguageError::null(); |
} |