| 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 "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 2102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2113 ASSERT(func.Owner() == raw()); | 2113 ASSERT(func.Owner() == raw()); |
| 2114 set.Insert(func); | 2114 set.Insert(func); |
| 2115 } | 2115 } |
| 2116 } | 2116 } |
| 2117 StorePointer(&raw_ptr()->functions_hash_table_, set.Release().raw()); | 2117 StorePointer(&raw_ptr()->functions_hash_table_, set.Release().raw()); |
| 2118 } | 2118 } |
| 2119 | 2119 |
| 2120 | 2120 |
| 2121 void Class::AddFunction(const Function& function) const { | 2121 void Class::AddFunction(const Function& function) const { |
| 2122 const Array& arr = Array::Handle(functions()); | 2122 const Array& arr = Array::Handle(functions()); |
| 2123 const Array& new_arr = Array::Handle(Array::Grow(arr, arr.Length() + 1)); | 2123 const Array& new_arr = |
| 2124 Array::Handle(Array::Grow(arr, arr.Length() + 1, Heap::kOld)); |
| 2124 new_arr.SetAt(arr.Length(), function); | 2125 new_arr.SetAt(arr.Length(), function); |
| 2125 StorePointer(&raw_ptr()->functions_, new_arr.raw()); | 2126 StorePointer(&raw_ptr()->functions_, new_arr.raw()); |
| 2126 // Add to hash table, if any. | 2127 // Add to hash table, if any. |
| 2127 const intptr_t new_len = new_arr.Length(); | 2128 const intptr_t new_len = new_arr.Length(); |
| 2128 if (new_len == kFunctionLookupHashTreshold) { | 2129 if (new_len == kFunctionLookupHashTreshold) { |
| 2129 // Transition to using hash table. | 2130 // Transition to using hash table. |
| 2130 SetFunctions(new_arr); | 2131 SetFunctions(new_arr); |
| 2131 } else if (new_len > kFunctionLookupHashTreshold) { | 2132 } else if (new_len > kFunctionLookupHashTreshold) { |
| 2132 ClassFunctionsSet set(raw_ptr()->functions_hash_table_); | 2133 ClassFunctionsSet set(raw_ptr()->functions_hash_table_); |
| 2133 set.Insert(function); | 2134 set.Insert(function); |
| (...skipping 5041 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7175 return "RedirectionData class"; | 7176 return "RedirectionData class"; |
| 7176 } | 7177 } |
| 7177 | 7178 |
| 7178 | 7179 |
| 7179 void RedirectionData::PrintJSONImpl(JSONStream* stream, bool ref) const { | 7180 void RedirectionData::PrintJSONImpl(JSONStream* stream, bool ref) const { |
| 7180 Object::PrintJSONImpl(stream, ref); | 7181 Object::PrintJSONImpl(stream, ref); |
| 7181 } | 7182 } |
| 7182 | 7183 |
| 7183 | 7184 |
| 7184 RawString* Field::GetterName(const String& field_name) { | 7185 RawString* Field::GetterName(const String& field_name) { |
| 7185 return Field::GetterSymbol(field_name); | 7186 return String::Concat(Symbols::GetterPrefix(), field_name); |
| 7186 } | 7187 } |
| 7187 | 7188 |
| 7188 | 7189 |
| 7189 RawString* Field::GetterSymbol(const String& field_name) { | 7190 RawString* Field::GetterSymbol(const String& field_name) { |
| 7190 return Symbols::FromConcat(Symbols::GetterPrefix(), field_name); | 7191 return Symbols::FromConcat(Symbols::GetterPrefix(), field_name); |
| 7191 } | 7192 } |
| 7192 | 7193 |
| 7193 | 7194 |
| 7195 RawString* Field::LookupGetterSymbol(const String& field_name) { |
| 7196 return Symbols::LookupFromConcat(Symbols::GetterPrefix(), field_name); |
| 7197 } |
| 7198 |
| 7199 |
| 7194 RawString* Field::SetterName(const String& field_name) { | 7200 RawString* Field::SetterName(const String& field_name) { |
| 7195 return String::Concat(Symbols::SetterPrefix(), field_name); | 7201 return String::Concat(Symbols::SetterPrefix(), field_name); |
| 7196 } | 7202 } |
| 7197 | 7203 |
| 7198 | 7204 |
| 7199 RawString* Field::SetterSymbol(const String& field_name) { | 7205 RawString* Field::SetterSymbol(const String& field_name) { |
| 7200 return Symbols::FromConcat(Symbols::SetterPrefix(), field_name); | 7206 return Symbols::FromConcat(Symbols::SetterPrefix(), field_name); |
| 7201 } | 7207 } |
| 7202 | 7208 |
| 7203 | 7209 |
| 7210 RawString* Field::LookupSetterSymbol(const String& field_name) { |
| 7211 return Symbols::LookupFromConcat(Symbols::SetterPrefix(), field_name); |
| 7212 } |
| 7213 |
| 7214 |
| 7204 RawString* Field::NameFromGetter(const String& getter_name) { | 7215 RawString* Field::NameFromGetter(const String& getter_name) { |
| 7205 return Symbols::New(getter_name, kGetterPrefixLength, | 7216 return Symbols::New(getter_name, kGetterPrefixLength, |
| 7206 getter_name.Length() - kGetterPrefixLength); | 7217 getter_name.Length() - kGetterPrefixLength); |
| 7207 } | 7218 } |
| 7208 | 7219 |
| 7209 | 7220 |
| 7210 RawString* Field::NameFromSetter(const String& setter_name) { | 7221 RawString* Field::NameFromSetter(const String& setter_name) { |
| 7211 return Symbols::New(setter_name, kSetterPrefixLength, | 7222 return Symbols::New(setter_name, kSetterPrefixLength, |
| 7212 setter_name.Length() - kSetterPrefixLength); | 7223 setter_name.Length() - kSetterPrefixLength); |
| 7213 } | 7224 } |
| (...skipping 3488 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10702 RawObject* Namespace::Lookup(const String& name) const { | 10713 RawObject* Namespace::Lookup(const String& name) const { |
| 10703 Isolate* isolate = Isolate::Current(); | 10714 Isolate* isolate = Isolate::Current(); |
| 10704 const Library& lib = Library::Handle(isolate, library()); | 10715 const Library& lib = Library::Handle(isolate, library()); |
| 10705 intptr_t ignore = 0; | 10716 intptr_t ignore = 0; |
| 10706 | 10717 |
| 10707 // Lookup the name in the library's symbols. | 10718 // Lookup the name in the library's symbols. |
| 10708 Object& obj = Object::Handle(isolate, lib.LookupEntry(name, &ignore)); | 10719 Object& obj = Object::Handle(isolate, lib.LookupEntry(name, &ignore)); |
| 10709 if (!Field::IsGetterName(name) && | 10720 if (!Field::IsGetterName(name) && |
| 10710 !Field::IsSetterName(name) && | 10721 !Field::IsSetterName(name) && |
| 10711 (obj.IsNull() || obj.IsLibraryPrefix())) { | 10722 (obj.IsNull() || obj.IsLibraryPrefix())) { |
| 10712 obj = lib.LookupEntry(String::Handle(Field::GetterName(name)), &ignore); | 10723 const String& getter_name = String::Handle(Field::LookupGetterSymbol(name)); |
| 10724 if (!getter_name.IsNull()) { |
| 10725 obj = lib.LookupEntry(getter_name, &ignore); |
| 10726 } |
| 10713 if (obj.IsNull()) { | 10727 if (obj.IsNull()) { |
| 10714 obj = lib.LookupEntry(String::Handle(Field::SetterName(name)), &ignore); | 10728 const String& setter_name = |
| 10729 String::Handle(Field::LookupSetterSymbol(name)); |
| 10730 if (!setter_name.IsNull()) { |
| 10731 obj = lib.LookupEntry(setter_name, &ignore); |
| 10732 } |
| 10715 } | 10733 } |
| 10716 } | 10734 } |
| 10717 | 10735 |
| 10718 // Library prefixes are not exported. | 10736 // Library prefixes are not exported. |
| 10719 if (obj.IsNull() || obj.IsLibraryPrefix()) { | 10737 if (obj.IsNull() || obj.IsLibraryPrefix()) { |
| 10720 // Lookup in the re-exported symbols. | 10738 // Lookup in the re-exported symbols. |
| 10721 obj = lib.LookupReExport(name); | 10739 obj = lib.LookupReExport(name); |
| 10722 } | 10740 } |
| 10723 if (obj.IsNull() || HidesName(name) || obj.IsLibraryPrefix()) { | 10741 if (obj.IsNull() || HidesName(name) || obj.IsLibraryPrefix()) { |
| 10724 return Object::null(); | 10742 return Object::null(); |
| (...skipping 6241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 16966 } | 16984 } |
| 16967 return Integer::null(); // Notify caller that a bigint operation is required. | 16985 return Integer::null(); // Notify caller that a bigint operation is required. |
| 16968 } | 16986 } |
| 16969 | 16987 |
| 16970 | 16988 |
| 16971 static bool Are64bitOperands(const Integer& op1, const Integer& op2) { | 16989 static bool Are64bitOperands(const Integer& op1, const Integer& op2) { |
| 16972 return !op1.IsBigint() && !op2.IsBigint(); | 16990 return !op1.IsBigint() && !op2.IsBigint(); |
| 16973 } | 16991 } |
| 16974 | 16992 |
| 16975 | 16993 |
| 16976 RawInteger* Integer::BitOp(Token::Kind kind, const Integer& other) const { | 16994 RawInteger* Integer::BitOp( |
| 16995 Token::Kind kind, const Integer& other, Heap::Space space) const { |
| 16977 if (IsSmi() && other.IsSmi()) { | 16996 if (IsSmi() && other.IsSmi()) { |
| 16978 intptr_t op1_value = Smi::Value(Smi::RawCast(raw())); | 16997 intptr_t op1_value = Smi::Value(Smi::RawCast(raw())); |
| 16979 intptr_t op2_value = Smi::Value(Smi::RawCast(other.raw())); | 16998 intptr_t op2_value = Smi::Value(Smi::RawCast(other.raw())); |
| 16980 intptr_t result = 0; | 16999 intptr_t result = 0; |
| 16981 switch (kind) { | 17000 switch (kind) { |
| 16982 case Token::kBIT_AND: | 17001 case Token::kBIT_AND: |
| 16983 result = op1_value & op2_value; | 17002 result = op1_value & op2_value; |
| 16984 break; | 17003 break; |
| 16985 case Token::kBIT_OR: | 17004 case Token::kBIT_OR: |
| 16986 result = op1_value | op2_value; | 17005 result = op1_value | op2_value; |
| 16987 break; | 17006 break; |
| 16988 case Token::kBIT_XOR: | 17007 case Token::kBIT_XOR: |
| 16989 result = op1_value ^ op2_value; | 17008 result = op1_value ^ op2_value; |
| 16990 break; | 17009 break; |
| 16991 default: | 17010 default: |
| 16992 UNIMPLEMENTED(); | 17011 UNIMPLEMENTED(); |
| 16993 } | 17012 } |
| 16994 ASSERT(Smi::IsValid(result)); | 17013 ASSERT(Smi::IsValid(result)); |
| 16995 return Smi::New(result); | 17014 return Smi::New(result); |
| 16996 } else if (Are64bitOperands(*this, other)) { | 17015 } else if (Are64bitOperands(*this, other)) { |
| 16997 int64_t a = AsInt64Value(); | 17016 int64_t a = AsInt64Value(); |
| 16998 int64_t b = other.AsInt64Value(); | 17017 int64_t b = other.AsInt64Value(); |
| 16999 switch (kind) { | 17018 switch (kind) { |
| 17000 case Token::kBIT_AND: | 17019 case Token::kBIT_AND: |
| 17001 return Integer::New(a & b); | 17020 return Integer::New(a & b, space); |
| 17002 case Token::kBIT_OR: | 17021 case Token::kBIT_OR: |
| 17003 return Integer::New(a | b); | 17022 return Integer::New(a | b, space); |
| 17004 case Token::kBIT_XOR: | 17023 case Token::kBIT_XOR: |
| 17005 return Integer::New(a ^ b); | 17024 return Integer::New(a ^ b, space); |
| 17006 default: | 17025 default: |
| 17007 UNIMPLEMENTED(); | 17026 UNIMPLEMENTED(); |
| 17008 } | 17027 } |
| 17009 } | 17028 } |
| 17010 return Integer::null(); // Notify caller that a bigint operation is required. | 17029 return Integer::null(); // Notify caller that a bigint operation is required. |
| 17011 } | 17030 } |
| 17012 | 17031 |
| 17013 | 17032 |
| 17014 // TODO(srdjan): Clarify handling of negative right operand in a shift op. | 17033 // TODO(srdjan): Clarify handling of negative right operand in a shift op. |
| 17015 RawInteger* Smi::ShiftOp(Token::Kind kind, | 17034 RawInteger* Smi::ShiftOp(Token::Kind kind, |
| 17016 const Smi& other, | 17035 const Smi& other, |
| 17036 Heap::Space space, |
| 17017 const bool silent) const { | 17037 const bool silent) const { |
| 17018 intptr_t result = 0; | 17038 intptr_t result = 0; |
| 17019 const intptr_t left_value = Value(); | 17039 const intptr_t left_value = Value(); |
| 17020 const intptr_t right_value = other.Value(); | 17040 const intptr_t right_value = other.Value(); |
| 17021 ASSERT(right_value >= 0); | 17041 ASSERT(right_value >= 0); |
| 17022 switch (kind) { | 17042 switch (kind) { |
| 17023 case Token::kSHL: { | 17043 case Token::kSHL: { |
| 17024 if ((left_value == 0) || (right_value == 0)) { | 17044 if ((left_value == 0) || (right_value == 0)) { |
| 17025 return raw(); | 17045 return raw(); |
| 17026 } | 17046 } |
| 17027 { // Check for overflow. | 17047 { // Check for overflow. |
| 17028 int cnt = Utils::BitLength(left_value); | 17048 int cnt = Utils::BitLength(left_value); |
| 17029 if ((cnt + right_value) > Smi::kBits) { | 17049 if ((cnt + right_value) > Smi::kBits) { |
| 17030 if ((cnt + right_value) > Mint::kBits) { | 17050 if ((cnt + right_value) > Mint::kBits) { |
| 17031 return Bigint::NewFromShiftedInt64(left_value, right_value); | 17051 return Bigint::NewFromShiftedInt64(left_value, right_value, space); |
| 17032 } else { | 17052 } else { |
| 17033 int64_t left_64 = left_value; | 17053 int64_t left_64 = left_value; |
| 17034 return Integer::New(left_64 << right_value, Heap::kNew, silent); | 17054 return Integer::New(left_64 << right_value, space, silent); |
| 17035 } | 17055 } |
| 17036 } | 17056 } |
| 17037 } | 17057 } |
| 17038 result = left_value << right_value; | 17058 result = left_value << right_value; |
| 17039 break; | 17059 break; |
| 17040 } | 17060 } |
| 17041 case Token::kSHR: { | 17061 case Token::kSHR: { |
| 17042 const intptr_t shift_amount = | 17062 const intptr_t shift_amount = |
| 17043 (right_value >= kBitsPerWord) ? (kBitsPerWord - 1) : right_value; | 17063 (right_value >= kBitsPerWord) ? (kBitsPerWord - 1) : right_value; |
| 17044 result = left_value >> shift_amount; | 17064 result = left_value >> shift_amount; |
| (...skipping 4463 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 21508 return tag_label.ToCString(); | 21528 return tag_label.ToCString(); |
| 21509 } | 21529 } |
| 21510 | 21530 |
| 21511 | 21531 |
| 21512 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { | 21532 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { |
| 21513 Instance::PrintJSONImpl(stream, ref); | 21533 Instance::PrintJSONImpl(stream, ref); |
| 21514 } | 21534 } |
| 21515 | 21535 |
| 21516 | 21536 |
| 21517 } // namespace dart | 21537 } // namespace dart |
| OLD | NEW |