2016-07-29 11 views
1

Ich sehe zufällig Code von babel.js generiert. Der Original-Quellcode ist wie folgt:Warum Babel.js Generator in nicht-sequentiellen Switch-Fall transformieren?

function * foo() { 
    yield 1; 
    yield 2; 
    yield 3; 
} 

Der erzeugte ES5-Code ist wie:

"use strict"; 

var _marked = [foo].map(regeneratorRuntime.mark); 

function foo() { 
    return regeneratorRuntime.wrap(function foo$(_context) { 
    while (1) { 
     switch (_context.prev = _context.next) { 
     case 0: 
      _context.next = 2; 
      return 1; 

     case 2: 
      _context.next = 4; 
      return 2; 

     case 4: 
      _context.next = 6; 
      return 3; 

     case 6: 
     case "end": 
      return _context.stop(); 
     } 
    } 
    }, _marked[0], this); 
} 

Meine Frage ist: warum der erzeugte Fallwert ist 0, 2, 4 und 6 anstelle von 0, 1, 2, 3?

Gibt es Gründe für dieses Design?

+0

Ich denke, um diese Frage zu beantworten, sollten Sie nur die Quelle lesen. – Bergi

+0

Der Quellcode ist hier https://github.com/babel/babel/tree/master/packages/babel-plugin-transforme-regenerator, aber ehrlich gesagt ist es schwer, die Bedeutung davon zu verstehen. –

Antwort

2

Warum ist der generierte Fall Wert 0, 2, 4 und 6 statt 0, 1, 2, 3?

Die Fallwerte sind nicht wirklich wichtig, sie sind nicht fortlaufend nummeriert, weil einige von ihnen weggelassen wurden. Der Code wird generiert here, wo Fälle nur in der Auflistung eingefügt werden, wenn sie markiert sind. Was das bedeutet, ist even commented:

// A sparse array whose keys correspond to locations in this.listing 
// that have been marked as branch/jump targets. 
this.marked = [true]; 

Die Auflistung nur eine Liste von Aussagen ist - in der Tat sehr viel die Aussagen Sie in der Ausgabe zu sehen. Für den jeweiligen Code in Ihrer Frage, jedes Mal ein yield expression is encountered, es does emit eine Zuordnung zu context.next und die tatsächliche Rückgabeanweisung mit dem gewonnenen Wert, und markiert die nächste Anweisung als Sprungziel. Hier kommen deine Zahlen her. Wenn Sie einige Zeilen hinzufügen, ändern sie sich.

Verwandte Themen