Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nodejs/node.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFedor Indutny <fedor@indutny.com>2016-09-10 16:05:30 +0300
committerFedor Indutny <fedor@indutny.com>2016-09-13 13:47:20 +0300
commit15d72c8365717e1ccbca4f3bdc388315ba10bc92 (patch)
treecacff42c4c6b25ab9fb291a2713b9698c6688abc /lib/internal/v8_prof_polyfill.js
parent7f2c9ba1ac343ebdd3d4fbe27757847555bf141d (diff)
tickprocessor: apply c++filt manually on mac
`/bin/sh -c` trick wasn't working for several reasons: * `/bin/sh -c "..."` expects the first argument after `"..."` to be a `$0`, not a `$1`. Previously `-n` wasn't passed to `nm` because of this, and many symbols were ordered improperly * `c++filt` was applied not only to the names of the functions but to their `nm` prefixes like `t` and `a` (`t xxx` turns into `unsigned char xxx`). Instead of applying `c++filt` wide and using `sh -c`, execute `nm` as requested by `deps/v8/tools/tickprocessor.js` and apply `c++filt` to all matching entries manually. Included test demonstrates where previous approach failed: all builtins were merged into `v8::internal::Builtins::~Builtins`, because they were prefixed by `t` in `nm` output. PR-URL: https://github.com/nodejs/node/pull/8480 Reviewed-By: Matthew Loring <mattloring@google.com>
Diffstat (limited to 'lib/internal/v8_prof_polyfill.js')
-rw-r--r--lib/internal/v8_prof_polyfill.js36
1 files changed, 32 insertions, 4 deletions
diff --git a/lib/internal/v8_prof_polyfill.js b/lib/internal/v8_prof_polyfill.js
index 145b09e345b..eed927f12a9 100644
--- a/lib/internal/v8_prof_polyfill.js
+++ b/lib/internal/v8_prof_polyfill.js
@@ -38,11 +38,12 @@ const os = {
/^[0-9a-f]+-[0-9a-f]+$/.test(arg)) {
return '';
}
- } else if (process.platform === 'darwin') {
- args.unshift('-c', name);
- name = '/bin/sh';
}
- return cp.spawnSync(name, args).stdout.toString();
+ let out = cp.spawnSync(name, args).stdout.toString();
+ // Auto c++filt names, but not [iItT]
+ if (process.platform === 'darwin' && name === 'nm')
+ out = macCppfiltNm(out);
+ return out;
}
};
const print = console.log;
@@ -100,3 +101,30 @@ function versionCheck() {
}
}
}
+
+function macCppfiltNm(out) {
+ // Re-grouped copy-paste from `tickprocessor.js`
+ const FUNC_RE = /^([0-9a-fA-F]{8,16} [iItT] )(.*)$/gm;
+ let entries = out.match(FUNC_RE);
+ if (entries === null)
+ return out;
+
+ entries = entries.map((entry) => {
+ return entry.replace(/^[0-9a-fA-F]{8,16} [iItT] /, '')
+ });
+
+ let filtered;
+ try {
+ filtered = cp.spawnSync('c++filt', [ '-p' , '-i' ], {
+ input: entries.join('\n')
+ }).stdout.toString();
+ } catch (e) {
+ return out;
+ }
+
+ let i = 0;
+ filtered = filtered.split(/\n/g);
+ return out.replace(FUNC_RE, (all, prefix, postfix) => {
+ return prefix + (filtered[i++] || postfix);
+ });
+}