Bug 881480 - Add ownSymbols to object preview; r=ochameau draft
authorNicolas Chevobbe <nchevobbe@mozilla.com>
Mon, 24 Jul 2017 15:25:46 +0200
changeset 615067 1511b9481c870c94e1d3e415dc4ca13d11990843
parent 614363 a7a9f0be1366c85fb24c38a166fd30ddd444359b
child 639074 7b34a65f92dff10b029259851d93afa085cfbe95
push id70237
push userbmo:nchevobbe@mozilla.com
push dateTue, 25 Jul 2017 12:06:13 +0000
reviewersochameau
bugs881480
milestone56.0a1
Bug 881480 - Add ownSymbols to object preview; r=ochameau This adds an `ownSymbols` and an `ownSymbolsLength` properties to the grip `preview` property so we can retrieve them in the frontend. This also refactors the newly introduced test for symbols and add a function which test the content of the preview property in the grip. The console test packet stubs files were updated to take this into account. MozReview-Commit-ID: 7rPxFcS5uXE
devtools/client/webconsole/new-console-output/test/fixtures/stubs/consoleApi.js
devtools/client/webconsole/new-console-output/test/fixtures/stubs/evaluationResult.js
devtools/server/actors/object.js
devtools/server/tests/unit/test_objectgrips-16.js
--- a/devtools/client/webconsole/new-console-output/test/fixtures/stubs/consoleApi.js
+++ b/devtools/client/webconsole/new-console-output/test/fixtures/stubs/consoleApi.js
@@ -249,22 +249,24 @@ stubPreparedMessages.set("console.assert
         "ownProperties": {
           "message": {
             "configurable": true,
             "enumerable": true,
             "writable": true,
             "value": "foobar"
           }
         },
+        "ownSymbols": [],
         "ownPropertiesLength": 1,
+        "ownSymbolsLength": 0,
         "safeGetterValues": {}
       }
     }
   ],
-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":27},\"groupId\":null,\"indent\":0,\"level\":\"error\",\"messageText\":null,\"parameters\":[{\"type\":\"object\",\"actor\":\"server1.conn8.child1/obj31\",\"class\":\"Object\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":1,\"preview\":{\"kind\":\"Object\",\"ownProperties\":{\"message\":{\"configurable\":true,\"enumerable\":true,\"writable\":true,\"value\":\"foobar\"}},\"ownPropertiesLength\":1,\"safeGetterValues\":{}}}],\"source\":\"console-api\",\"type\":\"assert\",\"userProvidedStyles\":[]}",
+  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":27},\"groupId\":null,\"indent\":0,\"level\":\"error\",\"messageText\":null,\"parameters\":[{\"type\":\"object\",\"actor\":\"server1.conn8.child1/obj31\",\"class\":\"Object\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":1,\"preview\":{\"kind\":\"Object\",\"ownProperties\":{\"message\":{\"configurable\":true,\"enumerable\":true,\"writable\":true,\"value\":\"foobar\"}},\"ownSymbols\":[],\"ownPropertiesLength\":1,\"ownSymbolsLength\":0,\"safeGetterValues\":{}}}],\"source\":\"console-api\",\"type\":\"assert\",\"userProvidedStyles\":[]}",
   "stacktrace": [
     {
       "columnNumber": 27,
       "filename": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
       "functionName": "triggerPacket",
       "language": 2,
       "lineNumber": 1
     }
@@ -530,22 +532,24 @@ stubPreparedMessages.set("console.log('m
           },
           "blue": {
             "configurable": true,
             "enumerable": true,
             "writable": true,
             "value": "blueValue"
           }
         },
+        "ownSymbols": [],
         "ownPropertiesLength": 3,
+        "ownSymbolsLength": 0,
         "safeGetterValues": {}
       }
     }
   ],
-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":27},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[\"myobject\",{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj35\",\"class\":\"Object\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":3,\"preview\":{\"kind\":\"Object\",\"ownProperties\":{\"red\":{\"configurable\":true,\"enumerable\":true,\"writable\":true,\"value\":\"redValue\"},\"green\":{\"configurable\":true,\"enumerable\":true,\"writable\":true,\"value\":\"greenValue\"},\"blue\":{\"configurable\":true,\"enumerable\":true,\"writable\":true,\"value\":\"blueValue\"}},\"ownPropertiesLength\":3,\"safeGetterValues\":{}}}],\"source\":\"console-api\",\"type\":\"log\",\"userProvidedStyles\":[]}",
+  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":27},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[\"myobject\",{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj35\",\"class\":\"Object\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":3,\"preview\":{\"kind\":\"Object\",\"ownProperties\":{\"red\":{\"configurable\":true,\"enumerable\":true,\"writable\":true,\"value\":\"redValue\"},\"green\":{\"configurable\":true,\"enumerable\":true,\"writable\":true,\"value\":\"greenValue\"},\"blue\":{\"configurable\":true,\"enumerable\":true,\"writable\":true,\"value\":\"blueValue\"}},\"ownSymbols\":[],\"ownPropertiesLength\":3,\"ownSymbolsLength\":0,\"safeGetterValues\":{}}}],\"source\":\"console-api\",\"type\":\"log\",\"userProvidedStyles\":[]}",
   "stacktrace": null,
   "frame": {
     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
     "line": 1,
     "column": 27
   },
   "groupId": null,
   "exceptionDocURL": null,
@@ -1142,22 +1146,24 @@ stubPreparedMessages.set("console.dir({C
           },
           "black": {
             "configurable": true,
             "enumerable": true,
             "writable": true,
             "value": "K"
           }
         },
+        "ownSymbols": [],
         "ownPropertiesLength": 4,
+        "ownSymbolsLength": 0,
         "safeGetterValues": {}
       }
     }
   ],
-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":27},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj39\",\"class\":\"Object\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":4,\"preview\":{\"kind\":\"Object\",\"ownProperties\":{\"cyan\":{\"configurable\":true,\"enumerable\":true,\"writable\":true,\"value\":\"C\"},\"magenta\":{\"configurable\":true,\"enumerable\":true,\"writable\":true,\"value\":\"M\"},\"yellow\":{\"configurable\":true,\"enumerable\":true,\"writable\":true,\"value\":\"Y\"},\"black\":{\"configurable\":true,\"enumerable\":true,\"writable\":true,\"value\":\"K\"}},\"ownPropertiesLength\":4,\"safeGetterValues\":{}}}],\"source\":\"console-api\",\"type\":\"dir\",\"userProvidedStyles\":[]}",
+  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":27},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj39\",\"class\":\"Object\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":4,\"preview\":{\"kind\":\"Object\",\"ownProperties\":{\"cyan\":{\"configurable\":true,\"enumerable\":true,\"writable\":true,\"value\":\"C\"},\"magenta\":{\"configurable\":true,\"enumerable\":true,\"writable\":true,\"value\":\"M\"},\"yellow\":{\"configurable\":true,\"enumerable\":true,\"writable\":true,\"value\":\"Y\"},\"black\":{\"configurable\":true,\"enumerable\":true,\"writable\":true,\"value\":\"K\"}},\"ownSymbols\":[],\"ownPropertiesLength\":4,\"ownSymbolsLength\":0,\"safeGetterValues\":{}}}],\"source\":\"console-api\",\"type\":\"dir\",\"userProvidedStyles\":[]}",
   "stacktrace": null,
   "frame": {
     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
     "line": 1,
     "column": 27
   },
   "groupId": null,
   "exceptionDocURL": null,
@@ -1385,17 +1391,19 @@ stubPackets.set("console.assert(false, {
           "ownProperties": {
             "message": {
               "configurable": true,
               "enumerable": true,
               "writable": true,
               "value": "foobar"
             }
           },
+          "ownSymbols": [],
           "ownPropertiesLength": 1,
+          "ownSymbolsLength": 0,
           "safeGetterValues": {}
         }
       }
     ],
     "columnNumber": 27,
     "counter": null,
     "filename": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
     "functionName": "triggerPacket",
@@ -1653,17 +1661,19 @@ stubPackets.set("console.log('myobject',
             },
             "blue": {
               "configurable": true,
               "enumerable": true,
               "writable": true,
               "value": "blueValue"
             }
           },
+          "ownSymbols": [],
           "ownPropertiesLength": 3,
+          "ownSymbolsLength": 0,
           "safeGetterValues": {}
         }
       }
     ],
     "columnNumber": 27,
     "counter": null,
     "filename": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
     "functionName": "triggerPacket",
@@ -2243,17 +2253,19 @@ stubPackets.set("console.dir({C, M, Y, K
             },
             "black": {
               "configurable": true,
               "enumerable": true,
               "writable": true,
               "value": "K"
             }
           },
+          "ownSymbols": [],
           "ownPropertiesLength": 4,
+          "ownSymbolsLength": 0,
           "safeGetterValues": {}
         }
       }
     ],
     "columnNumber": 27,
     "counter": null,
     "filename": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
     "functionName": "triggerPacket",
--- a/devtools/client/webconsole/new-console-output/test/fixtures/stubs/evaluationResult.js
+++ b/devtools/client/webconsole/new-console-output/test/fixtures/stubs/evaluationResult.js
@@ -115,21 +115,23 @@ stubPreparedMessages.set("inspect({a: 1}
       "ownProperties": {
         "a": {
           "configurable": true,
           "enumerable": true,
           "writable": true,
           "value": 1
         }
       },
+      "ownSymbols": [],
       "ownPropertiesLength": 1,
+      "ownSymbolsLength": 0,
       "safeGetterValues": {}
     }
   },
-  "repeatId": "{\"frame\":null,\"groupId\":null,\"indent\":0,\"level\":\"log\",\"parameters\":{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj35\",\"class\":\"Object\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":1,\"preview\":{\"kind\":\"Object\",\"ownProperties\":{\"a\":{\"configurable\":true,\"enumerable\":true,\"writable\":true,\"value\":1}},\"ownPropertiesLength\":1,\"safeGetterValues\":{}}},\"source\":\"javascript\",\"type\":\"result\",\"userProvidedStyles\":null}",
+  "repeatId": "{\"frame\":null,\"groupId\":null,\"indent\":0,\"level\":\"log\",\"parameters\":{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj35\",\"class\":\"Object\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":1,\"preview\":{\"kind\":\"Object\",\"ownProperties\":{\"a\":{\"configurable\":true,\"enumerable\":true,\"writable\":true,\"value\":1}},\"ownSymbols\":[],\"ownPropertiesLength\":1,\"ownSymbolsLength\":0,\"safeGetterValues\":{}}},\"source\":\"javascript\",\"type\":\"result\",\"userProvidedStyles\":null}",
   "stacktrace": null,
   "frame": null,
   "groupId": null,
   "userProvidedStyles": null,
   "notes": null,
   "indent": 0
 }));
 
@@ -278,17 +280,19 @@ stubPackets.set("inspect({a: 1})", {
         "ownProperties": {
           "a": {
             "configurable": true,
             "enumerable": true,
             "writable": true,
             "value": 1
           }
         },
+        "ownSymbols": [],
         "ownPropertiesLength": 1,
+        "ownSymbolsLength": 0,
         "safeGetterValues": {}
       }
     }
   },
   "notes": null
 });
 
 stubPackets.set("longString message Error", {
--- a/devtools/server/actors/object.js
+++ b/devtools/server/actors/object.js
@@ -269,22 +269,24 @@ ObjectActor.prototype = {
                prototype: this.hooks.createValueGrip(null),
                ownProperties,
                ownSymbols,
                safeGetterValues: Object.create(null) };
     }
     for (let name of names) {
       ownProperties[name] = this._propertyDescriptor(name);
     }
+
     for (let sym of symbols) {
       ownSymbols.push({
         name: sym.toString(),
         descriptor: this._propertyDescriptor(sym)
       });
     }
+
     return { from: this.actorID,
              prototype: this.hooks.createValueGrip(this.obj.proto),
              ownProperties,
              ownSymbols,
              safeGetterValues: this._findSafeGetterValues(names) };
   },
 
   /**
@@ -1431,30 +1433,32 @@ function wrappedPrimitivePreviewer(class
 }
 
 function GenericObject(objectActor, grip, rawObj, specialStringBehavior = false) {
   let {obj, hooks} = objectActor;
   if (grip.preview || grip.displayString || hooks.getGripDepth() > 1) {
     return false;
   }
 
-  let i = 0, names = [];
+  let i = 0, names = [], symbols = [];
   let preview = grip.preview = {
     kind: "Object",
     ownProperties: Object.create(null),
+    ownSymbols: [],
   };
 
   try {
     names = obj.getOwnPropertyNames();
+    symbols = obj.getOwnPropertySymbols();
   } catch (ex) {
     // Calling getOwnPropertyNames() on some wrapped native prototypes is not
     // allowed: "cannot modify properties of a WrappedNative". See bug 952093.
   }
-
   preview.ownPropertiesLength = names.length;
+  preview.ownSymbolsLength = symbols.length;
 
   let length;
   if (specialStringBehavior) {
     length = DevToolsUtils.getProperty(obj, "length");
     if (typeof length != "number") {
       specialStringBehavior = false;
     }
   }
@@ -1473,16 +1477,31 @@ function GenericObject(objectActor, grip
     }
 
     preview.ownProperties[name] = desc;
     if (++i == OBJECT_PREVIEW_MAX_ITEMS) {
       break;
     }
   }
 
+  for (let symbol of symbols) {
+    let descriptor = objectActor._propertyDescriptor(symbol, true);
+    if (!descriptor) {
+      continue;
+    }
+
+    preview.ownSymbols.push(Object.assign({
+      descriptor
+    }, hooks.createValueGrip(symbol)));
+
+    if (++i == OBJECT_PREVIEW_MAX_ITEMS) {
+      break;
+    }
+  }
+
   if (i < OBJECT_PREVIEW_MAX_ITEMS) {
     preview.safeGetterValues = objectActor._findSafeGetterValues(
       Object.keys(preview.ownProperties),
       OBJECT_PREVIEW_MAX_ITEMS - i);
   }
 
   return true;
 }
--- a/devtools/server/tests/unit/test_objectgrips-16.js
+++ b/devtools/server/tests/unit/test_objectgrips-16.js
@@ -26,79 +26,122 @@ async function run_test_with_server(serv
 
   gClient = new DebuggerClient(server.connectPipe());
   await gClient.connect();
   const [,, threadClient] = await attachTestTabAndResume(gClient, "test-grips");
   gThreadClient = threadClient;
   test_symbol_grip();
 }
 
-function test_symbol_grip() {
-  gThreadClient.addOneTimeListener("paused", function (event, packet) {
-    let args = packet.frame.arguments;
-
-    do_check_eq(args[0].class, "Object");
-
-    let objClient = gThreadClient.pauseGrip(args[0]);
-    objClient.getPrototypeAndProperties(function (response) {
-      do_check_eq(response.ownProperties.x.configurable, true);
-      do_check_eq(response.ownProperties.x.enumerable, true);
-      do_check_eq(response.ownProperties.x.writable, true);
-      do_check_eq(response.ownProperties.x.value, 10);
+async function test_symbol_grip() {
+  gThreadClient.addOneTimeListener("paused", async function (event, packet) {
+    let [grip] = packet.frame.arguments;
 
-      const [
-        firstUnnamedSymbol,
-        secondUnnamedSymbol,
-        namedSymbol,
-        iteratorSymbol,
-      ] = response.ownSymbols;
-
-      do_check_eq(firstUnnamedSymbol.name, "Symbol()");
-      do_check_eq(firstUnnamedSymbol.descriptor.configurable, true);
-      do_check_eq(firstUnnamedSymbol.descriptor.enumerable, true);
-      do_check_eq(firstUnnamedSymbol.descriptor.writable, true);
-      do_check_eq(firstUnnamedSymbol.descriptor.value, "first unnamed symbol");
+    // Checks grip.preview properties.
+    check_preview(grip);
 
-      do_check_eq(secondUnnamedSymbol.name, "Symbol()");
-      do_check_eq(secondUnnamedSymbol.descriptor.configurable, true);
-      do_check_eq(secondUnnamedSymbol.descriptor.enumerable, true);
-      do_check_eq(secondUnnamedSymbol.descriptor.writable, true);
-      do_check_eq(secondUnnamedSymbol.descriptor.value, "second unnamed symbol");
-
-      do_check_eq(namedSymbol.name, "Symbol(named)");
-      do_check_eq(namedSymbol.descriptor.configurable, true);
-      do_check_eq(namedSymbol.descriptor.enumerable, true);
-      do_check_eq(namedSymbol.descriptor.writable, true);
-      do_check_eq(namedSymbol.descriptor.value, "named symbol");
+    let objClient = gThreadClient.pauseGrip(grip);
+    let response = await objClient.getPrototypeAndProperties();
+    // Checks the result of getPrototypeAndProperties.
+    check_prototype_and_properties(response);
 
-      do_check_eq(iteratorSymbol.name, "Symbol(Symbol.iterator)");
-      do_check_eq(iteratorSymbol.descriptor.configurable, true);
-      do_check_eq(iteratorSymbol.descriptor.enumerable, true);
-      do_check_eq(iteratorSymbol.descriptor.writable, true);
-      do_check_eq(iteratorSymbol.descriptor.value.class, "Function");
-
-      do_check_true(response.prototype != undefined);
-
-      let protoClient = gThreadClient.pauseGrip(response.prototype);
-      protoClient.getOwnPropertyNames(function (response) {
-        do_check_true(response.ownPropertyNames.toString != undefined);
-
-        gThreadClient.resume(function () {
-          gClient.close().then(gCallback);
-        });
-      });
-    });
+    await gThreadClient.resume();
+    await gClient.close();
+    gCallback();
   });
 
   gDebuggee.eval(`
     stopMe({
       [Symbol()]: "first unnamed symbol",
       [Symbol()]: "second unnamed symbol",
       [Symbol("named")] : "named symbol",
       [Symbol.iterator] : function* () {
         yield 1;
         yield 2;
       },
       x: 10,
     });
   `);
 }
 
+function check_preview(grip) {
+  do_check_eq(grip.class, "Object");
+
+  const {preview} = grip;
+  do_check_eq(preview.ownProperties.x.configurable, true);
+  do_check_eq(preview.ownProperties.x.enumerable, true);
+  do_check_eq(preview.ownProperties.x.writable, true);
+  do_check_eq(preview.ownProperties.x.value, 10);
+
+  const [
+    firstUnnamedSymbol,
+    secondUnnamedSymbol,
+    namedSymbol,
+    iteratorSymbol,
+  ] = preview.ownSymbols;
+
+  do_check_eq(firstUnnamedSymbol.name, undefined);
+  do_check_eq(firstUnnamedSymbol.type, "symbol");
+  do_check_eq(firstUnnamedSymbol.descriptor.configurable, true);
+  do_check_eq(firstUnnamedSymbol.descriptor.enumerable, true);
+  do_check_eq(firstUnnamedSymbol.descriptor.writable, true);
+  do_check_eq(firstUnnamedSymbol.descriptor.value, "first unnamed symbol");
+
+  do_check_eq(secondUnnamedSymbol.name, undefined);
+  do_check_eq(secondUnnamedSymbol.type, "symbol");
+  do_check_eq(secondUnnamedSymbol.descriptor.configurable, true);
+  do_check_eq(secondUnnamedSymbol.descriptor.enumerable, true);
+  do_check_eq(secondUnnamedSymbol.descriptor.writable, true);
+  do_check_eq(secondUnnamedSymbol.descriptor.value, "second unnamed symbol");
+
+  do_check_eq(namedSymbol.name, "named");
+  do_check_eq(namedSymbol.type, "symbol");
+  do_check_eq(namedSymbol.descriptor.configurable, true);
+  do_check_eq(namedSymbol.descriptor.enumerable, true);
+  do_check_eq(namedSymbol.descriptor.writable, true);
+  do_check_eq(namedSymbol.descriptor.value, "named symbol");
+
+  do_check_eq(iteratorSymbol.name, "Symbol.iterator");
+  do_check_eq(iteratorSymbol.type, "symbol");
+  do_check_eq(iteratorSymbol.descriptor.configurable, true);
+  do_check_eq(iteratorSymbol.descriptor.enumerable, true);
+  do_check_eq(iteratorSymbol.descriptor.writable, true);
+  do_check_eq(iteratorSymbol.descriptor.value.class, "Function");
+}
+
+function check_prototype_and_properties(response) {
+  do_check_eq(response.ownProperties.x.configurable, true);
+  do_check_eq(response.ownProperties.x.enumerable, true);
+  do_check_eq(response.ownProperties.x.writable, true);
+  do_check_eq(response.ownProperties.x.value, 10);
+
+  const [
+    firstUnnamedSymbol,
+    secondUnnamedSymbol,
+    namedSymbol,
+    iteratorSymbol,
+  ] = response.ownSymbols;
+
+  do_check_eq(firstUnnamedSymbol.name, "Symbol()");
+  do_check_eq(firstUnnamedSymbol.descriptor.configurable, true);
+  do_check_eq(firstUnnamedSymbol.descriptor.enumerable, true);
+  do_check_eq(firstUnnamedSymbol.descriptor.writable, true);
+  do_check_eq(firstUnnamedSymbol.descriptor.value, "first unnamed symbol");
+
+  do_check_eq(secondUnnamedSymbol.name, "Symbol()");
+  do_check_eq(secondUnnamedSymbol.descriptor.configurable, true);
+  do_check_eq(secondUnnamedSymbol.descriptor.enumerable, true);
+  do_check_eq(secondUnnamedSymbol.descriptor.writable, true);
+  do_check_eq(secondUnnamedSymbol.descriptor.value, "second unnamed symbol");
+
+  do_check_eq(namedSymbol.name, "Symbol(named)");
+  do_check_eq(namedSymbol.descriptor.configurable, true);
+  do_check_eq(namedSymbol.descriptor.enumerable, true);
+  do_check_eq(namedSymbol.descriptor.writable, true);
+  do_check_eq(namedSymbol.descriptor.value, "named symbol");
+
+  do_check_eq(iteratorSymbol.name, "Symbol(Symbol.iterator)");
+  do_check_eq(iteratorSymbol.descriptor.configurable, true);
+  do_check_eq(iteratorSymbol.descriptor.enumerable, true);
+  do_check_eq(iteratorSymbol.descriptor.writable, true);
+  do_check_eq(iteratorSymbol.descriptor.value.class, "Function");
+}
+