1*993229b6Sjkunz /*
2*993229b6Sjkunz * File: EvalContext.h
3*993229b6Sjkunz *
4*993229b6Sjkunz * Copyright (c) Freescale Semiconductor, Inc. All rights reserved.
5*993229b6Sjkunz * See included license file for license details.
6*993229b6Sjkunz */
7*993229b6Sjkunz
8*993229b6Sjkunz #include "EvalContext.h"
9*993229b6Sjkunz #include <stdexcept>
10*993229b6Sjkunz #include "format_string.h"
11*993229b6Sjkunz
12*993229b6Sjkunz using namespace elftosb;
13*993229b6Sjkunz
EvalContext()14*993229b6Sjkunz EvalContext::EvalContext()
15*993229b6Sjkunz : m_sourcesManager(0)
16*993229b6Sjkunz {
17*993229b6Sjkunz }
18*993229b6Sjkunz
~EvalContext()19*993229b6Sjkunz EvalContext::~EvalContext()
20*993229b6Sjkunz {
21*993229b6Sjkunz }
22*993229b6Sjkunz
isVariableDefined(const std::string & name)23*993229b6Sjkunz bool EvalContext::isVariableDefined(const std::string & name)
24*993229b6Sjkunz {
25*993229b6Sjkunz variable_map_t::const_iterator it = m_variables.find(name);
26*993229b6Sjkunz return it != m_variables.end();
27*993229b6Sjkunz }
28*993229b6Sjkunz
getVariableValue(const std::string & name)29*993229b6Sjkunz uint32_t EvalContext::getVariableValue(const std::string & name)
30*993229b6Sjkunz {
31*993229b6Sjkunz variable_map_t::const_iterator it = m_variables.find(name);
32*993229b6Sjkunz if (it == m_variables.end())
33*993229b6Sjkunz {
34*993229b6Sjkunz throw std::runtime_error(format_string("undefined variable '%s'", name.c_str()));
35*993229b6Sjkunz }
36*993229b6Sjkunz
37*993229b6Sjkunz return it->second.m_value;
38*993229b6Sjkunz }
39*993229b6Sjkunz
getVariableSize(const std::string & name)40*993229b6Sjkunz int_size_t EvalContext::getVariableSize(const std::string & name)
41*993229b6Sjkunz {
42*993229b6Sjkunz variable_map_t::const_iterator it = m_variables.find(name);
43*993229b6Sjkunz if (it == m_variables.end())
44*993229b6Sjkunz {
45*993229b6Sjkunz throw std::runtime_error(format_string("undefined variable '%s'", name.c_str()));
46*993229b6Sjkunz }
47*993229b6Sjkunz
48*993229b6Sjkunz return it->second.m_size;
49*993229b6Sjkunz }
50*993229b6Sjkunz
setVariable(const std::string & name,uint32_t value,int_size_t size)51*993229b6Sjkunz void EvalContext::setVariable(const std::string & name, uint32_t value, int_size_t size)
52*993229b6Sjkunz {
53*993229b6Sjkunz // check if var is locked
54*993229b6Sjkunz variable_map_t::const_iterator it = m_variables.find(name);
55*993229b6Sjkunz if (it != m_variables.end() && it->second.m_isLocked)
56*993229b6Sjkunz {
57*993229b6Sjkunz return;
58*993229b6Sjkunz }
59*993229b6Sjkunz
60*993229b6Sjkunz // set var info
61*993229b6Sjkunz variable_info_t info;
62*993229b6Sjkunz info.m_value = value;
63*993229b6Sjkunz info.m_size = size;
64*993229b6Sjkunz info.m_isLocked = false;
65*993229b6Sjkunz m_variables[name] = info;
66*993229b6Sjkunz }
67*993229b6Sjkunz
isVariableLocked(const std::string & name)68*993229b6Sjkunz bool EvalContext::isVariableLocked(const std::string & name)
69*993229b6Sjkunz {
70*993229b6Sjkunz variable_map_t::const_iterator it = m_variables.find(name);
71*993229b6Sjkunz if (it == m_variables.end())
72*993229b6Sjkunz {
73*993229b6Sjkunz throw std::runtime_error(format_string("undefined variable '%s'", name.c_str()));
74*993229b6Sjkunz }
75*993229b6Sjkunz
76*993229b6Sjkunz return it->second.m_isLocked;
77*993229b6Sjkunz }
78*993229b6Sjkunz
lockVariable(const std::string & name)79*993229b6Sjkunz void EvalContext::lockVariable(const std::string & name)
80*993229b6Sjkunz {
81*993229b6Sjkunz variable_map_t::iterator it = m_variables.find(name);
82*993229b6Sjkunz if (it == m_variables.end())
83*993229b6Sjkunz {
84*993229b6Sjkunz throw std::runtime_error(format_string("undefined variable '%s'", name.c_str()));
85*993229b6Sjkunz }
86*993229b6Sjkunz
87*993229b6Sjkunz it->second.m_isLocked = true;
88*993229b6Sjkunz }
89*993229b6Sjkunz
unlockVariable(const std::string & name)90*993229b6Sjkunz void EvalContext::unlockVariable(const std::string & name)
91*993229b6Sjkunz {
92*993229b6Sjkunz variable_map_t::iterator it = m_variables.find(name);
93*993229b6Sjkunz if (it == m_variables.end())
94*993229b6Sjkunz {
95*993229b6Sjkunz throw std::runtime_error("undefined variable");
96*993229b6Sjkunz }
97*993229b6Sjkunz
98*993229b6Sjkunz it->second.m_isLocked = false;
99*993229b6Sjkunz }
100*993229b6Sjkunz
dump()101*993229b6Sjkunz void EvalContext::dump()
102*993229b6Sjkunz {
103*993229b6Sjkunz variable_map_t::iterator it = m_variables.begin();
104*993229b6Sjkunz for (; it != m_variables.end(); ++it)
105*993229b6Sjkunz {
106*993229b6Sjkunz variable_info_t & info = it->second;
107*993229b6Sjkunz const char * lockedString = info.m_isLocked ? "locked" : "unlocked";
108*993229b6Sjkunz printf("%s = %u:%d (%s)\n", it->first.c_str(), info.m_value, (int)info.m_size, lockedString);
109*993229b6Sjkunz }
110*993229b6Sjkunz }
111*993229b6Sjkunz
112