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/bigint_operations.h" | 10 #include "vm/bigint_operations.h" |
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
237 // TODO(iposva): NoGCScope needs to be added here. | 237 // TODO(iposva): NoGCScope needs to be added here. |
238 ASSERT(class_class() == null_); | 238 ASSERT(class_class() == null_); |
239 // Initialize the static vtable values. | 239 // Initialize the static vtable values. |
240 { | 240 { |
241 Object fake_object; | 241 Object fake_object; |
242 Smi fake_smi; | 242 Smi fake_smi; |
243 Object::handle_vtable_ = fake_object.vtable(); | 243 Object::handle_vtable_ = fake_object.vtable(); |
244 Smi::handle_vtable_ = fake_smi.vtable(); | 244 Smi::handle_vtable_ = fake_smi.vtable(); |
245 } | 245 } |
246 | 246 |
247 // Allocate the read only object handles here. | |
248 empty_array_ = reinterpret_cast<Array*>(Dart::AllocateReadOnlyHandle()); | |
249 sentinel_ = reinterpret_cast<Instance*>(Dart::AllocateReadOnlyHandle()); | |
250 transition_sentinel_ = | |
251 reinterpret_cast<Instance*>(Dart::AllocateReadOnlyHandle()); | |
252 bool_true_ = reinterpret_cast<Bool*>(Dart::AllocateReadOnlyHandle()); | |
253 bool_false_ = reinterpret_cast<Bool*>(Dart::AllocateReadOnlyHandle()); | |
254 | |
255 Isolate* isolate = Isolate::Current(); | 247 Isolate* isolate = Isolate::Current(); |
256 Heap* heap = isolate->heap(); | 248 Heap* heap = isolate->heap(); |
| 249 |
| 250 // Allocate the read only object handles here. |
| 251 empty_array_ = Array::ReadOnlyHandle(isolate); |
| 252 sentinel_ = Instance::ReadOnlyHandle(isolate); |
| 253 transition_sentinel_ = Instance::ReadOnlyHandle(isolate); |
| 254 bool_true_ = Bool::ReadOnlyHandle(isolate); |
| 255 bool_false_ = Bool::ReadOnlyHandle(isolate); |
| 256 |
257 // Allocate and initialize the null instance. | 257 // Allocate and initialize the null instance. |
258 // 'null_' must be the first object allocated as it is used in allocation to | 258 // 'null_' must be the first object allocated as it is used in allocation to |
259 // clear the object. | 259 // clear the object. |
260 { | 260 { |
261 uword address = heap->Allocate(Instance::InstanceSize(), Heap::kOld); | 261 uword address = heap->Allocate(Instance::InstanceSize(), Heap::kOld); |
262 null_ = reinterpret_cast<RawInstance*>(address + kHeapObjectTag); | 262 null_ = reinterpret_cast<RawInstance*>(address + kHeapObjectTag); |
263 // The call below is using 'null_' to initialize itself. | 263 // The call below is using 'null_' to initialize itself. |
264 InitializeObject(address, kNullCid, Instance::InstanceSize()); | 264 InitializeObject(address, kNullCid, Instance::InstanceSize()); |
265 } | 265 } |
266 | 266 |
(...skipping 1176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1443 StorePointer(&raw_ptr()->canonical_types_, Object::empty_array().raw()); | 1443 StorePointer(&raw_ptr()->canonical_types_, Object::empty_array().raw()); |
1444 StorePointer(&raw_ptr()->functions_, Object::empty_array().raw()); | 1444 StorePointer(&raw_ptr()->functions_, Object::empty_array().raw()); |
1445 StorePointer(&raw_ptr()->fields_, Object::empty_array().raw()); | 1445 StorePointer(&raw_ptr()->fields_, Object::empty_array().raw()); |
1446 } | 1446 } |
1447 | 1447 |
1448 | 1448 |
1449 bool Class::HasInstanceFields() const { | 1449 bool Class::HasInstanceFields() const { |
1450 const Array& field_array = Array::Handle(fields()); | 1450 const Array& field_array = Array::Handle(fields()); |
1451 Field& field = Field::Handle(); | 1451 Field& field = Field::Handle(); |
1452 for (intptr_t i = 0; i < field_array.Length(); ++i) { | 1452 for (intptr_t i = 0; i < field_array.Length(); ++i) { |
1453 field |= field_array.At(i); | 1453 field ^= field_array.At(i); |
1454 if (!field.is_static()) { | 1454 if (!field.is_static()) { |
1455 return true; | 1455 return true; |
1456 } | 1456 } |
1457 } | 1457 } |
1458 return false; | 1458 return false; |
1459 } | 1459 } |
1460 | 1460 |
1461 | 1461 |
1462 void Class::SetFunctions(const Array& value) const { | 1462 void Class::SetFunctions(const Array& value) const { |
1463 ASSERT(!value.IsNull()); | 1463 ASSERT(!value.IsNull()); |
1464 #if defined(DEBUG) | 1464 #if defined(DEBUG) |
1465 // Verify that all the functions in the array have this class as owner. | 1465 // Verify that all the functions in the array have this class as owner. |
1466 Function& func = Function::Handle(); | 1466 Function& func = Function::Handle(); |
1467 intptr_t len = value.Length(); | 1467 intptr_t len = value.Length(); |
1468 for (intptr_t i = 0; i < len; i++) { | 1468 for (intptr_t i = 0; i < len; i++) { |
1469 func |= value.At(i); | 1469 func ^= value.At(i); |
1470 ASSERT(func.Owner() == raw()); | 1470 ASSERT(func.Owner() == raw()); |
1471 } | 1471 } |
1472 #endif | 1472 #endif |
1473 StorePointer(&raw_ptr()->functions_, value.raw()); | 1473 StorePointer(&raw_ptr()->functions_, value.raw()); |
1474 } | 1474 } |
1475 | 1475 |
1476 | 1476 |
1477 void Class::AddFunction(const Function& function) const { | 1477 void Class::AddFunction(const Function& function) const { |
1478 const Array& arr = Array::Handle(functions()); | 1478 const Array& arr = Array::Handle(functions()); |
1479 const Array& new_arr = Array::Handle(Array::Grow(arr, arr.Length() + 1)); | 1479 const Array& new_arr = Array::Handle(Array::Grow(arr, arr.Length() + 1)); |
(...skipping 19 matching lines...) Expand all Loading... |
1499 if (raw_ptr()->closure_functions_ == GrowableObjectArray::null()) { | 1499 if (raw_ptr()->closure_functions_ == GrowableObjectArray::null()) { |
1500 return Function::null(); | 1500 return Function::null(); |
1501 } | 1501 } |
1502 const GrowableObjectArray& closures = | 1502 const GrowableObjectArray& closures = |
1503 GrowableObjectArray::Handle(raw_ptr()->closure_functions_); | 1503 GrowableObjectArray::Handle(raw_ptr()->closure_functions_); |
1504 Function& closure = Function::Handle(); | 1504 Function& closure = Function::Handle(); |
1505 intptr_t num_closures = closures.Length(); | 1505 intptr_t num_closures = closures.Length(); |
1506 intptr_t best_fit_token_pos = -1; | 1506 intptr_t best_fit_token_pos = -1; |
1507 intptr_t best_fit_index = -1; | 1507 intptr_t best_fit_index = -1; |
1508 for (intptr_t i = 0; i < num_closures; i++) { | 1508 for (intptr_t i = 0; i < num_closures; i++) { |
1509 closure |= closures.At(i); | 1509 closure ^= closures.At(i); |
1510 ASSERT(!closure.IsNull()); | 1510 ASSERT(!closure.IsNull()); |
1511 if ((closure.token_pos() <= token_pos) && | 1511 if ((closure.token_pos() <= token_pos) && |
1512 (token_pos < closure.end_token_pos()) && | 1512 (token_pos < closure.end_token_pos()) && |
1513 (best_fit_token_pos < closure.token_pos())) { | 1513 (best_fit_token_pos < closure.token_pos())) { |
1514 best_fit_index = i; | 1514 best_fit_index = i; |
1515 best_fit_token_pos = closure.token_pos(); | 1515 best_fit_token_pos = closure.token_pos(); |
1516 } | 1516 } |
1517 } | 1517 } |
1518 closure = Function::null(); | 1518 closure = Function::null(); |
1519 if (best_fit_index >= 0) { | 1519 if (best_fit_index >= 0) { |
1520 closure |= closures.At(best_fit_index); | 1520 closure ^= closures.At(best_fit_index); |
1521 } | 1521 } |
1522 return closure.raw(); | 1522 return closure.raw(); |
1523 } | 1523 } |
1524 | 1524 |
1525 | 1525 |
1526 void Class::set_signature_function(const Function& value) const { | 1526 void Class::set_signature_function(const Function& value) const { |
1527 ASSERT(value.IsClosureFunction() || value.IsSignatureFunction()); | 1527 ASSERT(value.IsClosureFunction() || value.IsSignatureFunction()); |
1528 StorePointer(&raw_ptr()->signature_function_, value.raw()); | 1528 StorePointer(&raw_ptr()->signature_function_, value.raw()); |
1529 } | 1529 } |
1530 | 1530 |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1667 // The instance needs a type_arguments field. | 1667 // The instance needs a type_arguments field. |
1668 type_args_field_offset = offset; | 1668 type_args_field_offset = offset; |
1669 offset += kWordSize; | 1669 offset += kWordSize; |
1670 } | 1670 } |
1671 } | 1671 } |
1672 set_type_arguments_field_offset(type_args_field_offset); | 1672 set_type_arguments_field_offset(type_args_field_offset); |
1673 ASSERT(offset != 0); | 1673 ASSERT(offset != 0); |
1674 Field& field = Field::Handle(); | 1674 Field& field = Field::Handle(); |
1675 intptr_t len = flds.Length(); | 1675 intptr_t len = flds.Length(); |
1676 for (intptr_t i = 0; i < len; i++) { | 1676 for (intptr_t i = 0; i < len; i++) { |
1677 field |= flds.At(i); | 1677 field ^= flds.At(i); |
1678 // Offset is computed only for instance fields. | 1678 // Offset is computed only for instance fields. |
1679 if (!field.is_static()) { | 1679 if (!field.is_static()) { |
1680 ASSERT(field.Offset() == 0); | 1680 ASSERT(field.Offset() == 0); |
1681 field.SetOffset(offset); | 1681 field.SetOffset(offset); |
1682 offset += kWordSize; | 1682 offset += kWordSize; |
1683 } | 1683 } |
1684 } | 1684 } |
1685 set_instance_size(RoundedAllocationSize(offset)); | 1685 set_instance_size(RoundedAllocationSize(offset)); |
1686 set_next_field_offset(offset); | 1686 set_next_field_offset(offset); |
1687 } | 1687 } |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1723 Array& patch_list = Array::Handle(patch.functions()); | 1723 Array& patch_list = Array::Handle(patch.functions()); |
1724 intptr_t patch_len = patch_list.Length(); | 1724 intptr_t patch_len = patch_list.Length(); |
1725 | 1725 |
1726 // TODO(iposva): Verify that only patching existing methods and adding only | 1726 // TODO(iposva): Verify that only patching existing methods and adding only |
1727 // new private methods. | 1727 // new private methods. |
1728 Function& func = Function::Handle(); | 1728 Function& func = Function::Handle(); |
1729 Function& orig_func = Function::Handle(); | 1729 Function& orig_func = Function::Handle(); |
1730 const GrowableObjectArray& new_functions = GrowableObjectArray::Handle( | 1730 const GrowableObjectArray& new_functions = GrowableObjectArray::Handle( |
1731 GrowableObjectArray::New(orig_len)); | 1731 GrowableObjectArray::New(orig_len)); |
1732 for (intptr_t i = 0; i < orig_len; i++) { | 1732 for (intptr_t i = 0; i < orig_len; i++) { |
1733 orig_func |= orig_list.At(i); | 1733 orig_func ^= orig_list.At(i); |
1734 member_name = orig_func.name(); | 1734 member_name ^= orig_func.name(); |
1735 func = patch.LookupFunction(member_name); | 1735 func = patch.LookupFunction(member_name); |
1736 if (func.IsNull()) { | 1736 if (func.IsNull()) { |
1737 // Non-patched function is preserved, all patched functions are added in | 1737 // Non-patched function is preserved, all patched functions are added in |
1738 // the loop below. | 1738 // the loop below. |
1739 new_functions.Add(orig_func); | 1739 new_functions.Add(orig_func); |
1740 } else if (!func.HasCompatibleParametersWith(orig_func) && | 1740 } else if (!func.HasCompatibleParametersWith(orig_func) && |
1741 !(func.IsFactory() && orig_func.IsConstructor() && | 1741 !(func.IsFactory() && orig_func.IsConstructor() && |
1742 (func.num_fixed_parameters() + 1 == | 1742 (func.num_fixed_parameters() + 1 == |
1743 orig_func.num_fixed_parameters()))) { | 1743 orig_func.num_fixed_parameters()))) { |
1744 return FormatPatchError("mismatched parameters: %s", member_name); | 1744 return FormatPatchError("mismatched parameters: %s", member_name); |
1745 } | 1745 } |
1746 } | 1746 } |
1747 for (intptr_t i = 0; i < patch_len; i++) { | 1747 for (intptr_t i = 0; i < patch_len; i++) { |
1748 func |= patch_list.At(i); | 1748 func ^= patch_list.At(i); |
1749 func.set_owner(patch_class); | 1749 func.set_owner(patch_class); |
1750 new_functions.Add(func); | 1750 new_functions.Add(func); |
1751 } | 1751 } |
1752 Array& new_list = Array::Handle(Array::MakeArray(new_functions)); | 1752 Array& new_list = Array::Handle(Array::MakeArray(new_functions)); |
1753 SetFunctions(new_list); | 1753 SetFunctions(new_list); |
1754 | 1754 |
1755 // Merge the two list of fields. Raise an error when duplicates are found or | 1755 // Merge the two list of fields. Raise an error when duplicates are found or |
1756 // when a public field is being added. | 1756 // when a public field is being added. |
1757 orig_list = fields(); | 1757 orig_list = fields(); |
1758 orig_len = orig_list.Length(); | 1758 orig_len = orig_list.Length(); |
1759 patch_list = patch.fields(); | 1759 patch_list = patch.fields(); |
1760 patch_len = patch_list.Length(); | 1760 patch_len = patch_list.Length(); |
1761 | 1761 |
1762 Field& field = Field::Handle(); | 1762 Field& field = Field::Handle(); |
1763 Field& orig_field = Field::Handle(); | 1763 Field& orig_field = Field::Handle(); |
1764 new_list = Array::New(patch_len + orig_len); | 1764 new_list = Array::New(patch_len + orig_len); |
1765 for (intptr_t i = 0; i < patch_len; i++) { | 1765 for (intptr_t i = 0; i < patch_len; i++) { |
1766 field |= patch_list.At(i); | 1766 field ^= patch_list.At(i); |
1767 field.set_owner(*this); | 1767 field.set_owner(*this); |
1768 member_name = field.name(); | 1768 member_name = field.name(); |
1769 // TODO(iposva): Verify non-public fields only. | 1769 // TODO(iposva): Verify non-public fields only. |
1770 | 1770 |
1771 // Verify no duplicate additions. | 1771 // Verify no duplicate additions. |
1772 orig_field = LookupField(member_name); | 1772 orig_field ^= LookupField(member_name); |
1773 if (!orig_field.IsNull()) { | 1773 if (!orig_field.IsNull()) { |
1774 return FormatPatchError("duplicate field: %s", member_name); | 1774 return FormatPatchError("duplicate field: %s", member_name); |
1775 } | 1775 } |
1776 new_list.SetAt(i, field); | 1776 new_list.SetAt(i, field); |
1777 } | 1777 } |
1778 for (intptr_t i = 0; i < orig_len; i++) { | 1778 for (intptr_t i = 0; i < orig_len; i++) { |
1779 field |= orig_list.At(i); | 1779 field ^= orig_list.At(i); |
1780 new_list.SetAt(patch_len + i, field); | 1780 new_list.SetAt(patch_len + i, field); |
1781 } | 1781 } |
1782 SetFields(new_list); | 1782 SetFields(new_list); |
1783 return NULL; | 1783 return NULL; |
1784 } | 1784 } |
1785 | 1785 |
1786 | 1786 |
1787 void Class::SetFields(const Array& value) const { | 1787 void Class::SetFields(const Array& value) const { |
1788 ASSERT(!value.IsNull()); | 1788 ASSERT(!value.IsNull()); |
1789 #if defined(DEBUG) | 1789 #if defined(DEBUG) |
1790 // Verify that all the fields in the array have this class as owner. | 1790 // Verify that all the fields in the array have this class as owner. |
1791 Field& field = Field::Handle(); | 1791 Field& field = Field::Handle(); |
1792 intptr_t len = value.Length(); | 1792 intptr_t len = value.Length(); |
1793 for (intptr_t i = 0; i < len; i++) { | 1793 for (intptr_t i = 0; i < len; i++) { |
1794 field |= value.At(i); | 1794 field ^= value.At(i); |
1795 ASSERT(field.owner() == raw()); | 1795 ASSERT(field.owner() == raw()); |
1796 } | 1796 } |
1797 #endif | 1797 #endif |
1798 // The value of static fields is already initialized to null. | 1798 // The value of static fields is already initialized to null. |
1799 StorePointer(&raw_ptr()->fields_, value.raw()); | 1799 StorePointer(&raw_ptr()->fields_, value.raw()); |
1800 } | 1800 } |
1801 | 1801 |
1802 | 1802 |
1803 template <class FakeInstance> | 1803 template <class FakeInstance> |
1804 RawClass* Class::New(intptr_t index) { | 1804 RawClass* Class::New(intptr_t index) { |
(...skipping 510 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2315 if (funcs.IsNull()) { | 2315 if (funcs.IsNull()) { |
2316 // This can occur, e.g., for Null classes. | 2316 // This can occur, e.g., for Null classes. |
2317 return Function::null(); | 2317 return Function::null(); |
2318 } | 2318 } |
2319 Function& function = Function::Handle(isolate, Function::null()); | 2319 Function& function = Function::Handle(isolate, Function::null()); |
2320 const intptr_t len = funcs.Length(); | 2320 const intptr_t len = funcs.Length(); |
2321 if (name.IsSymbol()) { | 2321 if (name.IsSymbol()) { |
2322 // Quick Symbol compare. | 2322 // Quick Symbol compare. |
2323 NoGCScope no_gc; | 2323 NoGCScope no_gc; |
2324 for (intptr_t i = 0; i < len; i++) { | 2324 for (intptr_t i = 0; i < len; i++) { |
2325 function |= funcs.At(i); | 2325 function ^= funcs.At(i); |
2326 if (function.name() == name.raw()) { | 2326 if (function.name() == name.raw()) { |
2327 return function.raw(); | 2327 return function.raw(); |
2328 } | 2328 } |
2329 } | 2329 } |
2330 } else { | 2330 } else { |
2331 String& function_name = String::Handle(isolate, String::null()); | 2331 String& function_name = String::Handle(isolate, String::null()); |
2332 for (intptr_t i = 0; i < len; i++) { | 2332 for (intptr_t i = 0; i < len; i++) { |
2333 function |= funcs.At(i); | 2333 function ^= funcs.At(i); |
2334 function_name |= function.name(); | 2334 function_name ^= function.name(); |
2335 if (function_name.Equals(name)) { | 2335 if (function_name.Equals(name)) { |
2336 return function.raw(); | 2336 return function.raw(); |
2337 } | 2337 } |
2338 } | 2338 } |
2339 } | 2339 } |
2340 // No function found. | 2340 // No function found. |
2341 return Function::null(); | 2341 return Function::null(); |
2342 } | 2342 } |
2343 | 2343 |
2344 | 2344 |
2345 RawFunction* Class::LookupFunctionAllowPrivate(const String& name) const { | 2345 RawFunction* Class::LookupFunctionAllowPrivate(const String& name) const { |
2346 Isolate* isolate = Isolate::Current(); | 2346 Isolate* isolate = Isolate::Current(); |
2347 ASSERT(name.IsOneByteString()); | 2347 ASSERT(name.IsOneByteString()); |
2348 Array& funcs = Array::Handle(isolate, functions()); | 2348 Array& funcs = Array::Handle(isolate, functions()); |
2349 if (funcs.IsNull()) { | 2349 if (funcs.IsNull()) { |
2350 // This can occur, e.g., for Null classes. | 2350 // This can occur, e.g., for Null classes. |
2351 return Function::null(); | 2351 return Function::null(); |
2352 } | 2352 } |
2353 Function& function = Function::Handle(isolate, Function::null()); | 2353 Function& function = Function::Handle(isolate, Function::null()); |
2354 String& function_name = String::Handle(isolate, String::null()); | 2354 String& function_name = String::Handle(isolate, String::null()); |
2355 intptr_t len = funcs.Length(); | 2355 intptr_t len = funcs.Length(); |
2356 for (intptr_t i = 0; i < len; i++) { | 2356 for (intptr_t i = 0; i < len; i++) { |
2357 function |= funcs.At(i); | 2357 function ^= funcs.At(i); |
2358 function_name |= function.name(); | 2358 function_name ^= function.name(); |
2359 if (OneByteString::EqualsIgnoringPrivateKey(function_name, name)) { | 2359 if (OneByteString::EqualsIgnoringPrivateKey(function_name, name)) { |
2360 return function.raw(); | 2360 return function.raw(); |
2361 } | 2361 } |
2362 } | 2362 } |
2363 // No function found. | 2363 // No function found. |
2364 return Function::null(); | 2364 return Function::null(); |
2365 } | 2365 } |
2366 | 2366 |
2367 | 2367 |
2368 RawFunction* Class::LookupGetterFunction(const String& name) const { | 2368 RawFunction* Class::LookupGetterFunction(const String& name) const { |
2369 return LookupAccessorFunction(kGetterPrefix, kGetterPrefixLength, name); | 2369 return LookupAccessorFunction(kGetterPrefix, kGetterPrefixLength, name); |
2370 } | 2370 } |
2371 | 2371 |
2372 | 2372 |
2373 RawFunction* Class::LookupSetterFunction(const String& name) const { | 2373 RawFunction* Class::LookupSetterFunction(const String& name) const { |
2374 return LookupAccessorFunction(kSetterPrefix, kSetterPrefixLength, name); | 2374 return LookupAccessorFunction(kSetterPrefix, kSetterPrefixLength, name); |
2375 } | 2375 } |
2376 | 2376 |
2377 | 2377 |
2378 RawFunction* Class::LookupAccessorFunction(const char* prefix, | 2378 RawFunction* Class::LookupAccessorFunction(const char* prefix, |
2379 intptr_t prefix_length, | 2379 intptr_t prefix_length, |
2380 const String& name) const { | 2380 const String& name) const { |
2381 Isolate* isolate = Isolate::Current(); | 2381 Isolate* isolate = Isolate::Current(); |
2382 Array& funcs = Array::Handle(isolate, functions()); | 2382 Array& funcs = Array::Handle(isolate, functions()); |
2383 Function& function = Function::Handle(isolate, Function::null()); | 2383 Function& function = Function::Handle(isolate, Function::null()); |
2384 String& function_name = String::Handle(isolate, String::null()); | 2384 String& function_name = String::Handle(isolate, String::null()); |
2385 intptr_t len = funcs.Length(); | 2385 intptr_t len = funcs.Length(); |
2386 for (intptr_t i = 0; i < len; i++) { | 2386 for (intptr_t i = 0; i < len; i++) { |
2387 function |= funcs.At(i); | 2387 function ^= funcs.At(i); |
2388 function_name |= function.name(); | 2388 function_name ^= function.name(); |
2389 if (MatchesAccessorName(function_name, prefix, prefix_length, name)) { | 2389 if (MatchesAccessorName(function_name, prefix, prefix_length, name)) { |
2390 return function.raw(); | 2390 return function.raw(); |
2391 } | 2391 } |
2392 } | 2392 } |
2393 | 2393 |
2394 // No function found. | 2394 // No function found. |
2395 return Function::null(); | 2395 return Function::null(); |
2396 } | 2396 } |
2397 | 2397 |
2398 | 2398 |
2399 RawFunction* Class::LookupFunctionAtToken(intptr_t token_pos) const { | 2399 RawFunction* Class::LookupFunctionAtToken(intptr_t token_pos) const { |
2400 // TODO(hausner): we can shortcut the negative case if we knew the | 2400 // TODO(hausner): we can shortcut the negative case if we knew the |
2401 // beginning and end token position of the class. | 2401 // beginning and end token position of the class. |
2402 Function& func = Function::Handle(); | 2402 Function& func = Function::Handle(); |
2403 func = LookupClosureFunction(token_pos); | 2403 func = LookupClosureFunction(token_pos); |
2404 if (!func.IsNull()) { | 2404 if (!func.IsNull()) { |
2405 return func.raw(); | 2405 return func.raw(); |
2406 } | 2406 } |
2407 Array& funcs = Array::Handle(functions()); | 2407 Array& funcs = Array::Handle(functions()); |
2408 intptr_t len = funcs.Length(); | 2408 intptr_t len = funcs.Length(); |
2409 for (intptr_t i = 0; i < len; i++) { | 2409 for (intptr_t i = 0; i < len; i++) { |
2410 func |= funcs.At(i); | 2410 func ^= funcs.At(i); |
2411 if ((func.token_pos() <= token_pos) && | 2411 if ((func.token_pos() <= token_pos) && |
2412 (token_pos <= func.end_token_pos())) { | 2412 (token_pos <= func.end_token_pos())) { |
2413 return func.raw(); | 2413 return func.raw(); |
2414 } | 2414 } |
2415 } | 2415 } |
2416 // No function found. | 2416 // No function found. |
2417 return Function::null(); | 2417 return Function::null(); |
2418 } | 2418 } |
2419 | 2419 |
2420 | 2420 |
(...skipping 28 matching lines...) Expand all Loading... |
2449 | 2449 |
2450 | 2450 |
2451 RawField* Class::LookupField(const String& name) const { | 2451 RawField* Class::LookupField(const String& name) const { |
2452 Isolate* isolate = Isolate::Current(); | 2452 Isolate* isolate = Isolate::Current(); |
2453 ASSERT(name.IsOneByteString()); | 2453 ASSERT(name.IsOneByteString()); |
2454 const Array& flds = Array::Handle(isolate, fields()); | 2454 const Array& flds = Array::Handle(isolate, fields()); |
2455 Field& field = Field::Handle(isolate, Field::null()); | 2455 Field& field = Field::Handle(isolate, Field::null()); |
2456 String& field_name = String::Handle(isolate, String::null()); | 2456 String& field_name = String::Handle(isolate, String::null()); |
2457 intptr_t len = flds.Length(); | 2457 intptr_t len = flds.Length(); |
2458 for (intptr_t i = 0; i < len; i++) { | 2458 for (intptr_t i = 0; i < len; i++) { |
2459 field |= flds.At(i); | 2459 field ^= flds.At(i); |
2460 field_name |= field.name(); | 2460 field_name ^= field.name(); |
2461 if (OneByteString::EqualsIgnoringPrivateKey(field_name, name)) { | 2461 if (OneByteString::EqualsIgnoringPrivateKey(field_name, name)) { |
2462 return field.raw(); | 2462 return field.raw(); |
2463 } | 2463 } |
2464 } | 2464 } |
2465 // No field found. | 2465 // No field found. |
2466 return Field::null(); | 2466 return Field::null(); |
2467 } | 2467 } |
2468 | 2468 |
2469 | 2469 |
2470 RawLibraryPrefix* Class::LookupLibraryPrefix(const String& name) const { | 2470 RawLibraryPrefix* Class::LookupLibraryPrefix(const String& name) const { |
(...skipping 530 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3001 static void InsertIntoCanonicalTypeArguments(Isolate* isolate, | 3001 static void InsertIntoCanonicalTypeArguments(Isolate* isolate, |
3002 const Array& table, | 3002 const Array& table, |
3003 const TypeArguments& arguments, | 3003 const TypeArguments& arguments, |
3004 intptr_t index) { | 3004 intptr_t index) { |
3005 arguments.SetCanonical(); // Mark object as being canonical. | 3005 arguments.SetCanonical(); // Mark object as being canonical. |
3006 table.SetAt(index, arguments); // Remember the new element. | 3006 table.SetAt(index, arguments); // Remember the new element. |
3007 // Update used count. | 3007 // Update used count. |
3008 // Last element of the array is the number of used elements. | 3008 // Last element of the array is the number of used elements. |
3009 intptr_t table_size = table.Length() - 1; | 3009 intptr_t table_size = table.Length() - 1; |
3010 Smi& used = Smi::Handle(isolate); | 3010 Smi& used = Smi::Handle(isolate); |
3011 used |= table.At(table_size); | 3011 used ^= table.At(table_size); |
3012 intptr_t used_elements = used.Value() + 1; | 3012 intptr_t used_elements = used.Value() + 1; |
3013 used = Smi::New(used_elements); | 3013 used = Smi::New(used_elements); |
3014 table.SetAt(table_size, used); | 3014 table.SetAt(table_size, used); |
3015 | 3015 |
3016 // Rehash if table is 75% full. | 3016 // Rehash if table is 75% full. |
3017 if (used_elements > ((table_size / 4) * 3)) { | 3017 if (used_elements > ((table_size / 4) * 3)) { |
3018 GrowCanonicalTypeArguments(isolate, table); | 3018 GrowCanonicalTypeArguments(isolate, table); |
3019 } | 3019 } |
3020 } | 3020 } |
3021 | 3021 |
(...skipping 482 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3504 | 3504 |
3505 | 3505 |
3506 void Function::set_parameter_types(const Array& value) const { | 3506 void Function::set_parameter_types(const Array& value) const { |
3507 StorePointer(&raw_ptr()->parameter_types_, value.raw()); | 3507 StorePointer(&raw_ptr()->parameter_types_, value.raw()); |
3508 } | 3508 } |
3509 | 3509 |
3510 | 3510 |
3511 RawString* Function::ParameterNameAt(intptr_t index) const { | 3511 RawString* Function::ParameterNameAt(intptr_t index) const { |
3512 const Array& parameter_names = Array::Handle(raw_ptr()->parameter_names_); | 3512 const Array& parameter_names = Array::Handle(raw_ptr()->parameter_names_); |
3513 String& parameter_name = String::Handle(); | 3513 String& parameter_name = String::Handle(); |
3514 parameter_name |= parameter_names.At(index); | 3514 parameter_name ^= parameter_names.At(index); |
3515 return parameter_name.raw(); | 3515 return parameter_name.raw(); |
3516 } | 3516 } |
3517 | 3517 |
3518 | 3518 |
3519 void Function::SetParameterNameAt(intptr_t index, const String& value) const { | 3519 void Function::SetParameterNameAt(intptr_t index, const String& value) const { |
3520 ASSERT(!value.IsNull() && value.IsSymbol()); | 3520 ASSERT(!value.IsNull() && value.IsSymbol()); |
3521 const Array& parameter_names = Array::Handle(raw_ptr()->parameter_names_); | 3521 const Array& parameter_names = Array::Handle(raw_ptr()->parameter_names_); |
3522 parameter_names.SetAt(index, value); | 3522 parameter_names.SetAt(index, value); |
3523 } | 3523 } |
3524 | 3524 |
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3723 argument_names.IsNull() ? 0 : argument_names.Length(); | 3723 argument_names.IsNull() ? 0 : argument_names.Length(); |
3724 if (!AreValidArgumentCounts(num_arguments, | 3724 if (!AreValidArgumentCounts(num_arguments, |
3725 num_named_arguments, | 3725 num_named_arguments, |
3726 error_message)) { | 3726 error_message)) { |
3727 return false; | 3727 return false; |
3728 } | 3728 } |
3729 // Verify that all argument names are valid parameter names. | 3729 // Verify that all argument names are valid parameter names. |
3730 String& argument_name = String::Handle(); | 3730 String& argument_name = String::Handle(); |
3731 String& parameter_name = String::Handle(); | 3731 String& parameter_name = String::Handle(); |
3732 for (int i = 0; i < num_named_arguments; i++) { | 3732 for (int i = 0; i < num_named_arguments; i++) { |
3733 argument_name |= argument_names.At(i); | 3733 argument_name ^= argument_names.At(i); |
3734 ASSERT(argument_name.IsSymbol()); | 3734 ASSERT(argument_name.IsSymbol()); |
3735 bool found = false; | 3735 bool found = false; |
3736 const int num_positional_args = num_arguments - num_named_arguments; | 3736 const int num_positional_args = num_arguments - num_named_arguments; |
3737 const int num_parameters = NumParameters(); | 3737 const int num_parameters = NumParameters(); |
3738 for (int j = num_positional_args; !found && (j < num_parameters); j++) { | 3738 for (int j = num_positional_args; !found && (j < num_parameters); j++) { |
3739 parameter_name |= ParameterNameAt(j); | 3739 parameter_name = ParameterNameAt(j); |
3740 ASSERT(argument_name.IsSymbol()); | 3740 ASSERT(argument_name.IsSymbol()); |
3741 if (argument_name.Equals(parameter_name)) { | 3741 if (argument_name.Equals(parameter_name)) { |
3742 found = true; | 3742 found = true; |
3743 } | 3743 } |
3744 } | 3744 } |
3745 if (!found) { | 3745 if (!found) { |
3746 if (error_message != NULL) { | 3746 if (error_message != NULL) { |
3747 const intptr_t kMessageBufferSize = 64; | 3747 const intptr_t kMessageBufferSize = 64; |
3748 char message_buffer[kMessageBufferSize]; | 3748 char message_buffer[kMessageBufferSize]; |
3749 OS::SNPrint(message_buffer, | 3749 OS::SNPrint(message_buffer, |
(...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4089 } | 4089 } |
4090 ASSERT(!IsSignatureFunction() && !IsClosureFunction()); | 4090 ASSERT(!IsSignatureFunction() && !IsClosureFunction()); |
4091 // Create closure function. | 4091 // Create closure function. |
4092 const String& closure_name = String::Handle(name()); | 4092 const String& closure_name = String::Handle(name()); |
4093 const Function& closure_function = Function::Handle( | 4093 const Function& closure_function = Function::Handle( |
4094 NewClosureFunction(closure_name, *this, token_pos())); | 4094 NewClosureFunction(closure_name, *this, token_pos())); |
4095 | 4095 |
4096 // Set closure function's context scope. | 4096 // Set closure function's context scope. |
4097 ContextScope& context_scope = ContextScope::Handle(); | 4097 ContextScope& context_scope = ContextScope::Handle(); |
4098 if (is_static()) { | 4098 if (is_static()) { |
4099 context_scope |= ContextScope::New(0); | 4099 context_scope = ContextScope::New(0); |
4100 } else { | 4100 } else { |
4101 context_scope |= LocalScope::CreateImplicitClosureScope(*this); | 4101 context_scope = LocalScope::CreateImplicitClosureScope(*this); |
4102 } | 4102 } |
4103 closure_function.set_context_scope(context_scope); | 4103 closure_function.set_context_scope(context_scope); |
4104 | 4104 |
4105 // Set closure function's result type to this result type. | 4105 // Set closure function's result type to this result type. |
4106 closure_function.set_result_type(AbstractType::Handle(result_type())); | 4106 closure_function.set_result_type(AbstractType::Handle(result_type())); |
4107 | 4107 |
4108 // Set closure function's formal parameters to this formal parameters, | 4108 // Set closure function's formal parameters to this formal parameters, |
4109 // removing the receiver if this is an instance method and adding the closure | 4109 // removing the receiver if this is an instance method and adding the closure |
4110 // object as first parameter. | 4110 // object as first parameter. |
4111 const int kClosure = 1; | 4111 const int kClosure = 1; |
(...skipping 1093 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5205 Token::Kind kind = static_cast<Token::Kind>( | 5205 Token::Kind kind = static_cast<Token::Kind>( |
5206 Smi::Value(reinterpret_cast<RawSmi*>(obj.raw()))); | 5206 Smi::Value(reinterpret_cast<RawSmi*>(obj.raw()))); |
5207 ASSERT(kind < Token::kNumTokens); | 5207 ASSERT(kind < Token::kNumTokens); |
5208 if (Token::IsPseudoKeyword(kind) || Token::IsKeyword(kind)) { | 5208 if (Token::IsPseudoKeyword(kind) || Token::IsKeyword(kind)) { |
5209 Isolate* isolate = Isolate::Current(); | 5209 Isolate* isolate = Isolate::Current(); |
5210 ObjectStore* object_store = isolate->object_store(); | 5210 ObjectStore* object_store = isolate->object_store(); |
5211 String& str = String::Handle(isolate, String::null()); | 5211 String& str = String::Handle(isolate, String::null()); |
5212 const Array& symbols = Array::Handle(isolate, | 5212 const Array& symbols = Array::Handle(isolate, |
5213 object_store->keyword_symbols()); | 5213 object_store->keyword_symbols()); |
5214 ASSERT(!symbols.IsNull()); | 5214 ASSERT(!symbols.IsNull()); |
5215 str |= symbols.At(kind - Token::kFirstKeyword); | 5215 str ^= symbols.At(kind - Token::kFirstKeyword); |
5216 ASSERT(!str.IsNull()); | 5216 ASSERT(!str.IsNull()); |
5217 return str.raw(); | 5217 return str.raw(); |
5218 } | 5218 } |
5219 return Symbols::New(Token::Str(kind)); | 5219 return Symbols::New(Token::Str(kind)); |
5220 } else { | 5220 } else { |
5221 ASSERT(obj.IsLiteralToken()); // Must be a literal token. | 5221 ASSERT(obj.IsLiteralToken()); // Must be a literal token. |
5222 const LiteralToken& literal_token = LiteralToken::Cast(obj); | 5222 const LiteralToken& literal_token = LiteralToken::Cast(obj); |
5223 return literal_token.literal(); | 5223 return literal_token.literal(); |
5224 } | 5224 } |
5225 } | 5225 } |
(...skipping 362 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5588 entry = dict.At(index); | 5588 entry = dict.At(index); |
5589 // An empty spot will be found because we keep the hash set at most 75% full. | 5589 // An empty spot will be found because we keep the hash set at most 75% full. |
5590 while (!entry.IsNull()) { | 5590 while (!entry.IsNull()) { |
5591 index = (index + 1) % dict_size; | 5591 index = (index + 1) % dict_size; |
5592 entry = dict.At(index); | 5592 entry = dict.At(index); |
5593 } | 5593 } |
5594 | 5594 |
5595 // Insert the object at the empty slot. | 5595 // Insert the object at the empty slot. |
5596 dict.SetAt(index, obj); | 5596 dict.SetAt(index, obj); |
5597 Smi& used = Smi::Handle(); | 5597 Smi& used = Smi::Handle(); |
5598 used |= dict.At(dict_size); | 5598 used ^= dict.At(dict_size); |
5599 intptr_t used_elements = used.Value() + 1; // One more element added. | 5599 intptr_t used_elements = used.Value() + 1; // One more element added. |
5600 used = Smi::New(used_elements); | 5600 used = Smi::New(used_elements); |
5601 dict.SetAt(dict_size, used); // Update used count. | 5601 dict.SetAt(dict_size, used); // Update used count. |
5602 | 5602 |
5603 // Rehash if symbol_table is 75% full. | 5603 // Rehash if symbol_table is 75% full. |
5604 if (used_elements > ((dict_size / 4) * 3)) { | 5604 if (used_elements > ((dict_size / 4) * 3)) { |
5605 GrowDictionary(dict, dict_size); | 5605 GrowDictionary(dict, dict_size); |
5606 } | 5606 } |
5607 | 5607 |
5608 // Invalidate the cache of loaded scripts. | 5608 // Invalidate the cache of loaded scripts. |
5609 if (loaded_scripts() != Array::null()) { | 5609 if (loaded_scripts() != Array::null()) { |
5610 StorePointer(&raw_ptr()->loaded_scripts_, Array::null()); | 5610 StorePointer(&raw_ptr()->loaded_scripts_, Array::null()); |
5611 } | 5611 } |
5612 } | 5612 } |
5613 | 5613 |
5614 | 5614 |
5615 // Lookup a name in the library's export namespace. | 5615 // Lookup a name in the library's export namespace. |
5616 RawObject* Library::LookupExport(const String& name) const { | 5616 RawObject* Library::LookupExport(const String& name) const { |
5617 if (HasExports()) { | 5617 if (HasExports()) { |
5618 const Array& exports = Array::Handle(this->exports()); | 5618 const Array& exports = Array::Handle(this->exports()); |
5619 Namespace& ns = Namespace::Handle(); | 5619 Namespace& ns = Namespace::Handle(); |
5620 Object& obj = Object::Handle(); | 5620 Object& obj = Object::Handle(); |
5621 for (int i = 0; i < exports.Length(); i++) { | 5621 for (int i = 0; i < exports.Length(); i++) { |
5622 ns |= exports.At(i); | 5622 ns ^= exports.At(i); |
5623 obj = ns.Lookup(name); | 5623 obj = ns.Lookup(name); |
5624 if (!obj.IsNull()) { | 5624 if (!obj.IsNull()) { |
5625 return obj.raw(); | 5625 return obj.raw(); |
5626 } | 5626 } |
5627 } | 5627 } |
5628 } | 5628 } |
5629 return Object::null(); | 5629 return Object::null(); |
5630 } | 5630 } |
5631 | 5631 |
5632 | 5632 |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5694 cls = Field::Cast(entry).owner(); | 5694 cls = Field::Cast(entry).owner(); |
5695 owner_script = cls.script(); | 5695 owner_script = cls.script(); |
5696 } else { | 5696 } else { |
5697 continue; | 5697 continue; |
5698 } | 5698 } |
5699 if (owner_script.IsNull()) { | 5699 if (owner_script.IsNull()) { |
5700 continue; | 5700 continue; |
5701 } | 5701 } |
5702 bool is_unique = true; | 5702 bool is_unique = true; |
5703 for (int i = 0; i < scripts.Length(); i++) { | 5703 for (int i = 0; i < scripts.Length(); i++) { |
5704 script_obj |= scripts.At(i); | 5704 script_obj ^= scripts.At(i); |
5705 if (script_obj.raw() == owner_script.raw()) { | 5705 if (script_obj.raw() == owner_script.raw()) { |
5706 // We already have a reference to this script. | 5706 // We already have a reference to this script. |
5707 is_unique = false; | 5707 is_unique = false; |
5708 break; | 5708 break; |
5709 } | 5709 } |
5710 } | 5710 } |
5711 if (is_unique) { | 5711 if (is_unique) { |
5712 // Add script to the list of scripts. | 5712 // Add script to the list of scripts. |
5713 scripts.Add(owner_script); | 5713 scripts.Add(owner_script); |
5714 } | 5714 } |
5715 } | 5715 } |
5716 | 5716 |
5717 // Create the array of scripts and cache it in loaded_scripts_. | 5717 // Create the array of scripts and cache it in loaded_scripts_. |
5718 StorePointer(&raw_ptr()->loaded_scripts_, Array::MakeArray(scripts)); | 5718 StorePointer(&raw_ptr()->loaded_scripts_, Array::MakeArray(scripts)); |
5719 } | 5719 } |
5720 return loaded_scripts(); | 5720 return loaded_scripts(); |
5721 } | 5721 } |
5722 | 5722 |
5723 | 5723 |
5724 // TODO(hausner): we might want to add a script dictionary to the | 5724 // TODO(hausner): we might want to add a script dictionary to the |
5725 // library class to make this lookup faster. | 5725 // library class to make this lookup faster. |
5726 RawScript* Library::LookupScript(const String& url) const { | 5726 RawScript* Library::LookupScript(const String& url) const { |
5727 const Array& scripts = Array::Handle(LoadedScripts()); | 5727 const Array& scripts = Array::Handle(LoadedScripts()); |
5728 Script& script = Script::Handle(); | 5728 Script& script = Script::Handle(); |
5729 String& script_url = String::Handle(); | 5729 String& script_url = String::Handle(); |
5730 intptr_t num_scripts = scripts.Length(); | 5730 intptr_t num_scripts = scripts.Length(); |
5731 for (int i = 0; i < num_scripts; i++) { | 5731 for (int i = 0; i < num_scripts; i++) { |
5732 script |= scripts.At(i); | 5732 script ^= scripts.At(i); |
5733 script_url = script.url(); | 5733 script_url = script.url(); |
5734 if (script_url.Equals(url)) { | 5734 if (script_url.Equals(url)) { |
5735 return script.raw(); | 5735 return script.raw(); |
5736 } | 5736 } |
5737 } | 5737 } |
5738 return Script::null(); | 5738 return Script::null(); |
5739 } | 5739 } |
5740 | 5740 |
5741 | 5741 |
5742 RawFunction* Library::LookupFunctionInSource(const String& script_url, | 5742 RawFunction* Library::LookupFunctionInSource(const String& script_url, |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5776 func = cls.LookupFunctionAtToken(token_pos); | 5776 func = cls.LookupFunctionAtToken(token_pos); |
5777 if (!func.IsNull()) { | 5777 if (!func.IsNull()) { |
5778 return func.raw(); | 5778 return func.raw(); |
5779 } | 5779 } |
5780 } | 5780 } |
5781 } | 5781 } |
5782 // Look in anonymous classes for toplevel functions. | 5782 // Look in anonymous classes for toplevel functions. |
5783 Array& anon_classes = Array::Handle(this->raw_ptr()->anonymous_classes_); | 5783 Array& anon_classes = Array::Handle(this->raw_ptr()->anonymous_classes_); |
5784 intptr_t num_anonymous = raw_ptr()->num_anonymous_; | 5784 intptr_t num_anonymous = raw_ptr()->num_anonymous_; |
5785 for (int i = 0; i < num_anonymous; i++) { | 5785 for (int i = 0; i < num_anonymous; i++) { |
5786 cls |= anon_classes.At(i); | 5786 cls ^= anon_classes.At(i); |
5787 ASSERT(!cls.IsNull()); | 5787 ASSERT(!cls.IsNull()); |
5788 if (script.raw() == cls.script()) { | 5788 if (script.raw() == cls.script()) { |
5789 func = cls.LookupFunctionAtToken(token_pos); | 5789 func = cls.LookupFunctionAtToken(token_pos); |
5790 if (!func.IsNull()) { | 5790 if (!func.IsNull()) { |
5791 return func.raw(); | 5791 return func.raw(); |
5792 } | 5792 } |
5793 } | 5793 } |
5794 } | 5794 } |
5795 return Function::null(); | 5795 return Function::null(); |
5796 } | 5796 } |
(...skipping 28 matching lines...) Expand all Loading... |
5825 // Do not look up private names in imported libraries. | 5825 // Do not look up private names in imported libraries. |
5826 if (ShouldBePrivate(name)) { | 5826 if (ShouldBePrivate(name)) { |
5827 return Field::null(); | 5827 return Field::null(); |
5828 } | 5828 } |
5829 | 5829 |
5830 // Now check if name is found in any imported libs. | 5830 // Now check if name is found in any imported libs. |
5831 const Array& imports = Array::Handle(this->imports()); | 5831 const Array& imports = Array::Handle(this->imports()); |
5832 Namespace& import = Namespace::Handle(); | 5832 Namespace& import = Namespace::Handle(); |
5833 Object& obj = Object::Handle(); | 5833 Object& obj = Object::Handle(); |
5834 for (intptr_t j = 0; j < this->num_imports(); j++) { | 5834 for (intptr_t j = 0; j < this->num_imports(); j++) { |
5835 import |= imports.At(j); | 5835 import ^= imports.At(j); |
5836 obj = import.Lookup(name); | 5836 obj = import.Lookup(name); |
5837 if (!obj.IsNull() && obj.IsField()) { | 5837 if (!obj.IsNull() && obj.IsField()) { |
5838 field |= obj.raw(); | 5838 field ^= obj.raw(); |
5839 return field.raw(); | 5839 return field.raw(); |
5840 } | 5840 } |
5841 } | 5841 } |
5842 return Field::null(); | 5842 return Field::null(); |
5843 } | 5843 } |
5844 | 5844 |
5845 | 5845 |
5846 RawField* Library::LookupLocalField(const String& name) const { | 5846 RawField* Library::LookupLocalField(const String& name) const { |
5847 Isolate* isolate = Isolate::Current(); | 5847 Isolate* isolate = Isolate::Current(); |
5848 Field& field = Field::Handle(isolate, Field::null()); | 5848 Field& field = Field::Handle(isolate, Field::null()); |
5849 Object& obj = Object::Handle(isolate, Object::null()); | 5849 Object& obj = Object::Handle(isolate, Object::null()); |
5850 obj = LookupLocalObject(name); | 5850 obj = LookupLocalObject(name); |
5851 if (obj.IsNull() && ShouldBePrivate(name)) { | 5851 if (obj.IsNull() && ShouldBePrivate(name)) { |
5852 String& private_name = String::Handle(isolate, PrivateName(name)); | 5852 String& private_name = String::Handle(isolate, PrivateName(name)); |
5853 obj = LookupLocalObject(private_name); | 5853 obj = LookupLocalObject(private_name); |
5854 } | 5854 } |
5855 if (!obj.IsNull()) { | 5855 if (!obj.IsNull()) { |
5856 if (obj.IsField()) { | 5856 if (obj.IsField()) { |
5857 field |= obj.raw(); | 5857 field ^= obj.raw(); |
5858 return field.raw(); | 5858 return field.raw(); |
5859 } | 5859 } |
5860 } | 5860 } |
5861 | 5861 |
5862 // No field found. | 5862 // No field found. |
5863 return Field::null(); | 5863 return Field::null(); |
5864 } | 5864 } |
5865 | 5865 |
5866 | 5866 |
5867 RawFunction* Library::LookupFunctionAllowPrivate(const String& name) const { | 5867 RawFunction* Library::LookupFunctionAllowPrivate(const String& name) const { |
5868 // First check if name is found in the local scope of the library. | 5868 // First check if name is found in the local scope of the library. |
5869 Function& function = Function::Handle(LookupLocalFunction(name)); | 5869 Function& function = Function::Handle(LookupLocalFunction(name)); |
5870 if (!function.IsNull()) { | 5870 if (!function.IsNull()) { |
5871 return function.raw(); | 5871 return function.raw(); |
5872 } | 5872 } |
5873 | 5873 |
5874 // Do not look up private names in imported libraries. | 5874 // Do not look up private names in imported libraries. |
5875 if (ShouldBePrivate(name)) { | 5875 if (ShouldBePrivate(name)) { |
5876 return Function::null(); | 5876 return Function::null(); |
5877 } | 5877 } |
5878 | 5878 |
5879 // Now check if name is found in any imported libs. | 5879 // Now check if name is found in any imported libs. |
5880 const Array& imports = Array::Handle(this->imports()); | 5880 const Array& imports = Array::Handle(this->imports()); |
5881 Namespace& import = Namespace::Handle(); | 5881 Namespace& import = Namespace::Handle(); |
5882 Object& obj = Object::Handle(); | 5882 Object& obj = Object::Handle(); |
5883 for (intptr_t j = 0; j < this->num_imports(); j++) { | 5883 for (intptr_t j = 0; j < this->num_imports(); j++) { |
5884 import |= imports.At(j); | 5884 import ^= imports.At(j); |
5885 obj = import.Lookup(name); | 5885 obj = import.Lookup(name); |
5886 if (!obj.IsNull() && obj.IsFunction()) { | 5886 if (!obj.IsNull() && obj.IsFunction()) { |
5887 function |= obj.raw(); | 5887 function ^= obj.raw(); |
5888 return function.raw(); | 5888 return function.raw(); |
5889 } | 5889 } |
5890 } | 5890 } |
5891 return Function::null(); | 5891 return Function::null(); |
5892 } | 5892 } |
5893 | 5893 |
5894 | 5894 |
5895 RawFunction* Library::LookupLocalFunction(const String& name) const { | 5895 RawFunction* Library::LookupLocalFunction(const String& name) const { |
5896 Isolate* isolate = Isolate::Current(); | 5896 Isolate* isolate = Isolate::Current(); |
5897 Object& obj = Object::Handle(isolate, Object::null()); | 5897 Object& obj = Object::Handle(isolate, Object::null()); |
(...skipping 14 matching lines...) Expand all Loading... |
5912 RawObject* Library::LookupObject(const String& name) const { | 5912 RawObject* Library::LookupObject(const String& name) const { |
5913 // First check if name is found in the local scope of the library. | 5913 // First check if name is found in the local scope of the library. |
5914 Object& obj = Object::Handle(LookupLocalObject(name)); | 5914 Object& obj = Object::Handle(LookupLocalObject(name)); |
5915 if (!obj.IsNull()) { | 5915 if (!obj.IsNull()) { |
5916 return obj.raw(); | 5916 return obj.raw(); |
5917 } | 5917 } |
5918 // Now check if name is found in any imported libs. | 5918 // Now check if name is found in any imported libs. |
5919 const Array& imports = Array::Handle(this->imports()); | 5919 const Array& imports = Array::Handle(this->imports()); |
5920 Namespace& import = Namespace::Handle(); | 5920 Namespace& import = Namespace::Handle(); |
5921 for (intptr_t j = 0; j < this->num_imports(); j++) { | 5921 for (intptr_t j = 0; j < this->num_imports(); j++) { |
5922 import |= imports.At(j); | 5922 import ^= imports.At(j); |
5923 obj = import.Lookup(name); | 5923 obj = import.Lookup(name); |
5924 if (!obj.IsNull()) { | 5924 if (!obj.IsNull()) { |
5925 return obj.raw(); | 5925 return obj.raw(); |
5926 } | 5926 } |
5927 } | 5927 } |
5928 return Object::null(); | 5928 return Object::null(); |
5929 } | 5929 } |
5930 | 5930 |
5931 | 5931 |
5932 RawClass* Library::LookupClass(const String& name) const { | 5932 RawClass* Library::LookupClass(const String& name) const { |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6001 return import.library(); | 6001 return import.library(); |
6002 } | 6002 } |
6003 | 6003 |
6004 | 6004 |
6005 RawNamespace* Library::ImportAt(intptr_t index) const { | 6005 RawNamespace* Library::ImportAt(intptr_t index) const { |
6006 if ((index < 0) || index >= num_imports()) { | 6006 if ((index < 0) || index >= num_imports()) { |
6007 return Namespace::null(); | 6007 return Namespace::null(); |
6008 } | 6008 } |
6009 const Array& import_list = Array::Handle(imports()); | 6009 const Array& import_list = Array::Handle(imports()); |
6010 Namespace& import = Namespace::Handle(); | 6010 Namespace& import = Namespace::Handle(); |
6011 import |= import_list.At(index); | 6011 import ^= import_list.At(index); |
6012 return import.raw(); | 6012 return import.raw(); |
6013 } | 6013 } |
6014 | 6014 |
6015 | 6015 |
6016 bool Library::ImportsCorelib() const { | 6016 bool Library::ImportsCorelib() const { |
6017 Isolate* isolate = Isolate::Current(); | 6017 Isolate* isolate = Isolate::Current(); |
6018 Library& imported = Library::Handle(isolate); | 6018 Library& imported = Library::Handle(isolate); |
6019 intptr_t count = num_imports(); | 6019 intptr_t count = num_imports(); |
6020 for (int i = 0; i < count; i++) { | 6020 for (int i = 0; i < count; i++) { |
6021 imported = ImportLibraryAt(i); | 6021 imported = ImportLibraryAt(i); |
(...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6282 } | 6282 } |
6283 | 6283 |
6284 | 6284 |
6285 RawLibrary* Library::LookupLibrary(const String &url) { | 6285 RawLibrary* Library::LookupLibrary(const String &url) { |
6286 Isolate* isolate = Isolate::Current(); | 6286 Isolate* isolate = Isolate::Current(); |
6287 Library& lib = Library::Handle(isolate, Library::null()); | 6287 Library& lib = Library::Handle(isolate, Library::null()); |
6288 String& lib_url = String::Handle(isolate, String::null()); | 6288 String& lib_url = String::Handle(isolate, String::null()); |
6289 GrowableObjectArray& libs = GrowableObjectArray::Handle( | 6289 GrowableObjectArray& libs = GrowableObjectArray::Handle( |
6290 isolate, isolate->object_store()->libraries()); | 6290 isolate, isolate->object_store()->libraries()); |
6291 for (int i = 0; i < libs.Length(); i++) { | 6291 for (int i = 0; i < libs.Length(); i++) { |
6292 lib |= libs.At(i); | 6292 lib ^= libs.At(i); |
6293 lib_url = lib.url(); | 6293 lib_url ^= lib.url(); |
6294 if (lib_url.Equals(url)) { | 6294 if (lib_url.Equals(url)) { |
6295 return lib.raw(); | 6295 return lib.raw(); |
6296 } | 6296 } |
6297 } | 6297 } |
6298 return Library::null(); | 6298 return Library::null(); |
6299 } | 6299 } |
6300 | 6300 |
6301 | 6301 |
6302 RawError* Library::Patch(const Script& script) const { | 6302 RawError* Library::Patch(const Script& script) const { |
6303 ASSERT(script.kind() == RawScript::kPatchTag); | 6303 ASSERT(script.kind() == RawScript::kPatchTag); |
6304 return Compiler::Compile(*this, script); | 6304 return Compiler::Compile(*this, script); |
6305 } | 6305 } |
6306 | 6306 |
6307 | 6307 |
6308 bool Library::IsKeyUsed(intptr_t key) { | 6308 bool Library::IsKeyUsed(intptr_t key) { |
6309 intptr_t lib_key; | 6309 intptr_t lib_key; |
6310 const GrowableObjectArray& libs = GrowableObjectArray::Handle( | 6310 const GrowableObjectArray& libs = GrowableObjectArray::Handle( |
6311 Isolate::Current()->object_store()->libraries()); | 6311 Isolate::Current()->object_store()->libraries()); |
6312 Library& lib = Library::Handle(); | 6312 Library& lib = Library::Handle(); |
6313 String& lib_url = String::Handle(); | 6313 String& lib_url = String::Handle(); |
6314 for (int i = 0; i < libs.Length(); i++) { | 6314 for (int i = 0; i < libs.Length(); i++) { |
6315 lib |= libs.At(i); | 6315 lib ^= libs.At(i); |
6316 lib_url |= lib.url(); | 6316 lib_url ^= lib.url(); |
6317 lib_key = lib_url.Hash(); | 6317 lib_key = lib_url.Hash(); |
6318 if (lib_key == key) { | 6318 if (lib_key == key) { |
6319 return true; | 6319 return true; |
6320 } | 6320 } |
6321 } | 6321 } |
6322 return false; | 6322 return false; |
6323 } | 6323 } |
6324 | 6324 |
6325 | 6325 |
6326 static bool IsPrivate(const String& name) { | 6326 static bool IsPrivate(const String& name) { |
6327 if (ShouldBePrivate(name)) return true; | 6327 if (ShouldBePrivate(name)) return true; |
6328 // Factory names: List._fromLiteral. | 6328 // Factory names: List._fromLiteral. |
6329 for (intptr_t i = 1; i < name.Length() - 1; i++) { | 6329 for (intptr_t i = 1; i < name.Length() - 1; i++) { |
6330 if (name.CharAt(i) == '.') { | 6330 if (name.CharAt(i) == '.') { |
6331 if (name.CharAt(i + 1) == '_') { | 6331 if (name.CharAt(i + 1) == '_') { |
6332 return true; | 6332 return true; |
6333 } | 6333 } |
6334 } | 6334 } |
6335 } | 6335 } |
6336 return false; | 6336 return false; |
6337 } | 6337 } |
6338 | 6338 |
6339 | 6339 |
6340 // Cannot handle qualified names properly as it only appends private key to | 6340 // Cannot handle qualified names properly as it only appends private key to |
6341 // the end (e.g. _Alfa.foo -> _Alfa.foo@...). | 6341 // the end (e.g. _Alfa.foo -> _Alfa.foo@...). |
6342 RawString* Library::PrivateName(const String& name) const { | 6342 RawString* Library::PrivateName(const String& name) const { |
6343 ASSERT(IsPrivate(name)); | 6343 ASSERT(IsPrivate(name)); |
6344 // ASSERT(strchr(name, '@') == NULL); | 6344 // ASSERT(strchr(name, '@') == NULL); |
6345 String& str = String::Handle(); | 6345 String& str = String::Handle(); |
6346 str |= name.raw(); | 6346 str = name.raw(); |
6347 str = String::Concat(str, String::Handle(this->private_key())); | 6347 str = String::Concat(str, String::Handle(this->private_key())); |
6348 str = Symbols::New(str); | 6348 str = Symbols::New(str); |
6349 return str.raw(); | 6349 return str.raw(); |
6350 } | 6350 } |
6351 | 6351 |
6352 | 6352 |
6353 RawLibrary* Library::GetLibrary(intptr_t index) { | 6353 RawLibrary* Library::GetLibrary(intptr_t index) { |
6354 Isolate* isolate = Isolate::Current(); | 6354 Isolate* isolate = Isolate::Current(); |
6355 const GrowableObjectArray& libs = | 6355 const GrowableObjectArray& libs = |
6356 GrowableObjectArray::Handle(isolate->object_store()->libraries()); | 6356 GrowableObjectArray::Handle(isolate->object_store()->libraries()); |
6357 ASSERT(!libs.IsNull()); | 6357 ASSERT(!libs.IsNull()); |
6358 if ((0 <= index) && (index < libs.Length())) { | 6358 if ((0 <= index) && (index < libs.Length())) { |
6359 Library& lib = Library::Handle(); | 6359 Library& lib = Library::Handle(); |
6360 lib |= libs.At(index); | 6360 lib ^= libs.At(index); |
6361 return lib.raw(); | 6361 return lib.raw(); |
6362 } | 6362 } |
6363 return Library::null(); | 6363 return Library::null(); |
6364 } | 6364 } |
6365 | 6365 |
6366 | 6366 |
6367 void Library::Register() const { | 6367 void Library::Register() const { |
6368 ASSERT(Library::LookupLibrary(String::Handle(url())) == Library::null()); | 6368 ASSERT(Library::LookupLibrary(String::Handle(url())) == Library::null()); |
6369 ObjectStore* object_store = Isolate::Current()->object_store(); | 6369 ObjectStore* object_store = Isolate::Current()->object_store(); |
6370 GrowableObjectArray& libs = | 6370 GrowableObjectArray& libs = |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6427 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len); | 6427 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len); |
6428 OS::SNPrint(chars, len, kFormat, name.ToCString()); | 6428 OS::SNPrint(chars, len, kFormat, name.ToCString()); |
6429 return chars; | 6429 return chars; |
6430 } | 6430 } |
6431 | 6431 |
6432 | 6432 |
6433 RawLibrary* LibraryPrefix::GetLibrary(int index) const { | 6433 RawLibrary* LibraryPrefix::GetLibrary(int index) const { |
6434 if ((index >= 0) || (index < num_imports())) { | 6434 if ((index >= 0) || (index < num_imports())) { |
6435 const Array& imports = Array::Handle(this->imports()); | 6435 const Array& imports = Array::Handle(this->imports()); |
6436 Namespace& import = Namespace::Handle(); | 6436 Namespace& import = Namespace::Handle(); |
6437 import |= imports.At(index); | 6437 import ^= imports.At(index); |
6438 return import.library(); | 6438 return import.library(); |
6439 } | 6439 } |
6440 return Library::null(); | 6440 return Library::null(); |
6441 } | 6441 } |
6442 | 6442 |
6443 | 6443 |
6444 bool LibraryPrefix::ContainsLibrary(const Library& library) const { | 6444 bool LibraryPrefix::ContainsLibrary(const Library& library) const { |
6445 intptr_t num_current_imports = num_imports(); | 6445 intptr_t num_current_imports = num_imports(); |
6446 if (num_current_imports > 0) { | 6446 if (num_current_imports > 0) { |
6447 Library& lib = Library::Handle(); | 6447 Library& lib = Library::Handle(); |
(...skipping 27 matching lines...) Expand all Loading... |
6475 imports.SetAt(num_current_imports, import); | 6475 imports.SetAt(num_current_imports, import); |
6476 set_num_imports(num_current_imports + 1); | 6476 set_num_imports(num_current_imports + 1); |
6477 } | 6477 } |
6478 | 6478 |
6479 | 6479 |
6480 RawClass* LibraryPrefix::LookupLocalClass(const String& class_name) const { | 6480 RawClass* LibraryPrefix::LookupLocalClass(const String& class_name) const { |
6481 Array& imports = Array::Handle(this->imports()); | 6481 Array& imports = Array::Handle(this->imports()); |
6482 Object& obj = Object::Handle(); | 6482 Object& obj = Object::Handle(); |
6483 Namespace& import = Namespace::Handle(); | 6483 Namespace& import = Namespace::Handle(); |
6484 for (intptr_t i = 0; i < num_imports(); i++) { | 6484 for (intptr_t i = 0; i < num_imports(); i++) { |
6485 import |= imports.At(i); | 6485 import ^= imports.At(i); |
6486 obj = import.Lookup(class_name); | 6486 obj = import.Lookup(class_name); |
6487 if (!obj.IsNull() && obj.IsClass()) { | 6487 if (!obj.IsNull() && obj.IsClass()) { |
6488 // TODO(hausner): | 6488 // TODO(hausner): |
6489 return Class::Cast(obj).raw(); | 6489 return Class::Cast(obj).raw(); |
6490 } | 6490 } |
6491 } | 6491 } |
6492 return Class::null(); | 6492 return Class::null(); |
6493 } | 6493 } |
6494 | 6494 |
6495 | 6495 |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6549 } | 6549 } |
6550 | 6550 |
6551 | 6551 |
6552 bool Namespace::HidesName(const String& name) const { | 6552 bool Namespace::HidesName(const String& name) const { |
6553 // Check whether the name is in the list of explicitly hidden names. | 6553 // Check whether the name is in the list of explicitly hidden names. |
6554 if (hide_names() != Array::null()) { | 6554 if (hide_names() != Array::null()) { |
6555 const Array& names = Array::Handle(hide_names()); | 6555 const Array& names = Array::Handle(hide_names()); |
6556 String& hidden = String::Handle(); | 6556 String& hidden = String::Handle(); |
6557 intptr_t num_names = names.Length(); | 6557 intptr_t num_names = names.Length(); |
6558 for (intptr_t i = 0; i < num_names; i++) { | 6558 for (intptr_t i = 0; i < num_names; i++) { |
6559 hidden |= names.At(i); | 6559 hidden ^= names.At(i); |
6560 if (name.Equals(hidden)) { | 6560 if (name.Equals(hidden)) { |
6561 return true; | 6561 return true; |
6562 } | 6562 } |
6563 } | 6563 } |
6564 } | 6564 } |
6565 // The name is not explicitly hidden. Now check whether it is in the | 6565 // The name is not explicitly hidden. Now check whether it is in the |
6566 // list of explicitly visible names, if there is one. | 6566 // list of explicitly visible names, if there is one. |
6567 if (show_names() != Array::null()) { | 6567 if (show_names() != Array::null()) { |
6568 const Array& names = Array::Handle(show_names()); | 6568 const Array& names = Array::Handle(show_names()); |
6569 String& shown = String::Handle(); | 6569 String& shown = String::Handle(); |
6570 intptr_t num_names = names.Length(); | 6570 intptr_t num_names = names.Length(); |
6571 for (intptr_t i = 0; i < num_names; i++) { | 6571 for (intptr_t i = 0; i < num_names; i++) { |
6572 shown |= names.At(i); | 6572 shown ^= names.At(i); |
6573 if (name.Equals(shown)) { | 6573 if (name.Equals(shown)) { |
6574 return false; | 6574 return false; |
6575 } | 6575 } |
6576 } | 6576 } |
6577 // There is a list of visible names. The name we're looking for is not | 6577 // There is a list of visible names. The name we're looking for is not |
6578 // contained in the list, so it is hidden. | 6578 // contained in the list, so it is hidden. |
6579 return true; | 6579 return true; |
6580 } | 6580 } |
6581 // The name is not filtered out. | 6581 // The name is not filtered out. |
6582 return false; | 6582 return false; |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6621 } | 6621 } |
6622 | 6622 |
6623 | 6623 |
6624 RawError* Library::CompileAll() { | 6624 RawError* Library::CompileAll() { |
6625 Error& error = Error::Handle(); | 6625 Error& error = Error::Handle(); |
6626 const GrowableObjectArray& libs = GrowableObjectArray::Handle( | 6626 const GrowableObjectArray& libs = GrowableObjectArray::Handle( |
6627 Isolate::Current()->object_store()->libraries()); | 6627 Isolate::Current()->object_store()->libraries()); |
6628 Library& lib = Library::Handle(); | 6628 Library& lib = Library::Handle(); |
6629 Class& cls = Class::Handle(); | 6629 Class& cls = Class::Handle(); |
6630 for (int i = 0; i < libs.Length(); i++) { | 6630 for (int i = 0; i < libs.Length(); i++) { |
6631 lib |= libs.At(i); | 6631 lib ^= libs.At(i); |
6632 ClassDictionaryIterator it(lib); | 6632 ClassDictionaryIterator it(lib); |
6633 while (it.HasNext()) { | 6633 while (it.HasNext()) { |
6634 cls |= it.GetNextClass(); | 6634 cls = it.GetNextClass(); |
6635 error = Compiler::CompileAllFunctions(cls); | 6635 error = Compiler::CompileAllFunctions(cls); |
6636 if (!error.IsNull()) { | 6636 if (!error.IsNull()) { |
6637 return error.raw(); | 6637 return error.raw(); |
6638 } | 6638 } |
6639 } | 6639 } |
6640 Array& anon_classes = Array::Handle(lib.raw_ptr()->anonymous_classes_); | 6640 Array& anon_classes = Array::Handle(lib.raw_ptr()->anonymous_classes_); |
6641 for (int i = 0; i < lib.raw_ptr()->num_anonymous_; i++) { | 6641 for (int i = 0; i < lib.raw_ptr()->num_anonymous_; i++) { |
6642 cls |= anon_classes.At(i); | 6642 cls ^= anon_classes.At(i); |
6643 error = Compiler::CompileAllFunctions(cls); | 6643 error = Compiler::CompileAllFunctions(cls); |
6644 if (!error.IsNull()) { | 6644 if (!error.IsNull()) { |
6645 return error.raw(); | 6645 return error.raw(); |
6646 } | 6646 } |
6647 } | 6647 } |
6648 } | 6648 } |
6649 return error.raw(); | 6649 return error.raw(); |
6650 } | 6650 } |
6651 | 6651 |
6652 | 6652 |
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6961 return chars; | 6961 return chars; |
6962 } | 6962 } |
6963 } | 6963 } |
6964 | 6964 |
6965 | 6965 |
6966 RawString* LocalVarDescriptors::GetName(intptr_t var_index) const { | 6966 RawString* LocalVarDescriptors::GetName(intptr_t var_index) const { |
6967 ASSERT(var_index < Length()); | 6967 ASSERT(var_index < Length()); |
6968 const Array& names = Array::Handle(raw_ptr()->names_); | 6968 const Array& names = Array::Handle(raw_ptr()->names_); |
6969 ASSERT(Length() == names.Length()); | 6969 ASSERT(Length() == names.Length()); |
6970 String& name = String::Handle(); | 6970 String& name = String::Handle(); |
6971 name |= names.At(var_index); | 6971 name ^= names.At(var_index); |
6972 return name.raw(); | 6972 return name.raw(); |
6973 } | 6973 } |
6974 | 6974 |
6975 | 6975 |
6976 void LocalVarDescriptors::SetVar(intptr_t var_index, | 6976 void LocalVarDescriptors::SetVar(intptr_t var_index, |
6977 const String& name, | 6977 const String& name, |
6978 RawLocalVarDescriptors::VarInfo* info) const { | 6978 RawLocalVarDescriptors::VarInfo* info) const { |
6979 ASSERT(var_index < Length()); | 6979 ASSERT(var_index < Length()); |
6980 const Array& names = Array::Handle(raw_ptr()->names_); | 6980 const Array& names = Array::Handle(raw_ptr()->names_); |
6981 ASSERT(Length() == names.Length()); | 6981 ASSERT(Length() == names.Length()); |
(...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7294 intptr_t Code::Comments::Length() const { | 7294 intptr_t Code::Comments::Length() const { |
7295 if (comments_.IsNull()) { | 7295 if (comments_.IsNull()) { |
7296 return 0; | 7296 return 0; |
7297 } | 7297 } |
7298 return comments_.Length() / kNumberOfEntries; | 7298 return comments_.Length() / kNumberOfEntries; |
7299 } | 7299 } |
7300 | 7300 |
7301 | 7301 |
7302 intptr_t Code::Comments::PCOffsetAt(intptr_t idx) const { | 7302 intptr_t Code::Comments::PCOffsetAt(intptr_t idx) const { |
7303 Smi& result = Smi::Handle(); | 7303 Smi& result = Smi::Handle(); |
7304 result |= comments_.At(idx * kNumberOfEntries + kPCOffsetEntry); | 7304 result ^= comments_.At(idx * kNumberOfEntries + kPCOffsetEntry); |
7305 return result.Value(); | 7305 return result.Value(); |
7306 } | 7306 } |
7307 | 7307 |
7308 | 7308 |
7309 void Code::Comments::SetPCOffsetAt(intptr_t idx, intptr_t pc) { | 7309 void Code::Comments::SetPCOffsetAt(intptr_t idx, intptr_t pc) { |
7310 comments_.SetAt(idx * kNumberOfEntries + kPCOffsetEntry, | 7310 comments_.SetAt(idx * kNumberOfEntries + kPCOffsetEntry, |
7311 Smi::Handle(Smi::New(pc))); | 7311 Smi::Handle(Smi::New(pc))); |
7312 } | 7312 } |
7313 | 7313 |
7314 | 7314 |
7315 RawString* Code::Comments::CommentAt(intptr_t idx) const { | 7315 RawString* Code::Comments::CommentAt(intptr_t idx) const { |
7316 String& result = String::Handle(); | 7316 String& result = String::Handle(); |
7317 result |= comments_.At(idx * kNumberOfEntries + kCommentEntry); | 7317 result ^= comments_.At(idx * kNumberOfEntries + kCommentEntry); |
7318 return result.raw(); | 7318 return result.raw(); |
7319 } | 7319 } |
7320 | 7320 |
7321 | 7321 |
7322 void Code::Comments::SetCommentAt(intptr_t idx, const String& comment) { | 7322 void Code::Comments::SetCommentAt(intptr_t idx, const String& comment) { |
7323 comments_.SetAt(idx * kNumberOfEntries + kCommentEntry, comment); | 7323 comments_.SetAt(idx * kNumberOfEntries + kCommentEntry, comment); |
7324 } | 7324 } |
7325 | 7325 |
7326 | 7326 |
7327 Code::Comments::Comments(const Array& comments) | 7327 Code::Comments::Comments(const Array& comments) |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7374 | 7374 |
7375 | 7375 |
7376 RawFunction* Code::GetStaticCallTargetFunctionAt(uword pc) const { | 7376 RawFunction* Code::GetStaticCallTargetFunctionAt(uword pc) const { |
7377 RawObject* raw_code_offset = | 7377 RawObject* raw_code_offset = |
7378 reinterpret_cast<RawObject*>(Smi::New(pc - EntryPoint())); | 7378 reinterpret_cast<RawObject*>(Smi::New(pc - EntryPoint())); |
7379 const Array& array = | 7379 const Array& array = |
7380 Array::Handle(raw_ptr()->static_calls_target_table_); | 7380 Array::Handle(raw_ptr()->static_calls_target_table_); |
7381 for (intptr_t i = 0; i < array.Length(); i += kSCallTableEntryLength) { | 7381 for (intptr_t i = 0; i < array.Length(); i += kSCallTableEntryLength) { |
7382 if (array.At(i) == raw_code_offset) { | 7382 if (array.At(i) == raw_code_offset) { |
7383 Function& function = Function::Handle(); | 7383 Function& function = Function::Handle(); |
7384 function |= array.At(i + kSCallTableFunctionEntry); | 7384 function ^= array.At(i + kSCallTableFunctionEntry); |
7385 return function.raw(); | 7385 return function.raw(); |
7386 } | 7386 } |
7387 } | 7387 } |
7388 return Function::null(); | 7388 return Function::null(); |
7389 } | 7389 } |
7390 | 7390 |
7391 | 7391 |
7392 void Code::SetStaticCallTargetCodeAt(uword pc, const Code& code) const { | 7392 void Code::SetStaticCallTargetCodeAt(uword pc, const Code& code) const { |
7393 RawObject* raw_code_offset = | 7393 RawObject* raw_code_offset = |
7394 reinterpret_cast<RawObject*>(Smi::New(pc - EntryPoint())); | 7394 reinterpret_cast<RawObject*>(Smi::New(pc - EntryPoint())); |
(...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7659 if (stackmaps() == Array::null()) { | 7659 if (stackmaps() == Array::null()) { |
7660 // No stack maps are present in the code object which means this | 7660 // No stack maps are present in the code object which means this |
7661 // frame relies on tagged pointers. | 7661 // frame relies on tagged pointers. |
7662 return Stackmap::null(); | 7662 return Stackmap::null(); |
7663 } | 7663 } |
7664 // A stack map is present in the code object, use the stack map to visit | 7664 // A stack map is present in the code object, use the stack map to visit |
7665 // frame slots which are marked as having objects. | 7665 // frame slots which are marked as having objects. |
7666 *maps = stackmaps(); | 7666 *maps = stackmaps(); |
7667 *map = Stackmap::null(); | 7667 *map = Stackmap::null(); |
7668 for (intptr_t i = 0; i < maps->Length(); i++) { | 7668 for (intptr_t i = 0; i < maps->Length(); i++) { |
7669 *map |= maps->At(i); | 7669 *map ^= maps->At(i); |
7670 ASSERT(!map->IsNull()); | 7670 ASSERT(!map->IsNull()); |
7671 if (map->PC() == pc) { | 7671 if (map->PC() == pc) { |
7672 return map->raw(); // We found a stack map for this frame. | 7672 return map->raw(); // We found a stack map for this frame. |
7673 } | 7673 } |
7674 } | 7674 } |
7675 // If the code has stackmaps, it must have them for all safepoints. | 7675 // If the code has stackmaps, it must have them for all safepoints. |
7676 UNREACHABLE(); | 7676 UNREACHABLE(); |
7677 return Stackmap::null(); | 7677 return Stackmap::null(); |
7678 } | 7678 } |
7679 | 7679 |
(...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7974 GrowableArray<intptr_t>* class_ids, | 7974 GrowableArray<intptr_t>* class_ids, |
7975 Function* target) const { | 7975 Function* target) const { |
7976 ASSERT(index < NumberOfChecks()); | 7976 ASSERT(index < NumberOfChecks()); |
7977 ASSERT(class_ids != NULL); | 7977 ASSERT(class_ids != NULL); |
7978 ASSERT(target != NULL); | 7978 ASSERT(target != NULL); |
7979 class_ids->Clear(); | 7979 class_ids->Clear(); |
7980 const Array& data = Array::Handle(ic_data()); | 7980 const Array& data = Array::Handle(ic_data()); |
7981 intptr_t data_pos = index * TestEntryLength(); | 7981 intptr_t data_pos = index * TestEntryLength(); |
7982 Smi& smi = Smi::Handle(); | 7982 Smi& smi = Smi::Handle(); |
7983 for (intptr_t i = 0; i < num_args_tested(); i++) { | 7983 for (intptr_t i = 0; i < num_args_tested(); i++) { |
7984 smi |= data.At(data_pos++); | 7984 smi ^= data.At(data_pos++); |
7985 class_ids->Add(smi.Value()); | 7985 class_ids->Add(smi.Value()); |
7986 } | 7986 } |
7987 (*target) |= data.At(data_pos++); | 7987 (*target) ^= data.At(data_pos++); |
7988 } | 7988 } |
7989 | 7989 |
7990 | 7990 |
7991 void ICData::GetOneClassCheckAt(intptr_t index, | 7991 void ICData::GetOneClassCheckAt(intptr_t index, |
7992 intptr_t* class_id, | 7992 intptr_t* class_id, |
7993 Function* target) const { | 7993 Function* target) const { |
7994 ASSERT(class_id != NULL); | 7994 ASSERT(class_id != NULL); |
7995 ASSERT(target != NULL); | 7995 ASSERT(target != NULL); |
7996 ASSERT(num_args_tested() == 1); | 7996 ASSERT(num_args_tested() == 1); |
7997 const Array& data = Array::Handle(ic_data()); | 7997 const Array& data = Array::Handle(ic_data()); |
7998 intptr_t data_pos = index * TestEntryLength(); | 7998 intptr_t data_pos = index * TestEntryLength(); |
7999 Smi& smi = Smi::Handle(); | 7999 Smi& smi = Smi::Handle(); |
8000 smi |= data.At(data_pos); | 8000 smi ^= data.At(data_pos); |
8001 *class_id = smi.Value(); | 8001 *class_id = smi.Value(); |
8002 *target |= data.At(data_pos + 1); | 8002 *target ^= data.At(data_pos + 1); |
8003 } | 8003 } |
8004 | 8004 |
8005 | 8005 |
8006 intptr_t ICData::GetClassIdAt(intptr_t index, intptr_t arg_nr) const { | 8006 intptr_t ICData::GetClassIdAt(intptr_t index, intptr_t arg_nr) const { |
8007 GrowableArray<intptr_t> class_ids; | 8007 GrowableArray<intptr_t> class_ids; |
8008 Function& target = Function::Handle(); | 8008 Function& target = Function::Handle(); |
8009 GetCheckAt(index, &class_ids, &target); | 8009 GetCheckAt(index, &class_ids, &target); |
8010 return class_ids[arg_nr]; | 8010 return class_ids[arg_nr]; |
8011 } | 8011 } |
8012 | 8012 |
8013 | 8013 |
8014 intptr_t ICData::GetReceiverClassIdAt(intptr_t index) const { | 8014 intptr_t ICData::GetReceiverClassIdAt(intptr_t index) const { |
8015 ASSERT(index < NumberOfChecks()); | 8015 ASSERT(index < NumberOfChecks()); |
8016 const Array& data = Array::Handle(ic_data()); | 8016 const Array& data = Array::Handle(ic_data()); |
8017 const intptr_t data_pos = index * TestEntryLength(); | 8017 const intptr_t data_pos = index * TestEntryLength(); |
8018 Smi& smi = Smi::Handle(); | 8018 Smi& smi = Smi::Handle(); |
8019 smi |= data.At(data_pos); | 8019 smi ^= data.At(data_pos); |
8020 return smi.Value(); | 8020 return smi.Value(); |
8021 } | 8021 } |
8022 | 8022 |
8023 | 8023 |
8024 RawFunction* ICData::GetTargetAt(intptr_t index) const { | 8024 RawFunction* ICData::GetTargetAt(intptr_t index) const { |
8025 const Array& data = Array::Handle(ic_data()); | 8025 const Array& data = Array::Handle(ic_data()); |
8026 const intptr_t data_pos = index * TestEntryLength() + num_args_tested(); | 8026 const intptr_t data_pos = index * TestEntryLength() + num_args_tested(); |
8027 ASSERT(Object::Handle(data.At(data_pos)).IsFunction()); | 8027 ASSERT(Object::Handle(data.At(data_pos)).IsFunction()); |
8028 return reinterpret_cast<RawFunction*>(data.At(data_pos)); | 8028 return reinterpret_cast<RawFunction*>(data.At(data_pos)); |
8029 } | 8029 } |
8030 | 8030 |
8031 | 8031 |
8032 intptr_t ICData::GetCountAt(intptr_t index) const { | 8032 intptr_t ICData::GetCountAt(intptr_t index) const { |
8033 const Array& data = Array::Handle(ic_data()); | 8033 const Array& data = Array::Handle(ic_data()); |
8034 const intptr_t data_pos = index * TestEntryLength() + | 8034 const intptr_t data_pos = index * TestEntryLength() + |
8035 CountIndexFor(num_args_tested()); | 8035 CountIndexFor(num_args_tested()); |
8036 Smi& smi = Smi::Handle(); | 8036 Smi& smi = Smi::Handle(); |
8037 smi |= data.At(data_pos); | 8037 smi ^= data.At(data_pos); |
8038 return smi.Value(); | 8038 return smi.Value(); |
8039 } | 8039 } |
8040 | 8040 |
8041 | 8041 |
8042 intptr_t ICData::AggregateCount() const { | 8042 intptr_t ICData::AggregateCount() const { |
8043 const intptr_t len = NumberOfChecks(); | 8043 const intptr_t len = NumberOfChecks(); |
8044 intptr_t count = 0; | 8044 intptr_t count = 0; |
8045 for (intptr_t i = 0; i < len; i++) { | 8045 for (intptr_t i = 0; i < len; i++) { |
8046 count += GetCountAt(i); | 8046 count += GetCountAt(i); |
8047 } | 8047 } |
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8259 Isolate::Current()->megamorphic_cache_table()->miss_handler()); | 8259 Isolate::Current()->megamorphic_cache_table()->miss_handler()); |
8260 for (intptr_t i = 0; i < new_capacity; ++i) { | 8260 for (intptr_t i = 0; i < new_capacity; ++i) { |
8261 SetEntry(new_buckets, i, class_id, target); | 8261 SetEntry(new_buckets, i, class_id, target); |
8262 } | 8262 } |
8263 set_buckets(new_buckets); | 8263 set_buckets(new_buckets); |
8264 set_mask(new_capacity - 1); | 8264 set_mask(new_capacity - 1); |
8265 set_filled_entry_count(0); | 8265 set_filled_entry_count(0); |
8266 | 8266 |
8267 // Rehash the valid entries. | 8267 // Rehash the valid entries. |
8268 for (intptr_t i = 0; i < old_capacity; ++i) { | 8268 for (intptr_t i = 0; i < old_capacity; ++i) { |
8269 class_id |= GetClassId(old_buckets, i); | 8269 class_id ^= GetClassId(old_buckets, i); |
8270 if (class_id.Value() != kIllegalCid) { | 8270 if (class_id.Value() != kIllegalCid) { |
8271 target |= GetTargetFunction(old_buckets, i); | 8271 target ^= GetTargetFunction(old_buckets, i); |
8272 Insert(class_id, target); | 8272 Insert(class_id, target); |
8273 } | 8273 } |
8274 } | 8274 } |
8275 } | 8275 } |
8276 } | 8276 } |
8277 | 8277 |
8278 | 8278 |
8279 void MegamorphicCache::Insert(const Smi& class_id, | 8279 void MegamorphicCache::Insert(const Smi& class_id, |
8280 const Function& target) const { | 8280 const Function& target) const { |
8281 ASSERT(static_cast<double>(filled_entry_count() + 1) <= | 8281 ASSERT(static_cast<double>(filled_entry_count() + 1) <= |
8282 (kLoadFactor * static_cast<double>(mask() + 1))); | 8282 (kLoadFactor * static_cast<double>(mask() + 1))); |
8283 const Array& backing_array = Array::Handle(buckets()); | 8283 const Array& backing_array = Array::Handle(buckets()); |
8284 intptr_t id_mask = mask(); | 8284 intptr_t id_mask = mask(); |
8285 intptr_t index = class_id.Value() & id_mask; | 8285 intptr_t index = class_id.Value() & id_mask; |
8286 Smi& probe = Smi::Handle(); | 8286 Smi& probe = Smi::Handle(); |
8287 intptr_t i = index; | 8287 intptr_t i = index; |
8288 do { | 8288 do { |
8289 probe |= GetClassId(backing_array, i); | 8289 probe ^= GetClassId(backing_array, i); |
8290 if (probe.Value() == kIllegalCid) { | 8290 if (probe.Value() == kIllegalCid) { |
8291 SetEntry(backing_array, i, class_id, target); | 8291 SetEntry(backing_array, i, class_id, target); |
8292 set_filled_entry_count(filled_entry_count() + 1); | 8292 set_filled_entry_count(filled_entry_count() + 1); |
8293 return; | 8293 return; |
8294 } | 8294 } |
8295 i = (i + 1) & id_mask; | 8295 i = (i + 1) & id_mask; |
8296 } while (i != index); | 8296 } while (i != index); |
8297 UNREACHABLE(); | 8297 UNREACHABLE(); |
8298 } | 8298 } |
8299 | 8299 |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8354 | 8354 |
8355 void SubtypeTestCache::GetCheck( | 8355 void SubtypeTestCache::GetCheck( |
8356 intptr_t ix, | 8356 intptr_t ix, |
8357 intptr_t* instance_class_id, | 8357 intptr_t* instance_class_id, |
8358 AbstractTypeArguments* instance_type_arguments, | 8358 AbstractTypeArguments* instance_type_arguments, |
8359 AbstractTypeArguments* instantiator_type_arguments, | 8359 AbstractTypeArguments* instantiator_type_arguments, |
8360 Bool* test_result) const { | 8360 Bool* test_result) const { |
8361 Array& data = Array::Handle(cache()); | 8361 Array& data = Array::Handle(cache()); |
8362 intptr_t data_pos = ix * kTestEntryLength; | 8362 intptr_t data_pos = ix * kTestEntryLength; |
8363 Smi& instance_class_id_handle = Smi::Handle(); | 8363 Smi& instance_class_id_handle = Smi::Handle(); |
8364 instance_class_id_handle |= data.At(data_pos + kInstanceClassId); | 8364 instance_class_id_handle ^= data.At(data_pos + kInstanceClassId); |
8365 *instance_class_id = instance_class_id_handle.Value(); | 8365 *instance_class_id = instance_class_id_handle.Value(); |
8366 *instance_type_arguments ^= data.At(data_pos + kInstanceTypeArguments); | 8366 *instance_type_arguments ^= data.At(data_pos + kInstanceTypeArguments); |
8367 *instantiator_type_arguments ^= | 8367 *instantiator_type_arguments ^= |
8368 data.At(data_pos + kInstantiatorTypeArguments); | 8368 data.At(data_pos + kInstantiatorTypeArguments); |
8369 *test_result |= data.At(data_pos + kTestResult); | 8369 *test_result ^= data.At(data_pos + kTestResult); |
8370 } | 8370 } |
8371 | 8371 |
8372 | 8372 |
8373 const char* SubtypeTestCache::ToCString() const { | 8373 const char* SubtypeTestCache::ToCString() const { |
8374 return "SubtypeTestCache"; | 8374 return "SubtypeTestCache"; |
8375 } | 8375 } |
8376 | 8376 |
8377 | 8377 |
8378 const char* Error::ToErrorCString() const { | 8378 const char* Error::ToErrorCString() const { |
8379 UNREACHABLE(); | 8379 UNREACHABLE(); |
(...skipping 1295 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9675 int Integer::CompareWith(const Integer& other) const { | 9675 int Integer::CompareWith(const Integer& other) const { |
9676 UNIMPLEMENTED(); | 9676 UNIMPLEMENTED(); |
9677 return 0; | 9677 return 0; |
9678 } | 9678 } |
9679 | 9679 |
9680 | 9680 |
9681 RawInteger* Integer::AsValidInteger() const { | 9681 RawInteger* Integer::AsValidInteger() const { |
9682 if (IsSmi()) return raw(); | 9682 if (IsSmi()) return raw(); |
9683 if (IsMint()) { | 9683 if (IsMint()) { |
9684 Mint& mint = Mint::Handle(); | 9684 Mint& mint = Mint::Handle(); |
9685 mint |= raw(); | 9685 mint ^= raw(); |
9686 if (Smi::IsValid64(mint.value())) { | 9686 if (Smi::IsValid64(mint.value())) { |
9687 return Smi::New(mint.value()); | 9687 return Smi::New(mint.value()); |
9688 } else { | 9688 } else { |
9689 return raw(); | 9689 return raw(); |
9690 } | 9690 } |
9691 } | 9691 } |
9692 ASSERT(IsBigint()); | 9692 ASSERT(IsBigint()); |
9693 Bigint& big_value = Bigint::Handle(); | 9693 Bigint& big_value = Bigint::Handle(); |
9694 big_value |= raw(); | 9694 big_value ^= raw(); |
9695 if (BigintOperations::FitsIntoSmi(big_value)) { | 9695 if (BigintOperations::FitsIntoSmi(big_value)) { |
9696 return BigintOperations::ToSmi(big_value); | 9696 return BigintOperations::ToSmi(big_value); |
9697 } else if (BigintOperations::FitsIntoMint(big_value)) { | 9697 } else if (BigintOperations::FitsIntoMint(big_value)) { |
9698 return Mint::New(BigintOperations::ToMint(big_value)); | 9698 return Mint::New(BigintOperations::ToMint(big_value)); |
9699 } else { | 9699 } else { |
9700 return big_value.raw(); | 9700 return big_value.raw(); |
9701 } | 9701 } |
9702 } | 9702 } |
9703 | 9703 |
9704 | 9704 |
9705 RawInteger* Integer::ArithmeticOp(Token::Kind operation, | 9705 RawInteger* Integer::ArithmeticOp(Token::Kind operation, |
9706 const Integer& other) const { | 9706 const Integer& other) const { |
9707 // In 32-bit mode, the result of any operation between two Smis will fit in a | 9707 // In 32-bit mode, the result of any operation between two Smis will fit in a |
9708 // 32-bit signed result, except the product of two Smis, which will be 64-bit. | 9708 // 32-bit signed result, except the product of two Smis, which will be 64-bit. |
9709 // In 64-bit mode, the result of any operation between two Smis will fit in a | 9709 // In 64-bit mode, the result of any operation between two Smis will fit in a |
9710 // 64-bit signed result, except the product of two Smis (unless the Smis are | 9710 // 64-bit signed result, except the product of two Smis (unless the Smis are |
9711 // 32-bit or less). | 9711 // 32-bit or less). |
9712 if (IsSmi() && other.IsSmi()) { | 9712 if (IsSmi() && other.IsSmi()) { |
9713 Smi& left_smi = Smi::Handle(); | 9713 Smi& left_smi = Smi::Handle(); |
9714 Smi& right_smi = Smi::Handle(); | 9714 Smi& right_smi = Smi::Handle(); |
9715 left_smi |= raw(); | 9715 left_smi ^= raw(); |
9716 right_smi |= other.raw(); | 9716 right_smi ^= other.raw(); |
9717 const intptr_t left_value = left_smi.Value(); | 9717 const intptr_t left_value = left_smi.Value(); |
9718 const intptr_t right_value = right_smi.Value(); | 9718 const intptr_t right_value = right_smi.Value(); |
9719 switch (operation) { | 9719 switch (operation) { |
9720 case Token::kADD: | 9720 case Token::kADD: |
9721 return Integer::New(left_value + right_value); | 9721 return Integer::New(left_value + right_value); |
9722 case Token::kSUB: | 9722 case Token::kSUB: |
9723 return Integer::New(left_value - right_value); | 9723 return Integer::New(left_value - right_value); |
9724 case Token::kMUL: { | 9724 case Token::kMUL: { |
9725 if (Smi::kBits < 32) { | 9725 if (Smi::kBits < 32) { |
9726 // In 32-bit mode, the product of two Smis fits in a 64-bit result. | 9726 // In 32-bit mode, the product of two Smis fits in a 64-bit result. |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9803 | 9803 |
9804 static bool Are64bitOperands(const Integer& op1, const Integer& op2) { | 9804 static bool Are64bitOperands(const Integer& op1, const Integer& op2) { |
9805 return !op1.IsBigint() && !op2.IsBigint(); | 9805 return !op1.IsBigint() && !op2.IsBigint(); |
9806 } | 9806 } |
9807 | 9807 |
9808 | 9808 |
9809 RawInteger* Integer::BitOp(Token::Kind kind, const Integer& other) const { | 9809 RawInteger* Integer::BitOp(Token::Kind kind, const Integer& other) const { |
9810 if (IsSmi() && other.IsSmi()) { | 9810 if (IsSmi() && other.IsSmi()) { |
9811 Smi& op1 = Smi::Handle(); | 9811 Smi& op1 = Smi::Handle(); |
9812 Smi& op2 = Smi::Handle(); | 9812 Smi& op2 = Smi::Handle(); |
9813 op1 |= raw(); | 9813 op1 ^= raw(); |
9814 op2 |= other.raw(); | 9814 op2 ^= other.raw(); |
9815 intptr_t result = 0; | 9815 intptr_t result = 0; |
9816 switch (kind) { | 9816 switch (kind) { |
9817 case Token::kBIT_AND: | 9817 case Token::kBIT_AND: |
9818 result = op1.Value() & op2.Value(); | 9818 result = op1.Value() & op2.Value(); |
9819 break; | 9819 break; |
9820 case Token::kBIT_OR: | 9820 case Token::kBIT_OR: |
9821 result = op1.Value() | op2.Value(); | 9821 result = op1.Value() | op2.Value(); |
9822 break; | 9822 break; |
9823 case Token::kBIT_XOR: | 9823 case Token::kBIT_XOR: |
9824 result = op1.Value() ^ op2.Value(); | 9824 result = op1.Value() ^ op2.Value(); |
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9998 ASSERT(!Smi::IsValid64(value)); | 9998 ASSERT(!Smi::IsValid64(value)); |
9999 const Class& cls = | 9999 const Class& cls = |
10000 Class::Handle(Isolate::Current()->object_store()->mint_class()); | 10000 Class::Handle(Isolate::Current()->object_store()->mint_class()); |
10001 const Array& constants = Array::Handle(cls.constants()); | 10001 const Array& constants = Array::Handle(cls.constants()); |
10002 const intptr_t constants_len = constants.Length(); | 10002 const intptr_t constants_len = constants.Length(); |
10003 // Linear search to see whether this value is already present in the | 10003 // Linear search to see whether this value is already present in the |
10004 // list of canonicalized constants. | 10004 // list of canonicalized constants. |
10005 Mint& canonical_value = Mint::Handle(); | 10005 Mint& canonical_value = Mint::Handle(); |
10006 intptr_t index = 0; | 10006 intptr_t index = 0; |
10007 while (index < constants_len) { | 10007 while (index < constants_len) { |
10008 canonical_value |= constants.At(index); | 10008 canonical_value ^= constants.At(index); |
10009 if (canonical_value.IsNull()) { | 10009 if (canonical_value.IsNull()) { |
10010 break; | 10010 break; |
10011 } | 10011 } |
10012 if (canonical_value.value() == value) { | 10012 if (canonical_value.value() == value) { |
10013 return canonical_value.raw(); | 10013 return canonical_value.raw(); |
10014 } | 10014 } |
10015 index++; | 10015 index++; |
10016 } | 10016 } |
10017 // The value needs to be added to the constants list. Grow the list if | 10017 // The value needs to be added to the constants list. Grow the list if |
10018 // it is full. | 10018 // it is full. |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10152 RawDouble* Double::NewCanonical(double value) { | 10152 RawDouble* Double::NewCanonical(double value) { |
10153 const Class& cls = | 10153 const Class& cls = |
10154 Class::Handle(Isolate::Current()->object_store()->double_class()); | 10154 Class::Handle(Isolate::Current()->object_store()->double_class()); |
10155 const Array& constants = Array::Handle(cls.constants()); | 10155 const Array& constants = Array::Handle(cls.constants()); |
10156 const intptr_t constants_len = constants.Length(); | 10156 const intptr_t constants_len = constants.Length(); |
10157 // Linear search to see whether this value is already present in the | 10157 // Linear search to see whether this value is already present in the |
10158 // list of canonicalized constants. | 10158 // list of canonicalized constants. |
10159 Double& canonical_value = Double::Handle(); | 10159 Double& canonical_value = Double::Handle(); |
10160 intptr_t index = 0; | 10160 intptr_t index = 0; |
10161 while (index < constants_len) { | 10161 while (index < constants_len) { |
10162 canonical_value |= constants.At(index); | 10162 canonical_value ^= constants.At(index); |
10163 if (canonical_value.IsNull()) { | 10163 if (canonical_value.IsNull()) { |
10164 break; | 10164 break; |
10165 } | 10165 } |
10166 if (canonical_value.EqualsToDouble(value)) { | 10166 if (canonical_value.EqualsToDouble(value)) { |
10167 return canonical_value.raw(); | 10167 return canonical_value.raw(); |
10168 } | 10168 } |
10169 index++; | 10169 index++; |
10170 } | 10170 } |
10171 // The value needs to be added to the constants list. Grow the list if | 10171 // The value needs to be added to the constants list. Grow the list if |
10172 // it is full. | 10172 // it is full. |
(...skipping 25 matching lines...) Expand all Loading... |
10198 buffer[kBufferSize - 1] = '\0'; | 10198 buffer[kBufferSize - 1] = '\0'; |
10199 DoubleToCString(value(), buffer, kBufferSize); | 10199 DoubleToCString(value(), buffer, kBufferSize); |
10200 return buffer; | 10200 return buffer; |
10201 } | 10201 } |
10202 | 10202 |
10203 | 10203 |
10204 RawBigint* Integer::AsBigint() const { | 10204 RawBigint* Integer::AsBigint() const { |
10205 ASSERT(!IsNull()); | 10205 ASSERT(!IsNull()); |
10206 if (IsSmi()) { | 10206 if (IsSmi()) { |
10207 Smi& smi = Smi::Handle(); | 10207 Smi& smi = Smi::Handle(); |
10208 smi |= raw(); | 10208 smi ^= raw(); |
10209 return BigintOperations::NewFromSmi(smi); | 10209 return BigintOperations::NewFromSmi(smi); |
10210 } else if (IsMint()) { | 10210 } else if (IsMint()) { |
10211 Mint& mint = Mint::Handle(); | 10211 Mint& mint = Mint::Handle(); |
10212 mint |= raw(); | 10212 mint ^= raw(); |
10213 return BigintOperations::NewFromInt64(mint.value()); | 10213 return BigintOperations::NewFromInt64(mint.value()); |
10214 } else { | 10214 } else { |
10215 ASSERT(IsBigint()); | 10215 ASSERT(IsBigint()); |
10216 Bigint& big = Bigint::Handle(); | 10216 Bigint& big = Bigint::Handle(); |
10217 big |= raw(); | 10217 big ^= raw(); |
10218 ASSERT(!BigintOperations::FitsIntoSmi(big)); | 10218 ASSERT(!BigintOperations::FitsIntoSmi(big)); |
10219 return big.raw(); | 10219 return big.raw(); |
10220 } | 10220 } |
10221 } | 10221 } |
10222 | 10222 |
10223 | 10223 |
10224 RawBigint* Bigint::ArithmeticOp(Token::Kind operation, | 10224 RawBigint* Bigint::ArithmeticOp(Token::Kind operation, |
10225 const Bigint& other) const { | 10225 const Bigint& other) const { |
10226 switch (operation) { | 10226 switch (operation) { |
10227 case Token::kADD: | 10227 case Token::kADD: |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10285 ASSERT(!BigintOperations::FitsIntoMint(value)); | 10285 ASSERT(!BigintOperations::FitsIntoMint(value)); |
10286 const Class& cls = | 10286 const Class& cls = |
10287 Class::Handle(Isolate::Current()->object_store()->bigint_class()); | 10287 Class::Handle(Isolate::Current()->object_store()->bigint_class()); |
10288 const Array& constants = Array::Handle(cls.constants()); | 10288 const Array& constants = Array::Handle(cls.constants()); |
10289 const intptr_t constants_len = constants.Length(); | 10289 const intptr_t constants_len = constants.Length(); |
10290 // Linear search to see whether this value is already present in the | 10290 // Linear search to see whether this value is already present in the |
10291 // list of canonicalized constants. | 10291 // list of canonicalized constants. |
10292 Bigint& canonical_value = Bigint::Handle(); | 10292 Bigint& canonical_value = Bigint::Handle(); |
10293 intptr_t index = 0; | 10293 intptr_t index = 0; |
10294 while (index < constants_len) { | 10294 while (index < constants_len) { |
10295 canonical_value |= constants.At(index); | 10295 canonical_value ^= constants.At(index); |
10296 if (canonical_value.IsNull()) { | 10296 if (canonical_value.IsNull()) { |
10297 break; | 10297 break; |
10298 } | 10298 } |
10299 if (canonical_value.Equals(value)) { | 10299 if (canonical_value.Equals(value)) { |
10300 return canonical_value.raw(); | 10300 return canonical_value.raw(); |
10301 } | 10301 } |
10302 index++; | 10302 index++; |
10303 } | 10303 } |
10304 // The value needs to be added to the constants list. Grow the list if | 10304 // The value needs to be added to the constants list. Grow the list if |
10305 // it is full. | 10305 // it is full. |
(...skipping 375 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10681 | 10681 |
10682 RawString* String::New(const String& str, Heap::Space space) { | 10682 RawString* String::New(const String& str, Heap::Space space) { |
10683 // Currently this just creates a copy of the string in the correct space. | 10683 // Currently this just creates a copy of the string in the correct space. |
10684 // Once we have external string support, this will also create a heap copy of | 10684 // Once we have external string support, this will also create a heap copy of |
10685 // the string if necessary. Some optimizations are possible, such as not | 10685 // the string if necessary. Some optimizations are possible, such as not |
10686 // copying internal strings into the same space. | 10686 // copying internal strings into the same space. |
10687 intptr_t len = str.Length(); | 10687 intptr_t len = str.Length(); |
10688 String& result = String::Handle(); | 10688 String& result = String::Handle(); |
10689 intptr_t char_size = str.CharSize(); | 10689 intptr_t char_size = str.CharSize(); |
10690 if (char_size == kOneByteChar) { | 10690 if (char_size == kOneByteChar) { |
10691 result |= OneByteString::New(len, space); | 10691 result = OneByteString::New(len, space); |
10692 } else { | 10692 } else { |
10693 ASSERT(char_size == kTwoByteChar); | 10693 ASSERT(char_size == kTwoByteChar); |
10694 result |= TwoByteString::New(len, space); | 10694 result = TwoByteString::New(len, space); |
10695 } | 10695 } |
10696 String::Copy(result, 0, str, 0, len); | 10696 String::Copy(result, 0, str, 0, len); |
10697 return result.raw(); | 10697 return result.raw(); |
10698 } | 10698 } |
10699 | 10699 |
10700 | 10700 |
10701 RawString* String::NewExternal(const uint8_t* characters, | 10701 RawString* String::NewExternal(const uint8_t* characters, |
10702 intptr_t len, | 10702 intptr_t len, |
10703 void* peer, | 10703 void* peer, |
10704 Dart_PeerFinalizer callback, | 10704 Dart_PeerFinalizer callback, |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10853 | 10853 |
10854 | 10854 |
10855 RawString* String::ConcatAll(const Array& strings, | 10855 RawString* String::ConcatAll(const Array& strings, |
10856 Heap::Space space) { | 10856 Heap::Space space) { |
10857 ASSERT(!strings.IsNull()); | 10857 ASSERT(!strings.IsNull()); |
10858 intptr_t result_len = 0; | 10858 intptr_t result_len = 0; |
10859 intptr_t strings_len = strings.Length(); | 10859 intptr_t strings_len = strings.Length(); |
10860 String& str = String::Handle(); | 10860 String& str = String::Handle(); |
10861 intptr_t char_size = kOneByteChar; | 10861 intptr_t char_size = kOneByteChar; |
10862 for (intptr_t i = 0; i < strings_len; i++) { | 10862 for (intptr_t i = 0; i < strings_len; i++) { |
10863 str |= strings.At(i); | 10863 str ^= strings.At(i); |
10864 result_len += str.Length(); | 10864 result_len += str.Length(); |
10865 char_size = Utils::Maximum(char_size, str.CharSize()); | 10865 char_size = Utils::Maximum(char_size, str.CharSize()); |
10866 } | 10866 } |
10867 if (char_size == kOneByteChar) { | 10867 if (char_size == kOneByteChar) { |
10868 return OneByteString::ConcatAll(strings, result_len, space); | 10868 return OneByteString::ConcatAll(strings, result_len, space); |
10869 } | 10869 } |
10870 ASSERT(char_size == kTwoByteChar); | 10870 ASSERT(char_size == kTwoByteChar); |
10871 return TwoByteString::ConcatAll(strings, result_len, space); | 10871 return TwoByteString::ConcatAll(strings, result_len, space); |
10872 } | 10872 } |
10873 | 10873 |
(...skipping 27 matching lines...) Expand all Loading... |
10901 intptr_t char_size = str.CharSize(); | 10901 intptr_t char_size = str.CharSize(); |
10902 if (char_size == kTwoByteChar) { | 10902 if (char_size == kTwoByteChar) { |
10903 for (intptr_t i = begin_index; i < begin_index + length; ++i) { | 10903 for (intptr_t i = begin_index; i < begin_index + length; ++i) { |
10904 if (!Utf::IsLatin1(str.CharAt(i))) { | 10904 if (!Utf::IsLatin1(str.CharAt(i))) { |
10905 is_one_byte_string = false; | 10905 is_one_byte_string = false; |
10906 break; | 10906 break; |
10907 } | 10907 } |
10908 } | 10908 } |
10909 } | 10909 } |
10910 if (is_one_byte_string) { | 10910 if (is_one_byte_string) { |
10911 result |= OneByteString::New(length, space); | 10911 result = OneByteString::New(length, space); |
10912 } else { | 10912 } else { |
10913 result |= TwoByteString::New(length, space); | 10913 result = TwoByteString::New(length, space); |
10914 } | 10914 } |
10915 String::Copy(result, 0, str, begin_index, length); | 10915 String::Copy(result, 0, str, begin_index, length); |
10916 return result.raw(); | 10916 return result.raw(); |
10917 } | 10917 } |
10918 | 10918 |
10919 | 10919 |
10920 const char* String::ToCString() const { | 10920 const char* String::ToCString() const { |
10921 intptr_t len = Utf8::Length(*this); | 10921 intptr_t len = Utf8::Length(*this); |
10922 Zone* zone = Isolate::Current()->current_zone(); | 10922 Zone* zone = Isolate::Current()->current_zone(); |
10923 uint8_t* result = zone->Alloc<uint8_t>(len + 1); | 10923 uint8_t* result = zone->Alloc<uint8_t>(len + 1); |
(...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11265 | 11265 |
11266 | 11266 |
11267 RawOneByteString* OneByteString::ConcatAll(const Array& strings, | 11267 RawOneByteString* OneByteString::ConcatAll(const Array& strings, |
11268 intptr_t len, | 11268 intptr_t len, |
11269 Heap::Space space) { | 11269 Heap::Space space) { |
11270 const String& result = String::Handle(OneByteString::New(len, space)); | 11270 const String& result = String::Handle(OneByteString::New(len, space)); |
11271 String& str = String::Handle(); | 11271 String& str = String::Handle(); |
11272 intptr_t strings_len = strings.Length(); | 11272 intptr_t strings_len = strings.Length(); |
11273 intptr_t pos = 0; | 11273 intptr_t pos = 0; |
11274 for (intptr_t i = 0; i < strings_len; i++) { | 11274 for (intptr_t i = 0; i < strings_len; i++) { |
11275 str |= strings.At(i); | 11275 str ^= strings.At(i); |
11276 intptr_t str_len = str.Length(); | 11276 intptr_t str_len = str.Length(); |
11277 String::Copy(result, pos, str, 0, str_len); | 11277 String::Copy(result, pos, str, 0, str_len); |
11278 pos += str_len; | 11278 pos += str_len; |
11279 } | 11279 } |
11280 return OneByteString::raw(result); | 11280 return OneByteString::raw(result); |
11281 } | 11281 } |
11282 | 11282 |
11283 | 11283 |
11284 RawOneByteString* OneByteString::Transform(int32_t (*mapping)(int32_t ch), | 11284 RawOneByteString* OneByteString::Transform(int32_t (*mapping)(int32_t ch), |
11285 const String& str, | 11285 const String& str, |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11434 | 11434 |
11435 | 11435 |
11436 RawTwoByteString* TwoByteString::ConcatAll(const Array& strings, | 11436 RawTwoByteString* TwoByteString::ConcatAll(const Array& strings, |
11437 intptr_t len, | 11437 intptr_t len, |
11438 Heap::Space space) { | 11438 Heap::Space space) { |
11439 const String& result = String::Handle(TwoByteString::New(len, space)); | 11439 const String& result = String::Handle(TwoByteString::New(len, space)); |
11440 String& str = String::Handle(); | 11440 String& str = String::Handle(); |
11441 intptr_t strings_len = strings.Length(); | 11441 intptr_t strings_len = strings.Length(); |
11442 intptr_t pos = 0; | 11442 intptr_t pos = 0; |
11443 for (intptr_t i = 0; i < strings_len; i++) { | 11443 for (intptr_t i = 0; i < strings_len; i++) { |
11444 str |= strings.At(i); | 11444 str ^= strings.At(i); |
11445 intptr_t str_len = str.Length(); | 11445 intptr_t str_len = str.Length(); |
11446 String::Copy(result, pos, str, 0, str_len); | 11446 String::Copy(result, pos, str, 0, str_len); |
11447 pos += str_len; | 11447 pos += str_len; |
11448 } | 11448 } |
11449 return TwoByteString::raw(result); | 11449 return TwoByteString::raw(result); |
11450 } | 11450 } |
11451 | 11451 |
11452 | 11452 |
11453 RawTwoByteString* TwoByteString::Transform(int32_t (*mapping)(int32_t ch), | 11453 RawTwoByteString* TwoByteString::Transform(int32_t (*mapping)(int32_t ch), |
11454 const String& str, | 11454 const String& str, |
(...skipping 1163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12618 | 12618 |
12619 void* JSRegExp::GetDataStartAddress() const { | 12619 void* JSRegExp::GetDataStartAddress() const { |
12620 intptr_t addr = reinterpret_cast<intptr_t>(raw_ptr()); | 12620 intptr_t addr = reinterpret_cast<intptr_t>(raw_ptr()); |
12621 return reinterpret_cast<void*>(addr + sizeof(RawJSRegExp)); | 12621 return reinterpret_cast<void*>(addr + sizeof(RawJSRegExp)); |
12622 } | 12622 } |
12623 | 12623 |
12624 | 12624 |
12625 RawJSRegExp* JSRegExp::FromDataStartAddress(void* data) { | 12625 RawJSRegExp* JSRegExp::FromDataStartAddress(void* data) { |
12626 JSRegExp& regexp = JSRegExp::Handle(); | 12626 JSRegExp& regexp = JSRegExp::Handle(); |
12627 intptr_t addr = reinterpret_cast<intptr_t>(data) - sizeof(RawJSRegExp); | 12627 intptr_t addr = reinterpret_cast<intptr_t>(data) - sizeof(RawJSRegExp); |
12628 regexp |= RawObject::FromAddr(addr); | 12628 regexp ^= RawObject::FromAddr(addr); |
12629 return regexp.raw(); | 12629 return regexp.raw(); |
12630 } | 12630 } |
12631 | 12631 |
12632 | 12632 |
12633 const char* JSRegExp::Flags() const { | 12633 const char* JSRegExp::Flags() const { |
12634 switch (raw_ptr()->flags_) { | 12634 switch (raw_ptr()->flags_) { |
12635 case kGlobal | kIgnoreCase | kMultiLine : | 12635 case kGlobal | kIgnoreCase | kMultiLine : |
12636 case kIgnoreCase | kMultiLine : | 12636 case kIgnoreCase | kMultiLine : |
12637 return "im"; | 12637 return "im"; |
12638 case kGlobal | kIgnoreCase : | 12638 case kGlobal | kIgnoreCase : |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12695 } | 12695 } |
12696 return result.raw(); | 12696 return result.raw(); |
12697 } | 12697 } |
12698 | 12698 |
12699 | 12699 |
12700 const char* WeakProperty::ToCString() const { | 12700 const char* WeakProperty::ToCString() const { |
12701 return "_WeakProperty"; | 12701 return "_WeakProperty"; |
12702 } | 12702 } |
12703 | 12703 |
12704 } // namespace dart | 12704 } // namespace dart |
OLD | NEW |