diff --git a/src/node.cc b/src/node.cc index e0a0c72273..b19b447d2d 100644 --- a/src/node.cc +++ b/src/node.cc @@ -1959,8 +1959,8 @@ static Handle EnvGetter(Local property, return scope.Close(String::New(reinterpret_cast(buffer), result)); } #endif - // Not found - return Undefined(); + // Not found. Fetch from prototype. + return info.Data().As()->Get(property); } @@ -2210,7 +2210,7 @@ Handle SetupProcessObject(int argc, char *argv[]) { EnvQuery, EnvDeleter, EnvEnumerator, - Undefined()); + Object::New()); Local env = envTemplate->NewInstance(); process->Set(String::NewSymbol("env"), env); diff --git a/test/simple/test-process-env.js b/test/simple/test-process-env.js index fdf35ba772..919d0d54ed 100644 --- a/test/simple/test-process-env.js +++ b/test/simple/test-process-env.js @@ -47,8 +47,18 @@ if (process.argv[2] == 'you-are-the-child') { // failed assertion results in process exiting with status code 1 assert.equal(false, 'NODE_PROCESS_ENV_DELETED' in process.env); assert.equal(42, process.env.NODE_PROCESS_ENV); + assert.equal('asdf', process.env.hasOwnProperty); + var hasOwnProperty = Object.prototype.hasOwnProperty; + var has = hasOwnProperty.call(process.env, 'hasOwnProperty'); + assert.equal(true, has); process.exit(0); } else { + assert.equal(Object.prototype.hasOwnProperty, process.env.hasOwnProperty); + var has = process.env.hasOwnProperty('hasOwnProperty'); + assert.equal(false, has); + + process.env.hasOwnProperty = 'asdf'; + process.env.NODE_PROCESS_ENV = 42; assert.equal(42, process.env.NODE_PROCESS_ENV);