ftp.nice.ch/pub/next/developer/languages/java/guavac.0.2.5.s.tar.gz#/guavac-0.2.5/compiler/CodeSequence.h

This is CodeSequence.h in view mode; [Download] [Up]

// Copyright (c) 1996  David Engberg  All rights reserved
// $Id: CodeSequence.h,v 1.4 1996/07/12 20:43:40 geppetto Exp $
#ifndef _CodeSequence_h
#define _CodeSequence_h
#pragma interface

#include "JavaCodeAttribute.h"
#include <deque>
#include <vector>
class ostream;

//
//  Class name : CCodeSequence
//  Description : This class encapsulates a sequence of Java instructions under
//    construction.
//
class CCodeSequence {
public:
  CCodeSequence();
  CCodeSequence(const CCodeSequence& source);
  ~CCodeSequence();
  CCodeSequence& operator=(const CCodeSequence& source);

  //
  //  Struct name : CInstruction
  //  Description : This structure represents one instruction in the Java byte
  //    code sequence, along with any arguments it has.  It is meant to be
  //    small (8 bytes) and dumb to make it fast to copy and modify.
  //    As such, it doesn't present a very OO interface.  This is an
  //    intentional optimization, the alternative would rely on huge,
  //    heap-allocated polymorphism, which would be serious overkill for
  //    the job.
  //
  struct Instruction {
    CJavaCodeAttribute::Opcode fOpcode;
    union {
      unsigned long u4;
      unsigned long l4;
      signed short s2;
      signed char s1;
      struct {
	unsigned short index : 16;
	unsigned char u1 : 8;
      } fIndexPair;
    } fArguments;
  };

  typedef vector<Instruction> InstructionList;
  typedef vector<unsigned long> OffsetList;

  unsigned long size() const { return fInstructions.size(); }
  Instruction& operator[](unsigned long index) { return fInstructions[index]; }
  const Instruction& operator[](unsigned long index) const 
     { return fInstructions[index]; }
  InstructionList::const_iterator GetInstructionsBegin() const;
  InstructionList::const_iterator GetInstructionsEnd() const;
  void Insert(unsigned long index, const Instruction& value);
  void Append(const Instruction& value, unsigned long lineNumber = 0);
  void Append(CJavaCodeAttribute::Opcode opcode, unsigned long lineNumber = 0);
  void Append(CJavaCodeAttribute::Opcode opcode, unsigned long u4,
	      unsigned long lineNumber);
  void Remove(unsigned long index);
  void Remove(unsigned long index, unsigned long count);
  unsigned long CreateBlockLabel();
  // unsigned long PeekNextBlockLabel() const;
  unsigned long LabelToInstruction(unsigned long blockLabelIndex) const;
  bool InstructionToLabel(unsigned long blockLabelIndex,
			  unsigned long& label) const;

  void PeepholeOptimize();
  void EliminateDeadCode(CJavaCodeAttribute& inCodeAttribute);
  void Finalize(CJavaCodeAttribute& intoCodeAttribute);

  void PrintShortDebug(ostream& toStream) const;

protected:
  unsigned long FinalizeInstruction(unsigned long instructionIndex,
				    const OffsetList& offsetLabels);
  unsigned long InstructionSize(unsigned long instructionIndex,
				unsigned long startingAtPosition) const;
  void EmitCode(unsigned long instruction, unsigned long instructionLocation,
		const OffsetList& offsetLabels,
		CJavaCodeAttribute& into) const;
  void AppendIndex(unsigned long instruction, CJavaCodeAttribute& onto) const;

  unsigned long MatchRange(const CJavaCodeAttribute::Opcode pattern[],
			   unsigned long patternLength,
			   unsigned long startingAt,
			   bool crossBasicBlocks = false);
  bool ReplaceIncrement(unsigned long startingAt);
  bool ReplaceZeroCompare(unsigned long startingAt);
  bool ReplaceBooleanBranch(unsigned long startingAt);
  bool ReplaceBranchToBranch(unsigned long startingAt);
  void CreateBlockIfConditional(CJavaCodeAttribute::Opcode instruction);

  void MarkReachableFrom(unsigned long index, bool reachable[]);

private:
  void PrintInstruction(const Instruction& instruction,
			ostream& toStream) const;

  InstructionList fInstructions;
  OffsetList fBasicBlockOffsets;
  unsigned long fLastBasicBlock;
  vector<unsigned long> fLineNumbers;
  OffsetList fLineBeginnings;
  unsigned long fLastLine;
};

#endif

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.