diff --git a/lib/util.js b/lib/util.js index f8b7cc5..ad42769 100644 --- a/lib/util.js +++ b/lib/util.js @@ -80,6 +80,8 @@ exports.secureFallback = function( val ) } secure_fallback = !!val; + exports.defineSecureProp = getDefineSecureProp(); + return exports; }; @@ -96,32 +98,7 @@ exports.secureFallback = function( val ) * * @return {undefined} */ -exports.defineSecureProp = function( obj, prop, value ) -{ - if ( secure_fallback ) - { - obj[ prop ] = value; - } - else - { - try - { - Object.defineProperty( obj, prop, - { - value: value, - - enumerable: false, - writable: false, - configurable: false, - }); - } - catch ( e ) - { - // if there's an error (ehem, IE8), fall back - obj[ prop ] = value; - } - } -} +exports.defineSecureProp = getDefineSecureProp(); /** @@ -479,3 +456,51 @@ exports.arrayShrink = function( items ) return arr_new; } + +/** + * Appropriately returns defineSecureProp implementation to avoid check on each + * invocation + * + * @return {function( Object, string, * )} + */ +function getDefineSecureProp() +{ + // falls back to simply defining a normal property + var fallback = function( obj, prop, value ) + { + obj[ prop ] = value; + }; + + if ( secure_fallback ) + { + return fallback; + } + else + { + // uses ECMAScript 5's Object.defineProperty() method + return function( obj, prop, value ) + { + try + { + Object.defineProperty( obj, prop, + { + value: value, + + enumerable: false, + writable: false, + configurable: false, + }); + } + catch ( e ) + { + // let's not have this happen again, as repeatedly throwing + // exceptions will do nothing but slow down the system + exports.secureFallback( true ); + + // if there's an error (ehem, IE8), fall back + fallback( obj, prop, value ); + } + }; + } +} + diff --git a/test/common.js b/test/common.js index f432d64..c6967d7 100644 --- a/test/common.js +++ b/test/common.js @@ -22,5 +22,25 @@ * @package test */ -require.paths.unshift( __dirname + '/../lib' ); +/** + * Library path + * @type {string} + */ +exports.PATH_LIB = require( 'path' ).normalize( __dirname + '/../lib' ); + + +/** + * Returns requested module from the library path + * + * This method abstracts require() implementation so that the tests may be more + * easily implemented elsewhere (e.g. client-side) + * + * @param {string} module module id + * + * @return {Object} module exports + */ +exports.require = function( module ) +{ + return require( exports.PATH_LIB + '/' + module ); +} diff --git a/test/test-class-abstract.js b/test/test-class-abstract.js index 732ec7f..b8eb4ce 100644 --- a/test/test-class-abstract.js +++ b/test/test-class-abstract.js @@ -22,12 +22,11 @@ * @package test */ -require( './common' ); - -var assert = require( 'assert' ), - Class = require( '../lib/class' ), - abstractMethod = require( '../lib/class' ).abstractMethod, - util = require( '../lib/util' ); +var common = require( './common' ), + assert = require( 'assert' ), + Class = common.require( 'class' ), + abstractMethod = common.require( 'class' ).abstractMethod, + util = common.require( 'util' ); // not abstract var Foo = Class.extend( {} ); diff --git a/test/test-class-constructor.js b/test/test-class-constructor.js index dc792d9..86f7db2 100644 --- a/test/test-class-constructor.js +++ b/test/test-class-constructor.js @@ -22,10 +22,9 @@ * @package test */ -require( './common' ); - -var assert = require( 'assert' ), - Class = require( 'class' ); +var common = require( './common' ), + assert = require( 'assert' ), + Class = common.require( 'class' ); // these two variables are declared outside of the class to ensure that they // will still be set even if the context of the constructor is wrong diff --git a/test/test-class-extend.js b/test/test-class-extend.js index 92771bd..3a5f3f3 100644 --- a/test/test-class-extend.js +++ b/test/test-class-extend.js @@ -22,10 +22,9 @@ * @package test */ -require( './common' ); - -var assert = require( 'assert' ), - Class = require( 'class' ); +var common = require( './common' ), + assert = require( 'assert' ), + Class = common.require( 'class' ); var foo_props = { one: 1, diff --git a/test/test-class-gettersetter.js b/test/test-class-gettersetter.js index 5d2d663..2dd5672 100644 --- a/test/test-class-gettersetter.js +++ b/test/test-class-gettersetter.js @@ -28,10 +28,9 @@ if ( Object.prototype.__defineGetter__ === undefined ) return; } -require( './common' ); - -var assert = require( 'assert' ), - Class = require( 'class' ); +var common = require( './common' ), + assert = require( 'assert' ), + Class = common.require( 'class' ); var Foo = Class.extend( diff --git a/test/test-class-parent.js b/test/test-class-parent.js index e05be78..8744957 100644 --- a/test/test-class-parent.js +++ b/test/test-class-parent.js @@ -22,10 +22,9 @@ * @package test */ -require( './common' ); - -var assert = require( 'assert' ), - Class = require( 'class' ); +var common = require( './common' ), + assert = require( 'assert' ), + Class = common.require( 'class' ); var Foo = Class.extend( { diff --git a/test/test-class.js b/test/test-class.js index 1e29952..c5bf524 100644 --- a/test/test-class.js +++ b/test/test-class.js @@ -22,10 +22,9 @@ * @package test */ -require( './common' ); - -var assert = require( 'assert' ), - Class = require( 'class' ); +var common = require( './common' ), + assert = require( 'assert' ), + Class = common.require( 'class' ); assert.ok( diff --git a/test/test-combine.js b/test/test-combine.js index 0cf4dc6..2cd9541 100644 --- a/test/test-combine.js +++ b/test/test-combine.js @@ -22,10 +22,9 @@ * @package test */ -require( './common' ); - -var assert = require( 'assert' ), - Class = require( 'class' ), +var common = require( './common' ), + assert = require( 'assert' ), + Class = common.require( 'class' ), Script = process.binding( 'evals' ).Script, sandbox = {}; diff --git a/test/test-index.js b/test/test-index.js index b130160..c5c666a 100644 --- a/test/test-index.js +++ b/test/test-index.js @@ -22,10 +22,9 @@ * @package test */ -require( './common' ); - -var assert = require( 'assert' ), - Class = require( 'class' ), +var common = require( './common' ), + assert = require( 'assert' ), + Class = common.require( 'class' ), index = require( '../' ); diff --git a/test/test-interface-extend.js b/test/test-interface-extend.js index c08f2fc..e5b6604 100644 --- a/test/test-interface-extend.js +++ b/test/test-interface-extend.js @@ -22,10 +22,9 @@ * @package test */ -require( './common' ); - -var assert = require( 'assert' ), - Interface = require( 'interface' ), +var common = require( './common' ), + assert = require( 'assert' ), + Interface = common.require( 'interface' ), abstractMethod = Interface.abstractMethod; diff --git a/test/test-interface.js b/test/test-interface.js index b6a37cb..8eb8507 100644 --- a/test/test-interface.js +++ b/test/test-interface.js @@ -22,10 +22,9 @@ * @package test */ -require( './common' ); - -var assert = require( 'assert' ), - Interface = require( 'interface' ), +var common = require( './common' ), + assert = require( 'assert' ), + Interface = common.require( 'interface' ), abstractMethod = Interface.abstractMethod; var FooType = Interface.extend(); diff --git a/test/test-util-clone.js b/test/test-util-clone.js index c9f704b..f49c090 100644 --- a/test/test-util-clone.js +++ b/test/test-util-clone.js @@ -22,10 +22,9 @@ * @package test */ -require( './common' ); - -var assert = require( 'assert' ), - util = require( '../lib/util' ); +var common = require( './common' ), + assert = require( 'assert' ), + util = common.require( 'util' ); var arr = [ 1, 2, 3 ], obj = { a: 1, b: 2 }; diff --git a/test/test-util-define-secure-prop.js b/test/test-util-define-secure-prop.js index d9d1cb8..8cf4da4 100644 --- a/test/test-util-define-secure-prop.js +++ b/test/test-util-define-secure-prop.js @@ -22,10 +22,9 @@ * @package test */ -require( './common' ); - -var assert = require( 'assert' ), - util = require( '../lib/util' ); +var common = require( './common' ), + assert = require( 'assert' ), + util = common.require( 'util' ); var obj = {}, val = 'bar'; diff --git a/test/test-util-prop-copy.js b/test/test-util-prop-copy.js index 1b3ce20..f9c00b8 100644 --- a/test/test-util-prop-copy.js +++ b/test/test-util-prop-copy.js @@ -22,10 +22,9 @@ * @package test */ -require( './common' ); - -var assert = require( 'assert' ), - propCopy = require( '../lib/util' ).propCopy; +var common = require( './common' ), + assert = require( 'assert' ), + propCopy = common.require( 'util' ).propCopy; var props = { one: 1, diff --git a/test/test-util-prop-parse.js b/test/test-util-prop-parse.js index d380477..7527790 100644 --- a/test/test-util-prop-parse.js +++ b/test/test-util-prop-parse.js @@ -22,10 +22,9 @@ * @package test */ -require( './common' ); - -var assert = require( 'assert' ), - util = require( '../lib/util' ); +var common = require( './common' ), + assert = require( 'assert' ), + util = common.require( 'util' ); var data = { // scalars (properties)