class_linker.h revision 0e5d75d5ca2b8a44fab0c862276a466cbab39859
10e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro// Copyright 2011 Google Inc. All Rights Reserved.
20e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
30e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro#ifndef ART_SRC_CLASS_LINKER_H_
40e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro#define ART_SRC_CLASS_LINKER_H_
50e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
60e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro#include <map>
70e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro#include <utility>
80e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro#include <vector>
90e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
100e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro#include "src/macros.h"
110e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro#include "src/thread.h"
120e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro#include "src/object.h"
130e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
140e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapironamespace art {
150e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
160e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiroclass ClassLinker {
170e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro public:
180e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro  ClassLinker() {}
190e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro  ~ClassLinker() {}
200e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
210e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro  // Finds a class by its descriptor name.
220e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro  Class* FindClass(const char* descriptor,
230e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro                   Object* class_loader,
240e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro                   DexFile* dex_file);
250e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
260e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro  Class* FindPrimitiveClass(const char* descriptor);
270e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
280e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro  bool InitializeClass(Class* klass);
290e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
300e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro  Class* LookupClass(const char* descriptor, Object* class_loader);
310e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
320e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro  Class* ResolveClass(Class* klass, uint32_t idx);
330e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
340e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro  DexFile* FindInClassPath(const char* descriptor);
350e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
360e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro  void AppendToClassPath(DexFile* dex_file);
370e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
380e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro private:
390e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro  // Inserts a class into the class table.  Returns true if the class
400e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro  // was inserted.
410e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro  bool InsertClass(Class* klass);
420e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
430e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro  bool InitializeSuperClass(Class* klass);
440e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
450e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro  void InitializeStaticFields(Class* klass);
460e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
470e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro  bool ValidateSuperClassDescriptors(const Class* klass);
480e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
490e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro  bool HasSameDescriptorClasses(const char* descriptor,
500e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro                                const Class* klass1,
510e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro                                const Class* klass2);
520e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
530e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro  bool HasSameMethodDescriptorClasses(const Method* descriptor,
540e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro                                      const Class* klass1,
550e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro                                      const Class* klass2);
560e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
570e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro  bool LinkClass(Class* klass);
580e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
590e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro  bool LinkSuperClass(Class* klass);
600e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
610e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro  bool LinkInterfaces(Class* klass);
620e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
630e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro  bool LinkMethods(Class* klass);
640e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
650e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro  bool LinkVirtualMethods(Class* klass);
660e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
670e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro  bool LinkInterfaceMethods(Class* klass);
680e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
690e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro  void LinkAbstractMethods(Class* klass);
700e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
710e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro  bool LinkInstanceFields(Class* klass);
720e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
730e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro  void CreateReferenceOffsets(Class* klass);
740e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
750e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro  std::vector<DexFile*> class_path_;
760e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
770e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro  // TODO: multimap
780e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro  typedef std::map<const char*, Class*, CStringLt> Table;
790e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
800e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro  Table classes_;
810e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
820e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro  Mutex* classes_lock_;
830e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
840e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro  // TODO: classpath
850e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
860e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro  DISALLOW_COPY_AND_ASSIGN(ClassLinker);
870e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro};
880e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
890e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro}  // namespace art
900e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
910e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro#endif  // ART_SRC_CLASS_LINKER_H_
92