Skip to content
This repository was archived by the owner on Jan 15, 2020. It is now read-only.
This repository was archived by the owner on Jan 15, 2020. It is now read-only.

Segmentation fault (core dumped) on node v0.6.x #20

@jifeon

Description

@jifeon

The code below crashes sometimes with segmentation error. I tested it on node 0.6.6( crashes ) and 0.4.12 ( works ) Look to get in the handler, other traps are default.

var Proxy = require( 'node-proxy' );

function ProxyHandler( target ) {
  return {

    getOwnPropertyDescriptor : function( name ) {
      var desc = Object.getOwnPropertyDescriptor( target, name );
      if ( desc !== undefined ) {
        desc.configurable = true;
      }
      return desc;
    },


    getPropertyDescriptor : function( name ) {
      var desc    = Object.getOwnPropertyDescriptor( target, name );
      var parent  = Object.getPrototypeOf( target );

      while ( desc === undefined && parent !== null ) {
        desc = Object.getOwnPropertyDescriptor( parent, name );
        parent = Object.getPrototypeOf( parent );
      }
      if ( desc !== undefined ) {
        desc.configurable = true;
      }
      return desc;
    },


    getOwnPropertyNames : function() {
      return Object.getOwnPropertyNames( target );
    },


    getPropertyNames : function() {
      var props   = Object.getOwnPropertyNames( target );
      var parent  = Object.getPrototypeOf( target );

      while ( parent !== null ) {
        props = props.concat( Object.getOwnPropertyNames( parent ) );
        parent = Object.getPrototypeOf( parent );
      }

      return props;
    },


    defineProperty : function( name, desc ) {
      return Object.defineProperty( target, name, desc );
    },


    'delete' : function( name ) {
      return delete target[ name ];
    },


    fix : function() {
      if ( !Object.isFrozen( target ) ) return undefined;

      var props = {};
      for ( var name in target ) {
        props[ name ] = Object.getOwnPropertyDescriptor( target, name );
      }

      return props;
    },


    has : function( name ) {
      return name in target;
    },


    hasOwn : function( name ) {
      return ({}).hasOwnProperty.call( target, name );
    },


    get : function( receiver, name ) {
      var super_prototype = Object.getPrototypeOf( Object.getPrototypeOf( Object.getPrototypeOf( target ) ));

      return super_prototype[ name ].bind( target );
    },


    set : function( receiver, name, val ) {
      target[ name ] = val;
      return true;
    },


    enumerate : function() {
      var result = [];
      for ( var name in target ) {
        result.push( name );
      }

      return result;
    },


    iterate : function() {
      var props = this.enumerate();
      var i = 0;
      return {
        next: function() {
          if ( i === props.length ) throw StopIteration;
          return props[i++];
        }
      };
    },


    keys : function() {
      return Object.keys( target );
    }
  }
}


function ClassA() {}
ClassA.prototype.method = function() {};


require('util').inherits( ClassB, ClassA );
function ClassB() {}

ClassB.prototype.method = function() {
  var handler = ProxyHandler( this );
  var s = Proxy.create( handler, Object.getPrototypeOf( this ) );
  s.method();
};


var j = 0;
require('util').inherits( ClassC, ClassB );
function ClassC() {
  console.log( j++ );
  this.method();
}

for( var i = 0; i < 50; i++ ) new ClassC;
console.log( 'All good' );

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions