diff options
author | Jukka Jylänki <jujjyl@gmail.com> | 2013-09-27 22:53:25 +0300 |
---|---|---|
committer | Jukka Jylänki <jujjyl@gmail.com> | 2013-12-20 11:49:32 +0200 |
commit | 184a425ce07a95e882f3f60b87c1c5037cbffec5 (patch) | |
tree | 25514d7efba73ca73fc36a6eca462ff78154ea0e /src | |
parent | 26d6ad370e05ff22128df6f0ff17538c8bc1030c (diff) |
Also give the ability to print out function parameters in the callstack with emscripten_get_callstack.
Diffstat (limited to 'src')
-rw-r--r-- | src/library.js | 50 |
1 files changed, 48 insertions, 2 deletions
diff --git a/src/library.js b/src/library.js index 6d235e2a..1a4d685a 100644 --- a/src/library.js +++ b/src/library.js @@ -8860,8 +8860,37 @@ LibraryManager.library = { STACKTOP = sp; return str; }, - - emscripten_get_callstack_js__deps: ['emscripten_demangle'], + + // Returns [parentFuncArguments, functionName, paramListName] + _emscripten_traverse_stack: function(args) { + if (!args || !args.callee || !args.callee.name) { + return [null, '', '']; + } + + var funstr = args.callee.toString(); + var funcname = args.callee.name; + var str = '('; + var first = true; + for(i in args) { + var a = args[i]; + if (!first) { + str += ", "; + } + first = false; + if (typeof a === 'number' || typeof a === 'string') { + str += a; + } else { + str += '(' + typeof a + ')'; + } + } + str += ')'; + args = args.callee.caller.arguments; + if (first) + str = ''; + return [args, funcname, str]; + }, + + emscripten_get_callstack_js__deps: ['emscripten_demangle', '_emscripten_traverse_stack'], emscripten_get_callstack_js: function(flags) { var err = new Error(); if (!err.stack) { @@ -8883,6 +8912,14 @@ LibraryManager.library = { flags |= 16/*EM_LOG_JS_STACK*/; } + var stack_args = null; + if (flags & 128 /*EM_LOG_FUNC_PARAMS*/) { + // To get the actual parameters to the functions, traverse the stack via the unfortunately deprecated 'arguments.callee' method, if it works: + var stack_args = __emscripten_traverse_stack(arguments); + while (stack_args[1].indexOf('_emscripten_') >= 0) + stack_args = __emscripten_traverse_stack(stack_args[0]); + } + // Process all lines: lines = callstack.split('\n'); callstack = ''; @@ -8941,6 +8978,15 @@ LibraryManager.library = { } callstack += (haveSourceMap ? (' = '+jsSymbolName) : (' at '+cSymbolName)) + ' (' + file + ':' + lineno + ':' + column + ')\n'; } + + // If we are still keeping track with the callstack by traversing via 'arguments.callee', print the function parameters as well. + if (flags & 128 /*EM_LOG_FUNC_PARAMS*/ && stack_args[0]) { + if (stack_args[1] == jsSymbolName && stack_args[2].length > 0) { + callstack = callstack.replace(/\s+$/, ''); + callstack += ' with values: ' + stack_args[1] + stack_args[2] + '\n'; + } + stack_args = __emscripten_traverse_stack(stack_args[0]); + } } // Trim extra whitespace at the end of the output. callstack = callstack.replace(/\s+$/, ''); |