Update to support new negative format
diff --git a/src/_monkeyYaml.py b/src/_monkeyYaml.py
index 69da349..bc6d128 100644
--- a/src/_monkeyYaml.py
+++ b/src/_monkeyYaml.py
@@ -15,12 +15,17 @@
 mYamlStringValue = re.compile(r"^('|\").*\1$")
 
 def load(str):
+    return myReadDict(str.splitlines())[1]
+
+def myReadDict(lines, indent=""):
     dict = None
     key = None
     emptyLines = 0
 
-    lines = str.splitlines()
     while lines:
+        if not lines[0].startswith(indent):
+            break
+
         line = lines.pop(0)
         if myIsAllSpaces(line):
             emptyLines += 1
@@ -32,7 +37,7 @@
                 dict = {}
             key = result.group(1).strip()
             value = result.group(2).strip()
-            (lines, value) = myReadValue(lines, value)
+            (lines, value) = myReadValue(lines, value, indent)
             dict[key] = value
         else:
             if dict and key and key in dict:
@@ -41,9 +46,9 @@
             else:
                 raise Exception("monkeyYaml is confused at " + line)
         emptyLines = 0
-    return dict
+    return lines, dict
 
-def myReadValue(lines, value):
+def myReadValue(lines, value, indent):
     if value == ">" or value == "|":
         (lines, value) = myMultiline(lines, value == "|")
         value = value + "\n"
@@ -51,9 +56,11 @@
     if lines and not value:
         if myMaybeList(lines[0]):
             return myMultilineList(lines, value)
-        return myMultiline(lines, False)
-    else:
-        return lines, myReadOneLine(value)
+        indentMatch = re.match("(" + indent + r"\s+)", lines[0])
+        if indentMatch:
+            if ":" in lines[0]:
+                return myReadDict(lines, indentMatch.group(1))
+            return myMultiline(lines, False)
     return lines, myReadOneLine(value)
 
 def myMaybeList(value):
diff --git a/src/test262.py b/src/test262.py
index d5a5aa1..c92e5bf 100755
--- a/src/test262.py
+++ b/src/test262.py
@@ -146,7 +146,7 @@
     if self.HasUnexpectedOutcome():
       if self.case.IsNegative():
         print "=== %s was expected to fail in %s, but didn't ===" % (name, mode)
-        print "--- expected error: %s ---\n" % self.case.GetNegative()
+        print "--- expected error: %s ---\n" % self.case.GetNegativeType()
       else:
         if long_format:
           print "=== %s failed in %s ===" % (name, mode)
@@ -246,11 +246,21 @@
     self.validate()
 
   def NegativeMatch(self, stderr):
-    neg = re.compile(self.GetNegative())
+    neg = re.compile(self.GetNegativeType())
     return re.search(neg, stderr)
 
   def GetNegative(self):
-    return self.testRecord['negative']
+    if not self.IsNegative():
+        return None
+    return self.testRecord["negative"]
+
+  def GetNegativeType(self):
+    negative = self.GetNegative()
+    return negative and negative["type"]
+
+  def GetNegativePhase(self):
+    negative = self.GetNegative()
+    return negative and negative["phase"]
 
   def GetName(self):
     return path.join(*self.name)
@@ -304,6 +314,10 @@
         self.GetAdditionalIncludes() + \
         self.test + '\n'
 
+    if self.GetNegativePhase() == "early":
+        source = ("throw 'Expected an early error, but code was executed.';\n" +
+            source)
+
     if self.strict_mode:
       source = '"use strict";\nvar strict_mode = true;\n' + source
     else:
@@ -363,6 +377,10 @@
 
   def validate(self):
     flags = self.testRecord.get("flags")
+    phase = self.GetNegativePhase()
+
+    if phase not in [None, "early", "runtime"]:
+        raise TypeError("Invalid value for negative phase: " + phase)
 
     if not flags:
         return
@@ -578,7 +596,7 @@
     if result.HasUnexpectedOutcome():
       if result.case.IsNegative():
           self.logf.write("=== %s was expected to fail in %s, but didn't === \n" % (name, mode))
-          self.logf.write("--- expected error: %s ---\n" % result.case.GetNegative())
+          self.logf.write("--- expected error: %s ---\n" % result.case.GetNegativeType())
           result.WriteOutput(self.logf)
       else:
           self.logf.write("=== %s failed in %s === \n" % (name, mode))
diff --git a/test/fixtures/negative.js b/test/fixtures/negative.js
new file mode 100644
index 0000000..f772b2e
--- /dev/null
+++ b/test/fixtures/negative.js
@@ -0,0 +1,11 @@
+// fake copyright comment
+/*---
+info: >
+    Sample test info
+description: Sample test description
+negative:
+  phase: early
+  type: SyntaxError
+---*/
+
+???
diff --git a/test/test_monkeyYaml.py b/test/test_monkeyYaml.py
index eb1b64e..428e45b 100644
--- a/test/test_monkeyYaml.py
+++ b/test/test_monkeyYaml.py
@@ -185,5 +185,26 @@
 """
         self.assertEqual(monkeyYaml.load(y), yaml.load(y))
 
+    def test_nested_1(self):
+        y = """
+es61d: 19.1.2.1
+negative:
+    stage: early
+    type: ReferenceError
+description: foo
+"""
+        self.assertEqual(monkeyYaml.load(y), yaml.load(y))
+
+    def test_nested_2(self):
+        y = """
+es61d: 19.1.2.1
+first:
+    second_a:
+        third: 1
+    second_b: 3
+description: foo
+"""
+        self.assertEqual(monkeyYaml.load(y), yaml.load(y))
+
 if __name__ == '__main__':
     unittest.main()
diff --git a/test/test_parseTestRecord.py b/test/test_parseTestRecord.py
index 422b5af..36576b5 100644
--- a/test/test_parseTestRecord.py
+++ b/test/test_parseTestRecord.py
@@ -171,7 +171,13 @@
 
 """, record['test'])
 
+    def test_negative(self):
+        name = 'fixtures/negative.js'
+        contents = slurpFile(name)
+        record = parseTestRecord(contents, name)
 
+        self.assertEqual('early', record['negative']['phase'])
+        self.assertEqual('SyntaxError', record['negative']['type'])
 
 if __name__ == '__main__':
     unittest.main()