blob: 89fd8f7e26ef17c9d0f016a20f94cc66f68b9b3c [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
Carl Shapiro565f5072011-07-10 13:39:43 -070021 // Initializes the class linker.
22 void Init();
23
Carl Shapiro0e5d75d2011-07-06 18:28:37 -070024 // Finds a class by its descriptor name.
25 Class* FindClass(const char* descriptor,
26 Object* class_loader,
27 DexFile* dex_file);
28
Carl Shapiro565f5072011-07-10 13:39:43 -070029 Class* FindSystemClass(const char* descriptor) {
30 return FindClass(descriptor, NULL, NULL);
31 }
32
33 Class* FindPrimitiveClass(JType type);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -070034
35 bool InitializeClass(Class* klass);
36
37 Class* LookupClass(const char* descriptor, Object* class_loader);
38
Carl Shapiro5fafe2b2011-07-09 15:34:41 -070039 Class* ResolveClass(const Class* referring, uint32_t class_idx);
40
41 String* ResolveString(const Class* referring, uint32_t string_idx);
Carl Shapiro0e5d75d2011-07-06 18:28:37 -070042
43 DexFile* FindInClassPath(const char* descriptor);
44
45 void AppendToClassPath(DexFile* dex_file);
46
47 private:
Carl Shapiro565f5072011-07-10 13:39:43 -070048 Class* CreatePrimitiveClass(JType type, const char* descriptor);
49
Carl Shapiro0e5d75d2011-07-06 18:28:37 -070050 // Inserts a class into the class table. Returns true if the class
51 // was inserted.
52 bool InsertClass(Class* klass);
53
54 bool InitializeSuperClass(Class* klass);
55
56 void InitializeStaticFields(Class* klass);
57
58 bool ValidateSuperClassDescriptors(const Class* klass);
59
60 bool HasSameDescriptorClasses(const char* descriptor,
61 const Class* klass1,
62 const Class* klass2);
63
64 bool HasSameMethodDescriptorClasses(const Method* descriptor,
65 const Class* klass1,
66 const Class* klass2);
67
68 bool LinkClass(Class* klass);
69
70 bool LinkSuperClass(Class* klass);
71
72 bool LinkInterfaces(Class* klass);
73
74 bool LinkMethods(Class* klass);
75
76 bool LinkVirtualMethods(Class* klass);
77
78 bool LinkInterfaceMethods(Class* klass);
79
80 void LinkAbstractMethods(Class* klass);
81
82 bool LinkInstanceFields(Class* klass);
83
84 void CreateReferenceOffsets(Class* klass);
85
86 std::vector<DexFile*> class_path_;
87
88 // TODO: multimap
89 typedef std::map<const char*, Class*, CStringLt> Table;
90
91 Table classes_;
92
93 Mutex* classes_lock_;
94
95 // TODO: classpath
96
Carl Shapiro565f5072011-07-10 13:39:43 -070097 Class* primitive_boolean_;
98 Class* primitive_char_;
99 Class* primitive_float_;
100 Class* primitive_double_;
101 Class* primitive_byte_;
102 Class* primitive_short_;
103 Class* primitive_int_;
104 Class* primitive_long_;
105 Class* primitive_void_;
106
107 Class* java_lang_Class_;
108
Carl Shapiro0e5d75d2011-07-06 18:28:37 -0700109 DISALLOW_COPY_AND_ASSIGN(ClassLinker);
110};
111
112} // namespace art
113
114#endif // ART_SRC_CLASS_LINKER_H_