-
Notifications
You must be signed in to change notification settings - Fork 1
/
index.js
68 lines (55 loc) · 1.41 KB
/
index.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
'use strict'
const sorted = require('sorted-array-functions')
const pump = require('pump')
const through = require('through2').obj
const createLoader = require('./' + process.platform)
const { PROCESSED } = require('../constants')
module.exports = createLoadSymbols
function createLoadSymbols (state) {
const { opts } = state
const load = createLoader(opts)
return loadSymbols
function loadSymbols (lib, cb) {
if (lib[PROCESSED] === true) {
cb()
return
}
const { start, end, slide } = lib
const startn = parseInt(start, 16)
const endn = parseInt(end, 16)
const sliden = parseInt(slide, 10)
pump(load(lib), through(({ addr, name }, _, next) => {
// undefined symbols:
if (!addr) {
next()
return
}
var addrn = parseInt(addr, 16)
if (addrn === 0) {
next()
return
}
addrn += (
(addrn < startn - sliden && addrn < endn - startn)
? startn
: sliden
)
// duplicates (names may differ slightly...)
if (addrn in state.code && state.code[addrn].name.length >= name.length) {
next()
return
}
state.code[addrn] = {
name: name,
lib: lib,
start: '0x' + addrn.toString(16),
type: 'CPP'
}
sorted.add(state.addresses, addrn)
next()
}), (err) => {
lib[PROCESSED] = true
cb(err)
})
}
}