Permalink
Browse files

More cleanups to word_eval.

- Remove CompoundPartValue and UndefPartValue variants.
- Get rid of unused function
- Make method public
  • Loading branch information...
Andy Chu
Andy Chu committed Jan 5, 2018
1 parent ca609e3 commit 7dc753e6a089305804ab0c0d8f2ee8896c7d0170
Showing with 20 additions and 28 deletions.
  1. +4 −4 core/cmd_exec_test.py
  2. +4 −8 core/runtime.asdl
  3. +12 −16 core/word_eval.py
View
@@ -85,12 +85,12 @@ def testVarOps(self):
ev = InitEvaluator() # initializes x=xxx and y=yyy
unset_sub = ast.BracedVarSub(ast.token(Id.VSub_Name, 'unset'))
part_vals = []
ev.part_ev._EvalWordPart(unset_sub, part_vals)
ev.part_ev.EvalWordPart(unset_sub, part_vals)
print(part_vals)
set_sub = ast.BracedVarSub(ast.token(Id.VSub_Name, 'x'))
part_vals = []
ev.part_ev._EvalWordPart(set_sub, part_vals)
ev.part_ev.EvalWordPart(set_sub, part_vals)
print(part_vals)
# Now add some ops
@@ -101,11 +101,11 @@ def testVarOps(self):
set_sub.suffix_op = test_op
part_vals = []
ev.part_ev._EvalWordPart(unset_sub, part_vals)
ev.part_ev.EvalWordPart(unset_sub, part_vals)
print(part_vals)
part_vals = []
ev.part_ev._EvalWordPart(set_sub, part_vals)
ev.part_ev.EvalWordPart(set_sub, part_vals)
print(part_vals)
View
@@ -8,19 +8,15 @@
module runtime
{
-- A static word_part from os.asdl is evaluated to a dynamic part_value.
-- A static word_part from osh.asdl is evaluated to a dynamic part_value.
part_value =
-- UndefPartValue is for internal processing only.
UndefPartValue
-- Substitutions get split/elided/globbed. Unquoted literals also get
-- globbed.
| StringPartValue(string s, bool do_split_glob)
-- Substitutions and unquoted literals get split/elided/globbed.
StringPartValue(string s, bool do_split_glob)
-- "$@" or "${a[@]}" -- never split or globbed since double quoted.
| ArrayPartValue(string* strs)
| CompoundPartValue(part_value* children)
-- A static word from osh.asdl is evaluted to a dynamic value. value
-- instances are stored in memory.
-- instances are stored in state.Mem().
value =
-- Undef isn't visible at the language level. We model it as a value
-- rather than an error code because it's manipulated with ${a:-default}
View
@@ -27,18 +27,20 @@
def _ValueToPartValue(val, quoted):
"""Helper for VarSub evaluation."""
"""Helper for VarSub evaluation.
Called by _EvalBracedVarSub and _EvalWordPart for SimpleVarSub.
"""
assert isinstance(val, runtime.value), val
if val.tag == value_e.Undef:
return runtime.UndefPartValue()
elif val.tag == value_e.Str:
if val.tag == value_e.Str:
return runtime.StringPartValue(val.s, not quoted)
elif val.tag == value_e.StrArray:
return runtime.ArrayPartValue(val.strs)
else:
# Undef should be caught by _EmptyStrOrError().
raise AssertionError
@@ -484,7 +486,7 @@ def _EvalDoubleQuotedPart(self, part, part_vals):
return
for p in part.parts:
self._EvalWordPart(p, part_vals, quoted=True)
self.EvalWordPart(p, part_vals, quoted=True)
def _DecayArray(self, val):
sep = _GetJoinChar(self.mem)
@@ -711,10 +713,12 @@ def _EvalBracedVarSub(self, part, part_vals, quoted):
# No prefix or suffix ops
val = self._EmptyStrOrError(val)
# For example, ${a} evaluates to value_t.Str(), but we want a
# part_value.StringPartValue.
part_val = _ValueToPartValue(val, quoted)
part_vals.append(part_val)
def _EvalWordPart(self, part, part_vals, quoted=False):
def EvalWordPart(self, part, part_vals, quoted=False):
"""Evaluate a word part.
Args:
@@ -798,14 +802,6 @@ def _EvalWordPart(self, part, part_vals, quoted=False):
raise AssertionError(part.__class__.__name__)
def _FlattenPartValues(part_vals, out):
for pval in part_vals:
if pval.tag == part_value_e.CompoundPartValue:
_FlattenPartValues(pval.children, out)
else:
out.append(pval)
class _WordEvaluator:
"""Abstract base class for word evaluators.
@@ -834,7 +830,7 @@ def _EvalWordToParts(self, word, quoted, part_vals):
"Expected CompoundWord, got %s" % word
for p in word.parts:
v = self.part_ev._EvalWordPart(p, part_vals, quoted=quoted)
v = self.part_ev.EvalWordPart(p, part_vals, quoted=quoted)
def EvalWordToString(self, word, do_fnmatch=False, decay=False):
"""
@@ -850,7 +846,7 @@ def EvalWordToString(self, word, do_fnmatch=False, decay=False):
"""
part_vals = []
for part in word.parts:
self.part_ev._EvalWordPart(part, part_vals, quoted=False)
self.part_ev.EvalWordPart(part, part_vals, quoted=False)
strs = []
for part_val in part_vals:

0 comments on commit 7dc753e

Please sign in to comment.