From f9014438c79b06d222df861f87e9af3cb919e495 Mon Sep 17 00:00:00 2001 From: Brandon Benvie Date: Mon, 14 Nov 2011 15:42:14 -0500 Subject: [PATCH] util: use getOwnPropertyDescripter Change formatProperty in util.js to use Object.getOwnPropertyDescriptor instead of __lookup[GS]etter__. Use the cached value from the descriptor to reduce number of property lookups from 3 to 1. Fallback to standard lookup if the descriptor is empty. This doesn't ever happen with normal JS objects (this function is called only when the key exists) but apparently does with Node's custom ENV interface. Fixes: #2109. --- lib/util.js | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/lib/util.js b/lib/util.js index cd4cc0e9645..6e410d98aef 100644 --- a/lib/util.js +++ b/lib/util.js @@ -296,29 +296,28 @@ function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { - var name, str; - if (value.__lookupGetter__) { - if (value.__lookupGetter__(key)) { - if (value.__lookupSetter__(key)) { - str = ctx.stylize('[Getter/Setter]', 'special'); - } else { - str = ctx.stylize('[Getter]', 'special'); - } + var name, str, desc; + desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] }; + if (desc.get) { + if (desc.set) { + str = ctx.stylize('[Getter/Setter]', 'special'); } else { - if (value.__lookupSetter__(key)) { - str = ctx.stylize('[Setter]', 'special'); - } + str = ctx.stylize('[Getter]', 'special'); + } + } else { + if (desc.set) { + str = ctx.stylize('[Setter]', 'special'); } } if (visibleKeys.indexOf(key) < 0) { name = '[' + key + ']'; } if (!str) { - if (ctx.seen.indexOf(value[key]) < 0) { + if (ctx.seen.indexOf(desc.value) < 0) { if (recurseTimes === null) { - str = formatValue(ctx, value[key], null); + str = formatValue(ctx, desc.value, null); } else { - str = formatValue(ctx, value[key], recurseTimes - 1); + str = formatValue(ctx, desc.value, recurseTimes - 1); } if (str.indexOf('\n') > -1) { if (array) {