1
0
Fork 0

"lazy" metadata support

master
Mike Gerwitz 2015-05-24 00:27:46 -04:00
parent e866f53d4c
commit 5b6a0c0bb5
1 changed files with 19 additions and 7 deletions

View File

@ -351,14 +351,15 @@ exports.prototype.build = function extend( _, __ )
props: this._memberBuilder.initMembers(),
},
meta = exports.getMeta( base ) || {},
// constructor may be different than base
pmeta = exports.getMeta( prototype.constructor ) || {},
abstract_methods =
util.clone( meta.abstractMethods )
util.clone( pmeta.abstractMethods )
|| { __length: 0 },
virtual_members =
util.clone( meta.virtualMembers )
util.clone( pmeta.virtualMembers )
|| {}
;
@ -476,7 +477,7 @@ exports.prototype.build = function extend( _, __ )
util.defineSecureProp( prototype, '__self', new_class.___$$svis$$ );
// create internal metadata for the new class
var meta = createMeta( new_class, base );
var meta = createMeta( new_class, base, pmeta );
meta.abstractMethods = abstract_methods;
meta.virtualMembers = virtual_members;
meta.name = cname;
@ -1267,18 +1268,23 @@ exports.prototype.attachStatic = function( ctor, members, base, inheriting )
/**
* Initializes class metadata for the given class
*
* DYNMETA is used only when CPARENT's metadata are flagged as "lazy",
* meaning that the data are not available at the time of its definition,
* but are available now as DYNMETA.
*
* @param {Function} func class to initialize metadata for
* @param {Function} cparent class parent
* @param {?Object} dynmeta dynamic metadata
*
* @return {undefined}
*
* Suppressed due to warnings for use of __cid
* @suppress {checkTypes}
*/
function createMeta( func, cparent )
function createMeta( func, cparent, dynmeta )
{
var id = func.__cid,
parent_meta = ( ( cparent.__cid )
parent_meta = ( cparent[ _priv ]
? exports.getMeta( cparent )
: undefined
);
@ -1286,7 +1292,13 @@ function createMeta( func, cparent )
// copy the parent prototype's metadata if it exists (inherit metadata)
if ( parent_meta )
{
return func[ _priv ].meta = util.clone( parent_meta, true );
return func[ _priv ].meta = util.clone(
// "lazy" metadata are unavailable at the time of definition
parent_meta._lazy
? dynmeta
: parent_meta,
true
);
}
// create empty