blob: fec3cb15188e5387bbacee067c0c841398fba122 [file] [log] [blame]
Carl Shapiro0e5d75d2011-07-06 18:28:37 -07001// Copyright 2011 Google Inc. All Rights Reserved.
2
3#ifndef ART_SRC_CLASS_LINKER_H_
4#define ART_SRC_CLASS_LINKER_H_
5
6#include <map>
7#include <utility>
8#include <vector>
9
10#include "src/macros.h"
11#include "src/thread.h"
12#include "src/object.h"
13
14namespace art {
15
16class ClassLinker {
17 public:
18 ClassLinker() {}
19 ~ClassLinker() {}
20
21 // Finds a class by its descriptor name.
22 Class* FindClass(const char* descriptor,
23 Object* class_loader,
24 DexFile* dex_file);
25
26 Class* FindPrimitiveClass(const char* descriptor);
27
28 bool InitializeClass(Class* klass);
29
30 Class* LookupClass(const char* descriptor, Object* class_loader);
31
Carl Shapiro5fafe2b2011-07-09 15:34:41 -070032 Class* ResolveClass(const Class* referring, uint32_t class_idx);
33
34 String* ResolveString(const Class* referring, uint32_t string_idx);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -070035
36 DexFile* FindInClassPath(const char* descriptor);
37
38 void AppendToClassPath(DexFile* dex_file);
39
40 private:
41 // Inserts a class into the class table. Returns true if the class
42 // was inserted.
43 bool InsertClass(Class* klass);
44
45 bool InitializeSuperClass(Class* klass);
46
47 void InitializeStaticFields(Class* klass);
48
49 bool ValidateSuperClassDescriptors(const Class* klass);
50
51 bool HasSameDescriptorClasses(const char* descriptor,
52 const Class* klass1,
53 const Class* klass2);
54
55 bool HasSameMethodDescriptorClasses(const Method* descriptor,
56 const Class* klass1,
57 const Class* klass2);
58
59 bool LinkClass(Class* klass);
60
61 bool LinkSuperClass(Class* klass);
62
63 bool LinkInterfaces(Class* klass);
64
65 bool LinkMethods(Class* klass);
66
67 bool LinkVirtualMethods(Class* klass);
68
69 bool LinkInterfaceMethods(Class* klass);
70
71 void LinkAbstractMethods(Class* klass);
72
73 bool LinkInstanceFields(Class* klass);
74
75 void CreateReferenceOffsets(Class* klass);
76
77 std::vector<DexFile*> class_path_;
78
79 // TODO: multimap
80 typedef std::map<const char*, Class*, CStringLt> Table;
81
82 Table classes_;
83
84 Mutex* classes_lock_;
85
86 // TODO: classpath
87
88 DISALLOW_COPY_AND_ASSIGN(ClassLinker);
89};
90
91} // namespace art
92
93#endif // ART_SRC_CLASS_LINKER_H_