Home | History | Annotate | Download | only in openjdkjvmti
      1 /* Copyright (C) 2017 The Android Open Source Project
      2  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
      3  *
      4  * This file implements interfaces from the file jvmti.h. This implementation
      5  * is licensed under the same terms as the file jvmti.h.  The
      6  * copyright and license information for the file jvmti.h follows.
      7  *
      8  * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
      9  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     10  *
     11  * This code is free software; you can redistribute it and/or modify it
     12  * under the terms of the GNU General Public License version 2 only, as
     13  * published by the Free Software Foundation.  Oracle designates this
     14  * particular file as subject to the "Classpath" exception as provided
     15  * by Oracle in the LICENSE file that accompanied this code.
     16  *
     17  * This code is distributed in the hope that it will be useful, but WITHOUT
     18  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
     19  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
     20  * version 2 for more details (a copy is included in the LICENSE file that
     21  * accompanied this code).
     22  *
     23  * You should have received a copy of the GNU General Public License version
     24  * 2 along with this work; if not, write to the Free Software Foundation,
     25  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
     26  *
     27  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
     28  * or visit www.oracle.com if you need additional information or have any
     29  * questions.
     30  */
     31 
     32 #ifndef ART_OPENJDKJVMTI_FIXED_UP_DEX_FILE_H_
     33 #define ART_OPENJDKJVMTI_FIXED_UP_DEX_FILE_H_
     34 
     35 #include <memory>
     36 #include <vector>
     37 
     38 #include "jni.h"
     39 #include "jvmti.h"
     40 
     41 #include "base/mutex.h"
     42 #include "dex/dex_file.h"
     43 
     44 namespace openjdkjvmti {
     45 
     46 // A holder for a DexFile that has been 'fixed up' to ensure it is fully compliant with the
     47 // published standard (no internal/quick opcodes, all fields are the defined values, etc). This is
     48 // used to ensure that agents get a consistent dex file regardless of what version of android they
     49 // are running on.
     50 class FixedUpDexFile {
     51  public:
     52   static std::unique_ptr<FixedUpDexFile> Create(const art::DexFile& original,
     53                                                 const char* descriptor);
     54 
     55   const art::DexFile& GetDexFile() {
     56     return *dex_file_;
     57   }
     58 
     59   const unsigned char* Begin() {
     60     return data_.data();
     61   }
     62 
     63   size_t Size() {
     64     return data_.size();
     65   }
     66 
     67  private:
     68   explicit FixedUpDexFile(std::unique_ptr<const art::DexFile> fixed_up_dex_file,
     69                           std::vector<unsigned char> data)
     70       : dex_file_(std::move(fixed_up_dex_file)),
     71         data_(std::move(data)) {}
     72 
     73   // the fixed up DexFile
     74   std::unique_ptr<const art::DexFile> dex_file_;
     75   // The backing data for dex_file_.
     76   const std::vector<unsigned char> data_;
     77 
     78   DISALLOW_COPY_AND_ASSIGN(FixedUpDexFile);
     79 };
     80 
     81 }  // namespace openjdkjvmti
     82 
     83 #endif  // ART_OPENJDKJVMTI_FIXED_UP_DEX_FILE_H_
     84