Home | History | Annotate | Download | only in turbolizer
      1 // Copyright 2015 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 var SelectionBroker = function() {
      6   this.brokers = [];
      7   this.dispatching = false;
      8   this.lastDispatchingHandler = null;
      9   this.nodePositionMap = [];
     10   this.sortedPositionList = [];
     11   this.positionNodeMap = [];
     12 };
     13 
     14 SelectionBroker.prototype.addSelectionHandler = function(handler) {
     15   this.brokers.push(handler);
     16 }
     17 
     18 SelectionBroker.prototype.setNodePositionMap = function(map) {
     19   let broker = this;
     20   if (!map) return;
     21   broker.nodePositionMap = map;
     22   broker.positionNodeMap = [];
     23   broker.sortedPositionList = [];
     24   let next = 0;
     25   for (let i in broker.nodePositionMap) {
     26     broker.sortedPositionList[next] = Number(broker.nodePositionMap[i]);
     27     broker.positionNodeMap[next++] = i;
     28   }
     29   broker.sortedPositionList = sortUnique(broker.sortedPositionList,
     30                                        function(a,b) { return a - b; });
     31   this.positionNodeMap.sort(function(a,b) {
     32     let result = broker.nodePositionMap[a] - broker.nodePositionMap[b];
     33     if (result != 0) return result;
     34     return a - b;
     35   });
     36 }
     37 
     38 SelectionBroker.prototype.select = function(from, locations, selected) {
     39   let broker = this;
     40   if (!broker.dispatching) {
     41     broker.lastDispatchingHandler = from;
     42     try {
     43       broker.dispatching = true;
     44       let enrichLocations = function(locations) {
     45         result = [];
     46         for (let location of locations) {
     47           let newLocation = {};
     48           if (location.pos_start != undefined) {
     49             newLocation.pos_start = location.pos_start;
     50           }
     51           if (location.pos_end != undefined) {
     52             newLocation.pos_end = location.pos_end;
     53           }
     54           if (location.node_id != undefined) {
     55             newLocation.node_id = location.node_id;
     56           }
     57           if (location.block_id != undefined) {
     58             newLocation.block_id = location.block_id;
     59           }
     60           if (newLocation.pos_start == undefined &&
     61               newLocation.pos_end == undefined &&
     62               newLocation.node_id != undefined) {
     63             if (broker.nodePositionMap && broker.nodePositionMap[location.node_id]) {
     64               newLocation.pos_start = broker.nodePositionMap[location.node_id];
     65               newLocation.pos_end = location.pos_start + 1;
     66             }
     67           }
     68           result.push(newLocation);
     69         }
     70         return result;
     71       }
     72       locations = enrichLocations(locations);
     73       for (var b of this.brokers) {
     74         if (b != from) {
     75           b.brokeredSelect(locations, selected);
     76         }
     77       }
     78     }
     79     finally {
     80       broker.dispatching = false;
     81     }
     82   }
     83 }
     84 
     85 SelectionBroker.prototype.clear = function(from) {
     86   this.lastDispatchingHandler = null;
     87   if (!this.dispatching) {
     88     try {
     89       this.dispatching = true;
     90       this.brokers.forEach(function(b) {
     91         if (b != from) {
     92           b.brokeredClear();
     93         }
     94       });
     95     } finally {
     96       this.dispatching = false;
     97     }
     98   }
     99 }
    100