#!/usr/bin/perl -w # $Id: javaml-instrument,v 1.1 2000/02/19 22:33:40 gjb Exp $ # Copyright (C) 2000 Greg J. Badros, # http://www.cs.washington.edu/homes/gjb/JavaML # # Example of instrumentating Java source code using JavaML representation # and the DOM use XML::DOM; use IO::Handle; my $filename = shift @ARGV; my $parser = new XML::DOM::Parser; my $doc = $parser->parsefile ($filename); my $nodes = $doc->getElementsByTagName("method"); for (my $i = 0; $i < $nodes->getLength(); $i++) { my $method = $nodes->item($i); my $block = $method-> getElementsByTagName("block")->item(0); my $name = $method->getAttribute("name"); my $start_code = SendMessageBlock($doc,"Tracer","StartMethod", $name); my $exit_code = SendMessageBlock($doc,"Tracer","ExitMethod", $name); $block->insertBefore($start_code, $block->getFirstChild()); $block->appendChild($exit_code); } print $doc->toString; sub SendMessageBlock { my ($doc,$target_var,$method_name,$data) = (@_); # insert, e.g: Tracer.StartMethod("paint"); return parseXMLFragment($doc,<<"__END_FRAGMENT__" __END_FRAGMENT__ ); } sub parseXMLFragment { my ($doc,$code) = (@_); my $newdoc = $parser->parse($code); my $subtree = $newdoc->getDocumentElement(); $newdoc->removeChild($subtree); $subtree->setOwnerDocument($doc); return $subtree; }