1 // Copyright 2014 the V8 project authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 // Flags: --expose-debug-as debug 6 // Test the mirror object for functions. 7 8 function *generator(f) { 9 "use strict"; 10 yield; 11 f(); 12 yield; 13 } 14 15 function MirrorRefCache(json_refs) { 16 var tmp = eval('(' + json_refs + ')'); 17 this.refs_ = []; 18 for (var i = 0; i < tmp.length; i++) { 19 this.refs_[tmp[i].handle] = tmp[i]; 20 } 21 } 22 23 MirrorRefCache.prototype.lookup = function(handle) { 24 return this.refs_[handle]; 25 } 26 27 function TestGeneratorMirror(g, status, line, column, receiver) { 28 // Create mirror and JSON representation. 29 var mirror = debug.MakeMirror(g); 30 var serializer = debug.MakeMirrorSerializer(); 31 var json = JSON.stringify(serializer.serializeValue(mirror)); 32 var refs = new MirrorRefCache( 33 JSON.stringify(serializer.serializeReferencedObjects())); 34 35 // Check the mirror hierachy. 36 assertTrue(mirror instanceof debug.Mirror); 37 assertTrue(mirror instanceof debug.ValueMirror); 38 assertTrue(mirror instanceof debug.ObjectMirror); 39 assertTrue(mirror instanceof debug.GeneratorMirror); 40 41 // Check the mirror properties. 42 assertTrue(mirror.isGenerator()); 43 assertEquals('generator', mirror.type()); 44 assertFalse(mirror.isPrimitive()); 45 assertEquals('Generator', mirror.className()); 46 47 assertEquals(receiver, mirror.receiver().value()); 48 assertEquals(generator, mirror.func().value()); 49 50 assertEquals(status, mirror.status()); 51 52 // Note that line numbers are 0-based, not 1-based. 53 var loc = mirror.sourceLocation(); 54 if (status === 'suspended') { 55 assertTrue(!!loc); 56 assertEquals(line, loc.line); 57 assertEquals(column, loc.column); 58 } else { 59 assertEquals(undefined, loc); 60 } 61 62 TestInternalProperties(mirror, status, receiver); 63 } 64 65 function TestInternalProperties(mirror, status, receiver) { 66 var properties = mirror.internalProperties(); 67 assertEquals(3, properties.length); 68 assertEquals("[[GeneratorStatus]]", properties[0].name()); 69 assertEquals(status, properties[0].value().value()); 70 assertEquals("[[GeneratorFunction]]", properties[1].name()); 71 assertEquals(generator, properties[1].value().value()); 72 assertEquals("[[GeneratorReceiver]]", properties[2].name()); 73 assertEquals(receiver, properties[2].value().value()); 74 } 75 76 var iter = generator(function() { 77 var mirror = debug.MakeMirror(iter); 78 assertEquals('running', mirror.status()); 79 assertEquals(undefined, mirror.sourceLocation()); 80 TestInternalProperties(mirror, 'running'); 81 }); 82 83 TestGeneratorMirror(iter, 'suspended', 7, 19); 84 85 iter.next(); 86 TestGeneratorMirror(iter, 'suspended', 9, 2); 87 88 iter.next(); 89 TestGeneratorMirror(iter, 'suspended', 11, 2); 90 91 iter.next(); 92 TestGeneratorMirror(iter, 'closed'); 93 94 // Test generator with receiver. 95 var obj = {foo: 42}; 96 var iter2 = generator.call(obj, function() { 97 var mirror = debug.MakeMirror(iter2); 98 assertEquals('running', mirror.status()); 99 assertEquals(undefined, mirror.sourceLocation()); 100 TestInternalProperties(mirror, 'running', obj); 101 }); 102 103 TestGeneratorMirror(iter2, 'suspended', 7, 19, obj); 104 105 iter2.next(); 106 TestGeneratorMirror(iter2, 'suspended', 9, 2, obj); 107 108 iter2.next(); 109 TestGeneratorMirror(iter2, 'suspended', 11, 2, obj); 110 111 iter2.next(); 112 TestGeneratorMirror(iter2, 'closed', 0, 0, obj); 113