@@ -1697,6 +1697,84 @@ static ObjectPtr LookupObjectId(Thread* thread,
1697
1697
return ring->GetObjectForId (id, kind);
1698
1698
}
1699
1699
1700
+ static ObjectPtr LookupClassMembers (Thread* thread,
1701
+ const Class& klass,
1702
+ char ** parts,
1703
+ int num_parts) {
1704
+ auto isolate = thread->isolate ();
1705
+ auto zone = thread->zone ();
1706
+
1707
+ if (num_parts != 4 ) {
1708
+ return Object::sentinel ().raw ();
1709
+ }
1710
+
1711
+ const char * encoded_id = parts[3 ];
1712
+ auto & id = String::Handle (String::New (encoded_id));
1713
+ id = String::DecodeIRI (id);
1714
+ if (id.IsNull ()) {
1715
+ return Object::sentinel ().raw ();
1716
+ }
1717
+
1718
+ if (strcmp (parts[2 ], " fields" ) == 0 ) {
1719
+ // Field ids look like: "classes/17/fields/name"
1720
+ const auto & field = Field::Handle (klass.LookupField (id));
1721
+ if (field.IsNull ()) {
1722
+ return Object::sentinel ().raw ();
1723
+ }
1724
+ return field.raw ();
1725
+ }
1726
+ if (strcmp (parts[2 ], " functions" ) == 0 ) {
1727
+ // Function ids look like: "classes/17/functions/name"
1728
+ const auto & function = Function::Handle (klass.LookupFunction (id));
1729
+ if (function.IsNull ()) {
1730
+ return Object::sentinel ().raw ();
1731
+ }
1732
+ return function.raw ();
1733
+ }
1734
+ if (strcmp (parts[2 ], " implicit_closures" ) == 0 ) {
1735
+ // Function ids look like: "classes/17/implicit_closures/11"
1736
+ intptr_t id;
1737
+ if (!GetIntegerId (parts[3 ], &id)) {
1738
+ return Object::sentinel ().raw ();
1739
+ }
1740
+ const auto & func =
1741
+ Function::Handle (zone, klass.ImplicitClosureFunctionFromIndex (id));
1742
+ if (func.IsNull ()) {
1743
+ return Object::sentinel ().raw ();
1744
+ }
1745
+ return func.raw ();
1746
+ }
1747
+ if (strcmp (parts[2 ], " dispatchers" ) == 0 ) {
1748
+ // Dispatcher Function ids look like: "classes/17/dispatchers/11"
1749
+ intptr_t id;
1750
+ if (!GetIntegerId (parts[3 ], &id)) {
1751
+ return Object::sentinel ().raw ();
1752
+ }
1753
+ const auto & func =
1754
+ Function::Handle (zone, klass.InvocationDispatcherFunctionFromIndex (id));
1755
+ if (func.IsNull ()) {
1756
+ return Object::sentinel ().raw ();
1757
+ }
1758
+ return func.raw ();
1759
+ }
1760
+ if (strcmp (parts[2 ], " closures" ) == 0 ) {
1761
+ // Closure ids look like: "classes/17/closures/11"
1762
+ intptr_t id;
1763
+ if (!GetIntegerId (parts[3 ], &id)) {
1764
+ return Object::sentinel ().raw ();
1765
+ }
1766
+ Function& func = Function::Handle (zone);
1767
+ func = isolate->ClosureFunctionFromIndex (id);
1768
+ if (func.IsNull ()) {
1769
+ return Object::sentinel ().raw ();
1770
+ }
1771
+ return func.raw ();
1772
+ }
1773
+
1774
+ UNREACHABLE ();
1775
+ return Object::sentinel ().raw ();
1776
+ }
1777
+
1700
1778
static ObjectPtr LookupHeapObjectLibraries (Isolate* isolate,
1701
1779
char ** parts,
1702
1780
int num_parts) {
@@ -1724,9 +1802,30 @@ static ObjectPtr LookupHeapObjectLibraries(Isolate* isolate,
1724
1802
if (!lib_found) {
1725
1803
return Object::sentinel ().raw ();
1726
1804
}
1805
+
1806
+ const auto & klass = Class::Handle (lib.toplevel_class ());
1807
+ ASSERT (!klass.IsNull ());
1808
+
1727
1809
if (num_parts == 2 ) {
1728
1810
return lib.raw ();
1729
1811
}
1812
+ if (strcmp (parts[2 ], " fields" ) == 0 ) {
1813
+ // Library field ids look like: "libraries/17/fields/name"
1814
+ return LookupClassMembers (Thread::Current (), klass, parts, num_parts);
1815
+ }
1816
+ if (strcmp (parts[2 ], " functions" ) == 0 ) {
1817
+ // Library function ids look like: "libraries/17/functions/name"
1818
+ return LookupClassMembers (Thread::Current (), klass, parts, num_parts);
1819
+ }
1820
+ if (strcmp (parts[2 ], " closures" ) == 0 ) {
1821
+ // Library function ids look like: "libraries/17/closures/name"
1822
+ return LookupClassMembers (Thread::Current (), klass, parts, num_parts);
1823
+ }
1824
+ if (strcmp (parts[2 ], " implicit_closures" ) == 0 ) {
1825
+ // Library function ids look like: "libraries/17/implicit_closures/name"
1826
+ return LookupClassMembers (Thread::Current (), klass, parts, num_parts);
1827
+ }
1828
+
1730
1829
if (strcmp (parts[2 ], " scripts" ) == 0 ) {
1731
1830
// Script ids look like "libraries/35/scripts/library%2Furl.dart/12345"
1732
1831
if (num_parts != 5 ) {
@@ -1783,86 +1882,19 @@ static ObjectPtr LookupHeapObjectClasses(Thread* thread,
1783
1882
}
1784
1883
if (strcmp (parts[2 ], " closures" ) == 0 ) {
1785
1884
// Closure ids look like: "classes/17/closures/11"
1786
- if (num_parts != 4 ) {
1787
- return Object::sentinel ().raw ();
1788
- }
1789
- intptr_t id;
1790
- if (!GetIntegerId (parts[3 ], &id)) {
1791
- return Object::sentinel ().raw ();
1792
- }
1793
- Function& func = Function::Handle (zone);
1794
- func = isolate->ClosureFunctionFromIndex (id);
1795
- if (func.IsNull ()) {
1796
- return Object::sentinel ().raw ();
1797
- }
1798
- return func.raw ();
1799
-
1885
+ return LookupClassMembers (thread, cls, parts, num_parts);
1800
1886
} else if (strcmp (parts[2 ], " fields" ) == 0 ) {
1801
1887
// Field ids look like: "classes/17/fields/name"
1802
- if (num_parts != 4 ) {
1803
- return Object::sentinel ().raw ();
1804
- }
1805
- const char * encoded_id = parts[3 ];
1806
- String& id = String::Handle (zone, String::New (encoded_id));
1807
- id = String::DecodeIRI (id);
1808
- if (id.IsNull ()) {
1809
- return Object::sentinel ().raw ();
1810
- }
1811
- Field& field = Field::Handle (zone, cls.LookupField (id));
1812
- if (field.IsNull ()) {
1813
- return Object::sentinel ().raw ();
1814
- }
1815
- return field.raw ();
1816
-
1888
+ return LookupClassMembers (thread, cls, parts, num_parts);
1817
1889
} else if (strcmp (parts[2 ], " functions" ) == 0 ) {
1818
1890
// Function ids look like: "classes/17/functions/name"
1819
- if (num_parts != 4 ) {
1820
- return Object::sentinel ().raw ();
1821
- }
1822
- const char * encoded_id = parts[3 ];
1823
- String& id = String::Handle (zone, String::New (encoded_id));
1824
- id = String::DecodeIRI (id);
1825
- if (id.IsNull ()) {
1826
- return Object::sentinel ().raw ();
1827
- }
1828
- Function& func = Function::Handle (zone, cls.LookupFunction (id));
1829
- if (func.IsNull ()) {
1830
- return Object::sentinel ().raw ();
1831
- }
1832
- return func.raw ();
1833
-
1891
+ return LookupClassMembers (thread, cls, parts, num_parts);
1834
1892
} else if (strcmp (parts[2 ], " implicit_closures" ) == 0 ) {
1835
1893
// Function ids look like: "classes/17/implicit_closures/11"
1836
- if (num_parts != 4 ) {
1837
- return Object::sentinel ().raw ();
1838
- }
1839
- intptr_t id;
1840
- if (!GetIntegerId (parts[3 ], &id)) {
1841
- return Object::sentinel ().raw ();
1842
- }
1843
- Function& func = Function::Handle (zone);
1844
- func = cls.ImplicitClosureFunctionFromIndex (id);
1845
- if (func.IsNull ()) {
1846
- return Object::sentinel ().raw ();
1847
- }
1848
- return func.raw ();
1849
-
1894
+ return LookupClassMembers (thread, cls, parts, num_parts);
1850
1895
} else if (strcmp (parts[2 ], " dispatchers" ) == 0 ) {
1851
1896
// Dispatcher Function ids look like: "classes/17/dispatchers/11"
1852
- if (num_parts != 4 ) {
1853
- return Object::sentinel ().raw ();
1854
- }
1855
- intptr_t id;
1856
- if (!GetIntegerId (parts[3 ], &id)) {
1857
- return Object::sentinel ().raw ();
1858
- }
1859
- Function& func = Function::Handle (zone);
1860
- func = cls.InvocationDispatcherFunctionFromIndex (id);
1861
- if (func.IsNull ()) {
1862
- return Object::sentinel ().raw ();
1863
- }
1864
- return func.raw ();
1865
-
1897
+ return LookupClassMembers (thread, cls, parts, num_parts);
1866
1898
} else if (strcmp (parts[2 ], " types" ) == 0 ) {
1867
1899
// Type ids look like: "classes/17/types/11"
1868
1900
if (num_parts != 4 ) {
@@ -2707,7 +2739,8 @@ static bool BuildExpressionEvaluationScope(Thread* thread, JSONStream* js) {
2707
2739
cls = instance.clazz ();
2708
2740
isStatic = false ;
2709
2741
}
2710
- if (cls.id () < kInstanceCid || cls.id () == kTypeArgumentsCid ) {
2742
+ if (!cls.IsTopLevel () &&
2743
+ (cls.id () < kInstanceCid || cls.id () == kTypeArgumentsCid )) {
2711
2744
js->PrintError (
2712
2745
kInvalidParams ,
2713
2746
" Expressions can be evaluated only with regular Dart instances" );
0 commit comments