aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTianjie Xu2017-03-06 16:44:59 -0600
committerTianjie Xu2017-03-22 16:20:57 -0500
commitc444732540d5245b6219293e96d29f325daa7839 (patch)
treed66338f891ad8b440a36e781988fae89cca1da7f /edify/expr.cpp
parentd882b8892a1592101b901dd474de41e56c31b17b (diff)
downloadplatform-bootable-recovery-c444732540d5245b6219293e96d29f325daa7839.tar.gz
platform-bootable-recovery-c444732540d5245b6219293e96d29f325daa7839.tar.xz
platform-bootable-recovery-c444732540d5245b6219293e96d29f325daa7839.zip
Remove malloc in edify functions
And switch them to std::vector & std::unique_ptr Bug: 32117870 Test: recovery tests passed on sailfish Change-Id: I5a45951c4bdf895be311d6d760e52e7a1b0798c3
Diffstat (limited to 'edify/expr.cpp')
-rw-r--r--edify/expr.cpp119
1 files changed, 75 insertions, 44 deletions
diff --git a/edify/expr.cpp b/edify/expr.cpp
index 329cf3ac..2b7fd7a6 100644
--- a/edify/expr.cpp
+++ b/edify/expr.cpp
@@ -40,12 +40,12 @@ static bool BooleanString(const std::string& s) {
40 return !s.empty(); 40 return !s.empty();
41} 41}
42 42
43bool Evaluate(State* state, Expr* expr, std::string* result) { 43bool Evaluate(State* state, const std::unique_ptr<Expr>& expr, std::string* result) {
44 if (result == nullptr) { 44 if (result == nullptr) {
45 return false; 45 return false;
46 } 46 }
47 47
48 std::unique_ptr<Value> v(expr->fn(expr->name, state, expr->argc, expr->argv)); 48 std::unique_ptr<Value> v(expr->fn(expr->name.c_str(), state, expr->argv));
49 if (!v) { 49 if (!v) {
50 return false; 50 return false;
51 } 51 }
@@ -58,8 +58,8 @@ bool Evaluate(State* state, Expr* expr, std::string* result) {
58 return true; 58 return true;
59} 59}
60 60
61Value* EvaluateValue(State* state, Expr* expr) { 61Value* EvaluateValue(State* state, const std::unique_ptr<Expr>& expr) {
62 return expr->fn(expr->name, state, expr->argc, expr->argv); 62 return expr->fn(expr->name.c_str(), state, expr->argv);
63} 63}
64 64
65Value* StringValue(const char* str) { 65Value* StringValue(const char* str) {
@@ -73,12 +73,12 @@ Value* StringValue(const std::string& str) {
73 return StringValue(str.c_str()); 73 return StringValue(str.c_str());
74} 74}
75 75
76Value* ConcatFn(const char* name, State* state, int argc, Expr* argv[]) { 76Value* ConcatFn(const char* name, State* state, const std::vector<std::unique_ptr<Expr>>& argv) {
77 if (argc == 0) { 77 if (argv.empty()) {
78 return StringValue(""); 78 return StringValue("");
79 } 79 }
80 std::string result; 80 std::string result;
81 for (int i = 0; i < argc; ++i) { 81 for (size_t i = 0; i < argv.size(); ++i) {
82 std::string str; 82 std::string str;
83 if (!Evaluate(state, argv[i], &str)) { 83 if (!Evaluate(state, argv[i], &str)) {
84 return nullptr; 84 return nullptr;
@@ -89,8 +89,8 @@ Value* ConcatFn(const char* name, State* state, int argc, Expr* argv[]) {
89 return StringValue(result); 89 return StringValue(result);
90} 90}
91 91
92Value* IfElseFn(const char* name, State* state, int argc, Expr* argv[]) { 92Value* IfElseFn(const char* name, State* state, const std::vector<std::unique_ptr<Expr>>& argv) {
93 if (argc != 2 && argc != 3) { 93 if (argv.size() != 2 && argv.size() != 3) {
94 state->errmsg = "ifelse expects 2 or 3 arguments"; 94 state->errmsg = "ifelse expects 2 or 3 arguments";
95 return nullptr; 95 return nullptr;
96 } 96 }
@@ -102,16 +102,16 @@ Value* IfElseFn(const char* name, State* state, int argc, Expr* argv[]) {
102 102
103 if (!cond.empty()) { 103 if (!cond.empty()) {
104 return EvaluateValue(state, argv[1]); 104 return EvaluateValue(state, argv[1]);
105 } else if (argc == 3) { 105 } else if (argv.size() == 3) {
106 return EvaluateValue(state, argv[2]); 106 return EvaluateValue(state, argv[2]);
107 } 107 }
108 108
109 return StringValue(""); 109 return StringValue("");
110} 110}
111 111
112Value* AbortFn(const char* name, State* state, int argc, Expr* argv[]) { 112Value* AbortFn(const char* name, State* state, const std::vector<std::unique_ptr<Expr>>& argv) {
113 std::string msg; 113 std::string msg;
114 if (argc > 0 && Evaluate(state, argv[0], &msg)) { 114 if (!argv.empty() && Evaluate(state, argv[0], &msg)) {
115 state->errmsg = msg; 115 state->errmsg = msg;
116 } else { 116 } else {
117 state->errmsg = "called abort()"; 117 state->errmsg = "called abort()";
@@ -119,8 +119,8 @@ Value* AbortFn(const char* name, State* state, int argc, Expr* argv[]) {
119 return nullptr; 119 return nullptr;
120} 120}
121 121
122Value* AssertFn(const char* name, State* state, int argc, Expr* argv[]) { 122Value* AssertFn(const char* name, State* state, const std::vector<std::unique_ptr<Expr>>& argv) {
123 for (int i = 0; i < argc; ++i) { 123 for (size_t i = 0; i < argv.size(); ++i) {
124 std::string result; 124 std::string result;
125 if (!Evaluate(state, argv[i], &result)) { 125 if (!Evaluate(state, argv[i], &result)) {
126 return nullptr; 126 return nullptr;
@@ -134,7 +134,7 @@ Value* AssertFn(const char* name, State* state, int argc, Expr* argv[]) {
134 return StringValue(""); 134 return StringValue("");
135} 135}
136 136
137Value* SleepFn(const char* name, State* state, int argc, Expr* argv[]) { 137Value* SleepFn(const char* name, State* state, const std::vector<std::unique_ptr<Expr>>& argv) {
138 std::string val; 138 std::string val;
139 if (!Evaluate(state, argv[0], &val)) { 139 if (!Evaluate(state, argv[0], &val)) {
140 return nullptr; 140 return nullptr;
@@ -149,8 +149,8 @@ Value* SleepFn(const char* name, State* state, int argc, Expr* argv[]) {
149 return StringValue(val); 149 return StringValue(val);
150} 150}
151 151
152Value* StdoutFn(const char* name, State* state, int argc, Expr* argv[]) { 152Value* StdoutFn(const char* name, State* state, const std::vector<std::unique_ptr<Expr>>& argv) {
153 for (int i = 0; i < argc; ++i) { 153 for (size_t i = 0; i < argv.size(); ++i) {
154 std::string v; 154 std::string v;
155 if (!Evaluate(state, argv[i], &v)) { 155 if (!Evaluate(state, argv[i], &v)) {
156 return nullptr; 156 return nullptr;
@@ -161,7 +161,7 @@ Value* StdoutFn(const char* name, State* state, int argc, Expr* argv[]) {
161} 161}
162 162
163Value* LogicalAndFn(const char* name, State* state, 163Value* LogicalAndFn(const char* name, State* state,
164 int argc, Expr* argv[]) { 164 const std::vector<std::unique_ptr<Expr>>& argv) {
165 std::string left; 165 std::string left;
166 if (!Evaluate(state, argv[0], &left)) { 166 if (!Evaluate(state, argv[0], &left)) {
167 return nullptr; 167 return nullptr;
@@ -174,7 +174,7 @@ Value* LogicalAndFn(const char* name, State* state,
174} 174}
175 175
176Value* LogicalOrFn(const char* name, State* state, 176Value* LogicalOrFn(const char* name, State* state,
177 int argc, Expr* argv[]) { 177 const std::vector<std::unique_ptr<Expr>>& argv) {
178 std::string left; 178 std::string left;
179 if (!Evaluate(state, argv[0], &left)) { 179 if (!Evaluate(state, argv[0], &left)) {
180 return nullptr; 180 return nullptr;
@@ -187,7 +187,7 @@ Value* LogicalOrFn(const char* name, State* state,
187} 187}
188 188
189Value* LogicalNotFn(const char* name, State* state, 189Value* LogicalNotFn(const char* name, State* state,
190 int argc, Expr* argv[]) { 190 const std::vector<std::unique_ptr<Expr>>& argv) {
191 std::string val; 191 std::string val;
192 if (!Evaluate(state, argv[0], &val)) { 192 if (!Evaluate(state, argv[0], &val)) {
193 return nullptr; 193 return nullptr;
@@ -197,7 +197,7 @@ Value* LogicalNotFn(const char* name, State* state,
197} 197}
198 198
199Value* SubstringFn(const char* name, State* state, 199Value* SubstringFn(const char* name, State* state,
200 int argc, Expr* argv[]) { 200 const std::vector<std::unique_ptr<Expr>>& argv) {
201 std::string needle; 201 std::string needle;
202 if (!Evaluate(state, argv[0], &needle)) { 202 if (!Evaluate(state, argv[0], &needle)) {
203 return nullptr; 203 return nullptr;
@@ -212,7 +212,7 @@ Value* SubstringFn(const char* name, State* state,
212 return StringValue(result); 212 return StringValue(result);
213} 213}
214 214
215Value* EqualityFn(const char* name, State* state, int argc, Expr* argv[]) { 215Value* EqualityFn(const char* name, State* state, const std::vector<std::unique_ptr<Expr>>& argv) {
216 std::string left; 216 std::string left;
217 if (!Evaluate(state, argv[0], &left)) { 217 if (!Evaluate(state, argv[0], &left)) {
218 return nullptr; 218 return nullptr;
@@ -226,7 +226,8 @@ Value* EqualityFn(const char* name, State* state, int argc, Expr* argv[]) {
226 return StringValue(result); 226 return StringValue(result);
227} 227}
228 228
229Value* InequalityFn(const char* name, State* state, int argc, Expr* argv[]) { 229Value* InequalityFn(const char* name, State* state,
230 const std::vector<std::unique_ptr<Expr>>& argv) {
230 std::string left; 231 std::string left;
231 if (!Evaluate(state, argv[0], &left)) { 232 if (!Evaluate(state, argv[0], &left)) {
232 return nullptr; 233 return nullptr;
@@ -240,7 +241,7 @@ Value* InequalityFn(const char* name, State* state, int argc, Expr* argv[]) {
240 return StringValue(result); 241 return StringValue(result);
241} 242}
242 243
243Value* SequenceFn(const char* name, State* state, int argc, Expr* argv[]) { 244Value* SequenceFn(const char* name, State* state, const std::vector<std::unique_ptr<Expr>>& argv) {
244 std::unique_ptr<Value> left(EvaluateValue(state, argv[0])); 245 std::unique_ptr<Value> left(EvaluateValue(state, argv[0]));
245 if (!left) { 246 if (!left) {
246 return nullptr; 247 return nullptr;
@@ -248,14 +249,15 @@ Value* SequenceFn(const char* name, State* state, int argc, Expr* argv[]) {
248 return EvaluateValue(state, argv[1]); 249 return EvaluateValue(state, argv[1]);
249} 250}
250 251
251Value* LessThanIntFn(const char* name, State* state, int argc, Expr* argv[]) { 252Value* LessThanIntFn(const char* name, State* state,
252 if (argc != 2) { 253 const std::vector<std::unique_ptr<Expr>>& argv) {
254 if (argv.size() != 2) {
253 state->errmsg = "less_than_int expects 2 arguments"; 255 state->errmsg = "less_than_int expects 2 arguments";
254 return nullptr; 256 return nullptr;
255 } 257 }
256 258
257 std::vector<std::string> args; 259 std::vector<std::string> args;
258 if (!ReadArgs(state, 2, argv, &args)) { 260 if (!ReadArgs(state, argv, &args)) {
259 return nullptr; 261 return nullptr;
260 } 262 }
261 263
@@ -276,20 +278,34 @@ Value* LessThanIntFn(const char* name, State* state, int argc, Expr* argv[]) {
276} 278}
277 279
278Value* GreaterThanIntFn(const char* name, State* state, 280Value* GreaterThanIntFn(const char* name, State* state,
279 int argc, Expr* argv[]) { 281 const std::vector<std::unique_ptr<Expr>>& argv) {
280 if (argc != 2) { 282 if (argv.size() != 2) {
281 state->errmsg = "greater_than_int expects 2 arguments"; 283 state->errmsg = "greater_than_int expects 2 arguments";
282 return nullptr; 284 return nullptr;
283 } 285 }
284 286
285 Expr* temp[2]; 287 std::vector<std::string> args;
286 temp[0] = argv[1]; 288 if (!ReadArgs(state, argv, &args)) {
287 temp[1] = argv[0]; 289 return nullptr;
290 }
291
292 // Parse up to at least long long or 64-bit integers.
293 int64_t l_int;
294 if (!android::base::ParseInt(args[0].c_str(), &l_int)) {
295 state->errmsg = "failed to parse int in " + args[0];
296 return nullptr;
297 }
298
299 int64_t r_int;
300 if (!android::base::ParseInt(args[1].c_str(), &r_int)) {
301 state->errmsg = "failed to parse int in " + args[1];
302 return nullptr;
303 }
288 304
289 return LessThanIntFn(name, state, 2, temp); 305 return StringValue(l_int > r_int ? "t" : "");
290} 306}
291 307
292Value* Literal(const char* name, State* state, int argc, Expr* argv[]) { 308Value* Literal(const char* name, State* state, const std::vector<std::unique_ptr<Expr>>& argv) {
293 return StringValue(name); 309 return StringValue(name);
294} 310}
295 311
@@ -329,14 +345,22 @@ void RegisterBuiltins() {
329// convenience methods for functions 345// convenience methods for functions
330// ----------------------------------------------------------------- 346// -----------------------------------------------------------------
331 347
332// Evaluate the expressions in argv, and put the results of strings in 348// Evaluate the expressions in argv, and put the results of strings in args. If any expression
333// args. If any expression evaluates to nullptr, free the rest and return 349// evaluates to nullptr, return false. Return true on success.
334// false. Return true on success. 350bool ReadArgs(State* state, const std::vector<std::unique_ptr<Expr>>& argv,
335bool ReadArgs(State* state, int argc, Expr* argv[], std::vector<std::string>* args) { 351 std::vector<std::string>* args) {
352 return ReadArgs(state, argv, args, 0, argv.size());
353}
354
355bool ReadArgs(State* state, const std::vector<std::unique_ptr<Expr>>& argv,
356 std::vector<std::string>* args, size_t start, size_t len) {
336 if (args == nullptr) { 357 if (args == nullptr) {
337 return false; 358 return false;
338 } 359 }
339 for (int i = 0; i < argc; ++i) { 360 if (len == 0 || start + len > argv.size()) {
361 return false;
362 }
363 for (size_t i = start; i < start + len; ++i) {
340 std::string var; 364 std::string var;
341 if (!Evaluate(state, argv[i], &var)) { 365 if (!Evaluate(state, argv[i], &var)) {
342 args->clear(); 366 args->clear();
@@ -347,15 +371,22 @@ bool ReadArgs(State* state, int argc, Expr* argv[], std::vector<std::string>* ar
347 return true; 371 return true;
348} 372}
349 373
350// Evaluate the expressions in argv, and put the results of Value* in 374// Evaluate the expressions in argv, and put the results of Value* in args. If any expression
351// args. If any expression evaluate to nullptr, free the rest and return 375// evaluate to nullptr, return false. Return true on success.
352// false. Return true on success. 376bool ReadValueArgs(State* state, const std::vector<std::unique_ptr<Expr>>& argv,
353bool ReadValueArgs(State* state, int argc, Expr* argv[],
354 std::vector<std::unique_ptr<Value>>* args) { 377 std::vector<std::unique_ptr<Value>>* args) {
378 return ReadValueArgs(state, argv, args, 0, argv.size());
379}
380
381bool ReadValueArgs(State* state, const std::vector<std::unique_ptr<Expr>>& argv,
382 std::vector<std::unique_ptr<Value>>* args, size_t start, size_t len) {
355 if (args == nullptr) { 383 if (args == nullptr) {
356 return false; 384 return false;
357 } 385 }
358 for (int i = 0; i < argc; ++i) { 386 if (len == 0 || start + len > argv.size()) {
387 return false;
388 }
389 for (size_t i = start; i < start + len; ++i) {
359 std::unique_ptr<Value> v(EvaluateValue(state, argv[i])); 390 std::unique_ptr<Value> v(EvaluateValue(state, argv[i]));
360 if (!v) { 391 if (!v) {
361 args->clear(); 392 args->clear();