aboutsummaryrefslogtreecommitdiff
path: root/src/processor
diff options
context:
space:
mode:
authorted.mielczarek <ted.mielczarek@4c0a9323-5329-0410-9bdc-e9ce6186880e>2012-02-21 23:15:30 +0000
committerted.mielczarek <ted.mielczarek@4c0a9323-5329-0410-9bdc-e9ce6186880e>2012-02-21 23:15:30 +0000
commitf2e937f1cb43d15ad570338b3b1fe3faa7260ff9 (patch)
tree0a3df2184fd7175b7519279fa61c6f7741e76a5c /src/processor
parentMove away from the 10.4 SDK. (diff)
downloadbreakpad-f2e937f1cb43d15ad570338b3b1fe3faa7260ff9.tar.xz
Add support for @ operator to PostfixEvaluator
R=mark at http://breakpad.appspot.com/349002/ git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@923 4c0a9323-5329-0410-9bdc-e9ce6186880e
Diffstat (limited to 'src/processor')
-rw-r--r--src/processor/postfix_evaluator-inl.h9
-rw-r--r--src/processor/postfix_evaluator.h10
-rw-r--r--src/processor/postfix_evaluator_unittest.cc4
3 files changed, 17 insertions, 6 deletions
diff --git a/src/processor/postfix_evaluator-inl.h b/src/processor/postfix_evaluator-inl.h
index b24f092c..22faf7b2 100644
--- a/src/processor/postfix_evaluator-inl.h
+++ b/src/processor/postfix_evaluator-inl.h
@@ -83,7 +83,8 @@ bool PostfixEvaluator<ValueType>::EvaluateInternal(
BINARY_OP_SUBTRACT,
BINARY_OP_MULTIPLY,
BINARY_OP_DIVIDE_QUOTIENT,
- BINARY_OP_DIVIDE_MODULUS
+ BINARY_OP_DIVIDE_MODULUS,
+ BINARY_OP_ALIGN
};
BinaryOperation operation = BINARY_OP_NONE;
@@ -97,6 +98,8 @@ bool PostfixEvaluator<ValueType>::EvaluateInternal(
operation = BINARY_OP_DIVIDE_QUOTIENT;
else if (token == "%")
operation = BINARY_OP_DIVIDE_MODULUS;
+ else if (token == "@")
+ operation = BINARY_OP_ALIGN;
if (operation != BINARY_OP_NONE) {
// Get the operands.
@@ -126,6 +129,10 @@ bool PostfixEvaluator<ValueType>::EvaluateInternal(
case BINARY_OP_DIVIDE_MODULUS:
result = operand1 % operand2;
break;
+ case BINARY_OP_ALIGN:
+ result =
+ operand1 & (reinterpret_cast<ValueType>(-1) ^ (operand2 - 1));
+ break;
case BINARY_OP_NONE:
// This will not happen, but compilers will want a default or
// BINARY_OP_NONE case.
diff --git a/src/processor/postfix_evaluator.h b/src/processor/postfix_evaluator.h
index 24807551..35f79f76 100644
--- a/src/processor/postfix_evaluator.h
+++ b/src/processor/postfix_evaluator.h
@@ -44,10 +44,12 @@
// either literal values suitable for ValueType, or constants or variables,
// which reference the dictionary. The supported binary operators are +
// (addition), - (subtraction), * (multiplication), / (quotient of division),
-// and % (modulus of division). The unary ^ (dereference) operator is also
-// provided. These operators allow any operand to be either a literal
-// value, constant, or variable. Assignment (=) of any type of operand into
-// a variable is also supported.
+// % (modulus of division), and @ (data alignment). The alignment operator (@)
+// accepts a value and an alignment size, and produces a result that is a
+// multiple of the alignment size by truncating the input value.
+// The unary ^ (dereference) operator is also provided. These operators
+// allow any operand to be either a literal value, constant, or variable.
+// Assignment (=) of any type of operand into a variable is also supported.
//
// The dictionary is provided as a map with string keys. Keys beginning
// with the '$' character are treated as variables. All other keys are
diff --git a/src/processor/postfix_evaluator_unittest.cc b/src/processor/postfix_evaluator_unittest.cc
index 0c2d8ece..427ee505 100644
--- a/src/processor/postfix_evaluator_unittest.cc
+++ b/src/processor/postfix_evaluator_unittest.cc
@@ -148,7 +148,8 @@ static bool RunTests() {
{ "$rSub 9 6 - =", true }, // $rSub = 9 - 6 = 3
{ "$rDivQ 9 6 / =", true }, // $rDivQ = 9 / 6 = 1
{ "$rDivM 9 6 % =", true }, // $rDivM = 9 % 6 = 3
- { "$rDeref 9 ^ =", true } // $rDeref = ^9 = 10 (FakeMemoryRegion)
+ { "$rDeref 9 ^ =", true }, // $rDeref = ^9 = 10 (FakeMemoryRegion)
+ { "$rAlign 36 8 @ =", true }, // $rAlign = 36 @ 8
};
map<string, unsigned int> validate_data_0;
validate_data_0["$rAdd"] = 8;
@@ -158,6 +159,7 @@ static bool RunTests() {
validate_data_0["$rDivQ"] = 1;
validate_data_0["$rDivM"] = 3;
validate_data_0["$rDeref"] = 10;
+ validate_data_0["$rAlign"] = 32;
// The second test set simulates a couple of MSVC program strings.
// The data is fudged a little bit because the tests use FakeMemoryRegion