blob: 202170512db6cb842d8fbc87bcf41b5056babc41 [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
32 Class* ResolveClass(Class* klass, uint32_t idx);
33
34 DexFile* FindInClassPath(const char* descriptor);
35
36 void AppendToClassPath(DexFile* dex_file);
37
38 private:
39 // Inserts a class into the class table. Returns true if the class
40 // was inserted.
41 bool InsertClass(Class* klass);
42
43 bool InitializeSuperClass(Class* klass);
44
45 void InitializeStaticFields(Class* klass);
46
47 bool ValidateSuperClassDescriptors(const Class* klass);
48
49 bool HasSameDescriptorClasses(const char* descriptor,
50 const Class* klass1,
51 const Class* klass2);
52
53 bool HasSameMethodDescriptorClasses(const Method* descriptor,
54 const Class* klass1,
55 const Class* klass2);
56
57 bool LinkClass(Class* klass);
58
59 bool LinkSuperClass(Class* klass);
60
61 bool LinkInterfaces(Class* klass);
62
63 bool LinkMethods(Class* klass);
64
65 bool LinkVirtualMethods(Class* klass);
66
67 bool LinkInterfaceMethods(Class* klass);
68
69 void LinkAbstractMethods(Class* klass);
70
71 bool LinkInstanceFields(Class* klass);
72
73 void CreateReferenceOffsets(Class* klass);
74
75 std::vector<DexFile*> class_path_;
76
77 // TODO: multimap
78 typedef std::map<const char*, Class*, CStringLt> Table;
79
80 Table classes_;
81
82 Mutex* classes_lock_;
83
84 // TODO: classpath
85
86 DISALLOW_COPY_AND_ASSIGN(ClassLinker);
87};
88
89} // namespace art
90
91#endif // ART_SRC_CLASS_LINKER_H_