/* ILEngineer - Crummy .NET Decompiler * Copyright (C) 2001-2002 Jay Freeman (saurik) */ /* * Redistribution and use in source and binary * forms, with or without modification, are permitted * provided that the following conditions are met: * * 1. Redistributions of source code must retain the * above copyright notice, this list of conditions * and the following disclaimer. * 2. Redistributions in binary form must reproduce the * above copyright notice, this list of conditions * and the following disclaimer in the documentation * and/or other materials provided with the * distribution. * 3. The name of the author may not be used to endorse * or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #pragma once #include "Operation.h" #include "ilengineer/ilengineer.h" namespace ILEngineer { // Stand in the place where you live, now face north. // Think about direction, wonder why you haven't now... class ILENGINEER_API Statement : public Operation { public: struct Reference { StatementVector *stV; StatementVector::iterator stI; Reference() : stV(NULL) {} Reference(StatementVector *stV, StatementVector::iterator stI) : stV(stV), stI(stI) {} }; typedef std::vector ReferenceVector; protected: // XXX: Synchronize static label; int m_Goto; bool m_Block; bool m_Target; public: Statement(Blocks::Method *method, uint8_t *offset = NULL) : Operation(method, offset), m_Goto(-1), m_Block(true), m_Target(false) {} Statement(Blocks::Method *method, uint8_t *offset, Operation *operation) : Operation(method, offset), m_Goto(-1), m_Block(false), m_Target(false) { m_Operations.push_back(operation); } bool isBlock() const { return m_Block; } bool isTarget() { return m_Target; } void setTarget() { m_Target = true; } void unTarget() { m_Target = false; } int getGoto() { return m_Goto; } int setGoto() { return (m_Goto == -1) ? (m_Goto = label++) : m_Goto; } const Metallurgy::Element * getType() { return NULL; } const Operation * operator *() const { return isBlock() ? NULL : m_Operations[0]; } Operation * operator *() { return isBlock() ? NULL : m_Operations[0]; } }; }