1f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project/* Copyright (C) 2003 Vladimir Roubtsov. All rights reserved. 2f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * 3f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * This program and the accompanying materials are made available under 4f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * the terms of the Common Public License v1.0 which accompanies this distribution, 5f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * and is available at http://www.eclipse.org/legal/cpl-v10.html 6f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * 7f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * $Id: IClassLoadHook.java,v 1.1.1.1 2004/05/09 16:57:44 vlad_r Exp $ 8f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */ 9f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectpackage com.vladium.emma.rt; 10f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 11f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.io.IOException; 12f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 13f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.util.ByteArrayOStream; 14f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 15f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// ---------------------------------------------------------------------------- 16f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project/** 17f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * @author Vlad Roubtsov, 2003 18f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */ 19f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectpublic 20f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectinterface IClassLoadHook 21f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project{ 22f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // public: ................................................................ 23f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 24f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// /** 25f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// * The hook returns 'true' or 'false' based on 'className' only. If it 26f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// * returns false, the current loader will load the class bytes itself and 27f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// * pass them to ClassLoader.defineClass() unchanged. This is an optimization 28f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// * to let the JVM native code do the parsing of class definitions for classes 29f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// * that do not match coverage filters instead of doing this in bytecode. 30f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// */ 31f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// boolean interested (String className); 32f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 33f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // TODO: figure out a way to avoid all this excessive copying of byte arrays 34f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 35f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project /* TODO: finish 36f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * 37f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * The hook reads in the original class definition from 'in' and [possibly] 38f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * instruments it, returning the modified class definion [which should 39f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * correspond to the original class name]. Only class definitions with names 40f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * that were successfully filtered via a previous (although not necessarily 41f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * <em>immediately</em> so) call to {@link #interested} will be passed to 42f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * this method.<P> 43f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * 44f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * It is possible that the hook will determine that it is not interested in 45f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * intrumenting the pending class definition [or is unable to do so] only 46f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * after reading some content from 'in'. An example would be when the class 47f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * definition turns out to be for an interface and the hook does not process 48f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * interfaces. Because 'in' can then be left in an uncertain state, the hook 49f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * must follow these rules for the two possible outcomes: 50f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * <ol> 51f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * <li> if the hook can successfully recover the unmodified class definion 52f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * [perhaps because it cloned the original definition or never modified it]: 53f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * it should write it into 'out' and return 'true'; 54f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * <li> if the hook has lost the original class definion: it should return 'false'. 55f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * Following that, the current loader will close() and discard 'in' and load 56f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * the class from another, equivalent in content, data stream instance. 57f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * </ol> 58f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * 59f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * In any case 'in' and 'out' remain owned [and will be close()d] by the caller. 60f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * 61f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * NOTE: the hook should only write to 'out' after reading the entire 62f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * class definition in 'bytes' ('out' could be backed by the same array as 63f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * 'bytes') 64f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * 65f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * @param out [buffered by the caller] 66f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */ 67f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project boolean processClassDef (String className, 68f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project byte [] bytes, int length, 69f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project ByteArrayOStream out) 70f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project throws IOException; 71f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 72f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project} // end of interface 73f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// ----------------------------------------------------------------------------