forked from gfwilliams/tiny-js
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathScriptPosition.h
143 lines (117 loc) · 2.87 KB
/
ScriptPosition.h
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
134
135
136
137
138
139
140
141
142
/*
* File: ScriptPosition.h
* Author: ghernan
*
* Classes to handle source and object code positions.
*
* Created on March 1, 2017, 7:58 PM
*/
#ifndef SCRIPTPOSITION_H
#define SCRIPTPOSITION_H
#pragma once
#include "RefCountObj.h"
#include <string>
/**
* Indicates a position inside a script file
*/
struct ScriptPosition
{
int line;
int column;
ScriptPosition() :
line(-1), column(-1)
{
}
ScriptPosition(int l, int c) :
line(l), column(c)
{
}
std::string toString()const;
bool operator < (const ScriptPosition& b)const
{
if (line < b.line)
return true;
else if (line == b.line)
return column < b.column;
else
return false;
}
bool operator == (const ScriptPosition& b)const
{
return (line < b.line && column == b.column);
}
bool operator > (const ScriptPosition& b)const
{
return !(*this <= b);
}
bool operator <= (const ScriptPosition& b)const
{
return (*this < b || *this == b);
}
bool operator >= (const ScriptPosition& b)const
{
return !(*this < b);
}
};//struct ScriptPosition
/**
* Describes the position of an instruction inside Micro VM object code.
*/
struct VmPosition
{
Ref<RefCountObj> Routine;
int Block;
int Instruction;
VmPosition () : Block(-1), Instruction(-1)
{
}
VmPosition (Ref<RefCountObj> _routine, int _block, int _instruction) :
Routine(_routine), Block(_block), Instruction(_instruction)
{
}
bool operator < (const VmPosition& b)const
{
if (Routine == b.Routine)
{
if (Block == b.Block)
return Instruction < b.Instruction;
else
return Block < b.Block;
}
else
return Routine < b.Routine;
}
bool operator == (const VmPosition& b)const
{
return (Routine < b.Routine &&
Block == b.Block &&
Instruction == b.Instruction);
}
bool operator > (const VmPosition& b)const
{
return !(*this <= b);
}
bool operator <= (const VmPosition& b)const
{
return (*this < b || *this == b);
}
bool operator >= (const VmPosition& b)const
{
return !(*this < b);
}
};//struct VmPosition
/**
* Maps 'VmPositions' to 'ScriptPositions'. Used to give the source location
* of run time errors.
*/
class CodeMap
{
public:
const ScriptPosition& get(const VmPosition& vmPos)const;
bool add (const VmPosition& vmPos, const ScriptPosition& scPos);
private:
typedef std::map<VmPosition, ScriptPosition> VM2SCmap;
typedef std::map<ScriptPosition, VmPosition> SC2VMmap;
VM2SCmap m_vm2sc;
SC2VMmap m_sc2vm;
};
#endif /* SCRIPTPOSITION_H */