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