Guest User

Untitled

a guest
Apr 25th, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.00 KB | None | 0 0
  1. From a0db2d73d6d6099c5bc810d60bcce192c6d81dbe Mon Sep 17 00:00:00 2001
  2. From: Xavier Shay <xavier@rhnh.net>
  3. Date: Tue, 1 Dec 2009 21:20:14 +1100
  4. Subject: [PATCH] sys.inspect is totally more awesome now:
  5. - No longer relies on JSON.stringify, so it can output nulls and functions
  6. - Handles circular references better
  7. - Has tests
  8.  
  9. ---
  10. lib/sys.js | 84 +++++++++++++++++++++++++++++++++++-----------
  11. test/mjsunit/test-sys.js | 26 ++++++++++++++
  12. 2 files changed, 90 insertions(+), 20 deletions(-)
  13. create mode 100644 test/mjsunit/test-sys.js
  14.  
  15. diff --git a/lib/sys.js b/lib/sys.js
  16. index da749db..16e2606 100644
  17. --- a/lib/sys.js
  18. +++ b/lib/sys.js
  19. @@ -17,26 +17,11 @@ exports.error = function (x) {
  20. /**
  21. * Echos the value of a value. Trys to print the value out
  22. * in the best way possible given the different types.
  23. - *
  24. + *
  25. * @param {Object} value The object to print out
  26. */
  27. exports.inspect = function (value) {
  28. - if (value === 0) return "0";
  29. - if (value === false) return "false";
  30. - if (value === "") return '""';
  31. - if (typeof(value) == "function") return "[Function]";
  32. - if (value === undefined) return;
  33. -
  34. - try {
  35. - return JSON.stringify(value, undefined, 1);
  36. - } catch (e) {
  37. - // TODO make this recusrive and do a partial JSON output of object.
  38. - if (e.message.search("circular")) {
  39. - return "[Circular Object]";
  40. - } else {
  41. - throw e;
  42. - }
  43. - }
  44. + return formatter(value, '', []);
  45. };
  46.  
  47. exports.p = function (x) {
  48. @@ -50,13 +35,13 @@ exports.exec = function (command) {
  49. var promise = new process.Promise();
  50.  
  51. child.addListener("output", function (chunk) {
  52. - if (chunk) stdout += chunk;
  53. + if (chunk) stdout += chunk;
  54. });
  55.  
  56. child.addListener("error", function (chunk) {
  57. - if (chunk) stderr += chunk;
  58. + if (chunk) stderr += chunk;
  59. });
  60. -
  61. +
  62. child.addListener("exit", function (code) {
  63. if (code == 0) {
  64. promise.emitSuccess(stdout, stderr);
  65. @@ -88,3 +73,62 @@ exports.inherits = function (ctor, superCtor) {
  66. ctor.prototype = new tempCtor();
  67. ctor.prototype.constructor = ctor;
  68. };
  69. +
  70. +/**
  71. + * A recursive function to format an object - used by inspect.
  72. + *
  73. + * @param {Object} value
  74. + * the value to format
  75. + * @param {String} indent
  76. + * the indent level of any nested objects, since they are formatted over
  77. + * more than one line
  78. + * @param {Array} parents
  79. + * contains all objects above the current one in the heirachy, used to
  80. + * prevent getting stuck in a loop on circular references
  81. + */
  82. +var formatter = function(value, indent, parents) {
  83. + switch(typeof(value)) {
  84. + case 'string': return '"' + value + '"';
  85. + case 'number': return '' + value;
  86. + case 'function': return '[Function]';
  87. + case 'boolean': return '' + value;
  88. + case 'undefined': return 'undefined';
  89. + case 'object':
  90. + if (value == null) return 'null';
  91. + if (parents.indexOf(value) >= 0) return '[Circular]';
  92. + parents.push(value);
  93. +
  94. + if (value instanceof Array) {
  95. + return formatObject(value, indent, parents, '[]', function(x, f) {
  96. + return f(value[x]);
  97. + });
  98. + } else {
  99. + return formatObject(value, indent, parents, '{}', function(x, f) {
  100. + return f(x) + ': ' + f(value[x]);
  101. + });
  102. + }
  103. + return buffer;
  104. + default:
  105. + throw('inspect unimplemented for ' + typeof(value));
  106. + }
  107. +}
  108. +
  109. +/**
  110. + * Helper function for formatting either an array or an object, used internally by formatter
  111. + */
  112. +var formatObject = function(obj, indent, parents, parenthesis, entryFormatter) {
  113. + var buffer = parenthesis[0];
  114. + var values = [];
  115. +
  116. + var localFormatter = function(value) {
  117. + return formatter(value, indent + ' ', parents);
  118. + };
  119. + for (x in obj) {
  120. + values.push(indent + ' ' + entryFormatter(x, localFormatter));
  121. + }
  122. + if (values.length > 0) {
  123. + buffer += "\n" + values.join(",\n") + "\n" + indent;
  124. + }
  125. + buffer += parenthesis[1];
  126. + return buffer;
  127. +}
  128. diff --git a/test/mjsunit/test-sys.js b/test/mjsunit/test-sys.js
  129. new file mode 100644
  130. index 0000000..8a0aa35
  131. --- /dev/null
  132. +++ b/test/mjsunit/test-sys.js
  133. @@ -0,0 +1,26 @@
  134. +process.mixin(require("./common"));
  135. +process.mixin(require("sys"));
  136. +
  137. +assertEquals("0", inspect(0));
  138. +assertEquals("1", inspect(1));
  139. +assertEquals("false", inspect(false));
  140. +assertEquals('""', inspect(""));
  141. +assertEquals('"hello"', inspect("hello"));
  142. +assertEquals("[Function]", inspect(function() {}));
  143. +assertEquals('undefined', inspect(undefined));
  144. +assertEquals('null', inspect(null));
  145. +
  146. +assertEquals('[]', inspect([]));
  147. +assertEquals('[\n 1,\n 2\n]', inspect([1, 2]));
  148. +assertEquals('[\n 1,\n [\n 2,\n 3\n ]\n]', inspect([1, [2, 3]]));
  149. +
  150. +assertEquals('{}', inspect({}));
  151. +assertEquals('{\n "a": 1\n}', inspect({a: 1}));
  152. +assertEquals('{\n "a": [Function]\n}', inspect({a: function() {}}));
  153. +assertEquals('{\n "a": 1,\n "b": 2\n}', inspect({a: 1, b: 2}));
  154. +assertEquals('{\n "a": {}\n}', inspect({'a': {}}));
  155. +assertEquals('{\n "a": {\n "b": 2\n }\n}', inspect({'a': {'b': 2}}));
  156. +
  157. +var value = {}
  158. +value['a'] = value;
  159. +assertEquals('{\n "a": [Circular]\n}', inspect(value));
  160. --
  161. 1.6.2.4
Add Comment
Please, Sign In to add comment