aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/libraries/libLSL/lslByteCode.cs
blob: ea9e0b02b963adb753dec9bf2234ce1be07b1a86 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
using System;
using System.Collections.Generic;
using System.Text;

namespace libLSL
{
    class lslByteCode
    {
        byte[] bytecode;

        public void executeStep()
        {
            byte ins = nextInstruction();
            lslOpcodes code = (lslOpcodes)ins;

            Object arg1;
            Object arg2;

            switch (code)
            {
                case lslOpcodes.OP_NOOP:
                    break;

                case lslOpcodes.OP_POP:
                    popBytes(4);
                    break;

                case lslOpcodes.OP_POPS:
                case lslOpcodes.OP_POPL:
                    // Do Stuff
                    break;

                case lslOpcodes.OP_POPV:
                    popBytes(12);
                    break;
                case lslOpcodes.OP_POPQ:
                    popBytes(16);
                    break;

                case lslOpcodes.OP_POPARG:
                    popBytes((Int32)arg1);
                    break;

                case lslOpcodes.OP_POPIP:
                    // Do Stuff
                    break;

                case lslOpcodes.OP_POPBP:
                    // Do Stuff
                    break;

                case lslOpcodes.OP_POPSP:
                    // Do Stuff
                    break;

                case lslOpcodes.OP_POPSLR:
                    // Do Stuff
                    break;

                case lslOpcodes.OP_DUP:
                    pushBytes(getBytes(4));
                    break;

                case lslOpcodes.OP_DUPS:
                case lslOpcodes.OP_DUPL:
                    // Do Stuff
                    break;

                case lslOpcodes.OP_DUPV:
                    pushBytes(getBytes(12));
                    break;

                case lslOpcodes.OP_DUPQ:
                    pushBytes(getBytes(16));
                    break;

                case lslOpcodes.OP_STORE:
                    // Somefin.
                    break;

                default:
                    break;
            }
        }

        /// <summary>
        /// Advance the instruction pointer, pull the current instruction
        /// </summary>
        /// <returns></returns>
        byte nextInstruction()
        {
            return 0;
        }

        /// <summary>
        /// Removes bytes from the stack
        /// </summary>
        /// <param name="num">Number of bytes</param>
        void popBytes(int num)
        {

        }

        /// <summary>
        /// Pushes Bytes to the stack
        /// </summary>
        /// <param name="bytes">Ze bytes!</param>
        void pushBytes(byte[] bytes)
        {

        }

        /// <summary>
        /// Get Bytes from the stack
        /// </summary>
        /// <param name="num">Number of bytes</param>
        /// <returns>Ze bytes!</returns>
        byte[] getBytes(int num)
        {

        }

        /// <summary>
        /// Saves bytes to the local frame
        /// </summary>
        /// <param name="bytes">Ze bytes!</param>
        /// <param name="index">Index in local frame</param>
        void storeBytes(byte[] bytes, int index)
        {

        }
    }
}