Compile assignments to byte code and throw errors.

Add EvalExceptions for cases in which the interpreter would throw them
during evaluation of the function definition.

--
MOS_MIGRATED_REVID=107376021
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/AssignmentStatement.java b/src/main/java/com/google/devtools/build/lib/syntax/AssignmentStatement.java
index f731ed5..e3dc7d1 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/AssignmentStatement.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/AssignmentStatement.java
@@ -14,6 +14,13 @@
 
 package com.google.devtools.build.lib.syntax;
 
+import com.google.common.base.Optional;
+import com.google.devtools.build.lib.syntax.compiler.DebugInfo;
+import com.google.devtools.build.lib.syntax.compiler.LoopLabels;
+import com.google.devtools.build.lib.syntax.compiler.VariableScope;
+
+import net.bytebuddy.implementation.bytecode.ByteCodeAppender;
+
 /**
  * Syntax node for an assignment statement.
  */
@@ -66,4 +73,13 @@
     expression.validate(env);
     lvalue.validate(env, getLocation());
   }
+
+  @Override
+  ByteCodeAppender compile(
+      VariableScope scope, Optional<LoopLabels> loopLabels, DebugInfo debugInfo)
+          throws EvalException {
+    return new ByteCodeAppender.Compound(
+        expression.compile(scope, debugInfo),
+        lvalue.compileAssignment(this, debugInfo.add(this), scope));
+  }
 }