forked from alibaba/nquery
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathtopology.js
102 lines (91 loc) · 2.12 KB
/
topology.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
// (C) 2011-2013 Alibaba Group Holding Limited.
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// version 2 as published by the Free Software Foundation.
// Author :windyrobin <[email protected]>
var Tool = require('../lib/tool');
exports.order = order;
function debug(str) {
//console.log(str);
}
function inspect(obj) {
//console.log(require('util').inspect(obj, false, 10));
}
function order(stmts) {
var i, j, o, v, s;
var rs, ds;
var nodes = [];
var deps = [];
for (i = 0; i < stmts.length; i++) {
s = stmts[i];
deps = [];
if (s.stmt && s.stmt.type == 'assign') {
v = s.vars[0];
ds = s.vars;
for (j = 0; j < ds.length; j++) {
if (ds[j] != v) deps.push(ds[j]);
}
} else if (s.stmt && s.stmt.type == 'return') {
if (i != stmts.length -1 ) {
throw new Error('return statement should be the LAST');
}
v = '__return';
deps = s.vars;
//hack the last return format
var nr = {};
nr.type = 'assign';
nr.left = {
type : 'var',
name : '__return',
members : []
};
nr.right = s.stmt.expr;
stmts[i].stmt = nr;
}
o = {
'var' : v,
'deps': deps
};
nodes.push(o);
}
//debug('nodes');
//inspect(nodes);
//inspect(stmts);
//do orders
var ok;
var sts = {};
var seqs = [];
var arr = [];
for (i = 0; i < nodes.length;) {
o = nodes[i];
deps = o.deps;
ok = true;
for (j = 0; j < deps.length; j++) {
if (sts[deps[j]] != true) {
ok = false;
break;
}
}
//debug('i : ' + i + ', ok :' + ok);
if (ok) {
arr.push(stmts[i].stmt);
i++;
} else {
if (arr.length > 0) {
seqs.push(arr);
for (j = 0; j < i; j++) {
o = nodes[j];
v = o['var'];
sts[v] = true;
}
arr = [];
} else {
throw new Error('can\'t decide order for : ' + o['var']);
}
}
}
if (arr.length > 0) {
seqs.push(arr);
}
return seqs;
}