1
0
Fork 0

Re-encapsulated ClassBuilder private symbol

Temporary method removed and symbol now provided directly to the trait ctor;
this is needed to retrieve the protected visibility object; there is
currently no API for doing so, and there may never be (providing an API for
such a thing seems questionable).

Of course, if we eventually want to decouple the trait implementation from
ClassBuilder (which would be a good idea), we'll have to figure out
something.
protolib
Mike Gerwitz 2014-07-07 00:20:37 -04:00
parent 13b0bd2fb3
commit 17d11c1832
2 changed files with 15 additions and 15 deletions

View File

@ -882,7 +882,7 @@ exports.prototype.createConcreteCtor = function( cname, members )
// handle internal trait initialization logic, if provided
if ( typeof this.___$$tctor$$ === 'function' )
{
this.___$$tctor$$.call( this );
this.___$$tctor$$.call( this, _priv );
}
// call the constructor, if one was provided
@ -1233,10 +1233,6 @@ exports.prototype.attachStatic = function( ctor, members, base, inheriting )
}
// FIXME: this is *temporary* during refactoring!
module.exports.___$$privsym$$ = _priv;
/**
* Initializes class metadata for the given class
*

View File

@ -673,16 +673,20 @@ function addTraitInst( T, dfn, tc, base )
* This will lazily create the concrete trait class if it does not already
* exist, which saves work if the trait is never used.
*
* @param {Object} tc trait class list
* @param {Class} base target supertype
* Note that the private symbol used to encapsulate class data must be
* passed to this function to provide us access to implementation details
* that we really shouldn't be messing around with. :) In particular, we
* need access to the protected visibility object, and there is [currently]
* no API for doing so.
*
* @param {Object} tc trait class list
* @param {Class} base target supertype
* @param {Symbol} privsym symbol used as key for encapsulated data
*
* @return {undefined}
*/
function tctor( tc, base )
function tctor( tc, base, privsym )
{
// FIXME: this is temporary during refactoring!
var cbpriv = ClassBuilder.___$$privsym$$;
// instantiate all traits and assign the object to their
// respective fields
for ( var t in tc )
@ -696,11 +700,11 @@ function tctor( tc, base )
// (but not private); in return, we will use its own protected
// visibility object to gain access to its protected members...quite
// the intimate relationship
this[ f ] = C( base, this[ cbpriv ].vis )[ cbpriv ].vis;
this[ f ] = C( base, this[ privsym ].vis )[ privsym ].vis;
}
// if we are a subtype, be sure to initialize our parent's traits
this.__super && this.__super();
this.__super && this.__super( privsym );
};
@ -717,9 +721,9 @@ function tctor( tc, base )
*/
function createTctor( tc, base )
{
return function()
return function( privsym )
{
return tctor.call( this, tc, base );
return tctor.call( this, tc, base, privsym );
};
}