/*  see copyright notice in squirrel.h */
#ifndef _SQOPCODES_H_
#define _SQOPCODES_H_

#define MAX_FUNC_STACKSIZE 0xFF
#define MAX_LITERALS ((SQInteger)0x7FFFFFFF)

enum BitWiseOP {
    BW_AND = 0,
    BW_OR = 2,
    BW_XOR = 3,
    BW_SHIFTL = 4,
    BW_SHIFTR = 5,
    BW_USHIFTR = 6
};

enum CmpOP {
    CMP_G = 0,
    CMP_GE = 2,
    CMP_L = 3,
    CMP_LE = 4,
    CMP_3W = 5
};

enum NewObjectType {
    NOT_TABLE = 0,
    NOT_ARRAY = 1,
    NOT_CLASS = 2
};

enum AppendArrayType {
    AAT_STACK = 0,
    AAT_LITERAL = 1,
    AAT_INT = 2,
    AAT_FLOAT = 3,
    AAT_BOOL = 4
};

enum SQOpcode
{
    _OP_LINE=               0x00,
    _OP_LOAD=               0x01,
    _OP_LOADINT=            0x02,
    _OP_LOADFLOAT=          0x03,
    _OP_DLOAD=              0x04,
    _OP_TAILCALL=           0x05,
    _OP_CALL=               0x06,
    _OP_PREPCALL=           0x07,
    _OP_PREPCALLK=          0x08,
    _OP_GETK=               0x09,
    _OP_MOVE=               0x0A,
    _OP_NEWSLOT=            0x0B,
    _OP_DELETE=             0x0C,
    _OP_SET=                0x0D,
    _OP_GET=                0x0E,
    _OP_EQ=                 0x0F,
    _OP_NE=                 0x10,
    _OP_ADD=                0x11,
    _OP_SUB=                0x12,
    _OP_MUL=                0x13,
    _OP_DIV=                0x14,
    _OP_MOD=                0x15,
    _OP_BITW=               0x16,
    _OP_RETURN=             0x17,
    _OP_LOADNULLS=          0x18,
    _OP_LOADROOT=           0x19,
    _OP_LOADBOOL=           0x1A,
    _OP_DMOVE=              0x1B,
    _OP_JMP=                0x1C,
    //_OP_JNZ=              0x1D,
    _OP_JCMP=               0x1D,
    _OP_JZ=                 0x1E,
    _OP_SETOUTER=           0x1F,
    _OP_GETOUTER=           0x20,
    _OP_NEWOBJ=             0x21,
    _OP_APPENDARRAY=        0x22,
    _OP_COMPARITH=          0x23,
    _OP_INC=                0x24,
    _OP_INCL=               0x25,
    _OP_PINC=               0x26,
    _OP_PINCL=              0x27,
    _OP_CMP=                0x28,
    _OP_EXISTS=             0x29,
    _OP_INSTANCEOF=         0x2A,
    _OP_AND=                0x2B,
    _OP_OR=                 0x2C,
    _OP_NEG=                0x2D,
    _OP_NOT=                0x2E,
    _OP_BWNOT=              0x2F,
    _OP_CLOSURE=            0x30,
    _OP_YIELD=              0x31,
    _OP_RESUME=             0x32,
    _OP_FOREACH=            0x33,
    _OP_POSTFOREACH=        0x34,
    _OP_CLONE=              0x35,
    _OP_TYPEOF=             0x36,
    _OP_PUSHTRAP=           0x37,
    _OP_POPTRAP=            0x38,
    _OP_THROW=              0x39,
    _OP_NEWSLOTA=           0x3A,
    _OP_GETBASE=            0x3B,
    _OP_CLOSE=              0x3C
};

struct SQInstructionDesc {
    const SQChar *name;
};

struct SQInstruction
{
    SQInstruction(){};
    SQInstruction(SQOpcode _op,SQInteger a0=0,SQInteger a1=0,SQInteger a2=0,SQInteger a3=0)
    {   op = (unsigned char)_op;
        _arg0 = (unsigned char)a0;_arg1 = (SQInt32)a1;
        _arg2 = (unsigned char)a2;_arg3 = (unsigned char)a3;
    }


    SQInt32 _arg1;
    unsigned char op;
    unsigned char _arg0;
    unsigned char _arg2;
    unsigned char _arg3;
};

#include "squtils.h"
typedef sqvector<SQInstruction> SQInstructionVec;

#define NEW_SLOT_ATTRIBUTES_FLAG    0x01
#define NEW_SLOT_STATIC_FLAG        0x02

#endif // _SQOPCODES_H_