mirror of
https://github.com/scratchfoundation/paper.js.git
synced 2024-12-29 09:22:22 -05:00
Prevent consumed properties in object literal constructors from being set on the instance.
We need to make sure arguments.__filtered survives constructor calls.
This commit is contained in:
parent
e46c8ec340
commit
b26b056522
2 changed files with 22 additions and 6 deletions
|
@ -141,6 +141,12 @@ var Rectangle = Base.extend(/** @lends Rectangle# */{
|
||||||
}
|
}
|
||||||
this._set(x, y, width, height);
|
this._set(x, y, width, height);
|
||||||
read = arguments.__index;
|
read = arguments.__index;
|
||||||
|
// arguments.__filtered wouldn't survive the function call even if a
|
||||||
|
// previous arguments list was passed through Function#apply().
|
||||||
|
// Return it on the object instead, see Base.read()
|
||||||
|
var filtered = arguments.__filtered;
|
||||||
|
if (filtered)
|
||||||
|
this.__filtered = filtered;
|
||||||
}
|
}
|
||||||
if (this.__read)
|
if (this.__read)
|
||||||
this.__read = read;
|
this.__read = read;
|
||||||
|
|
|
@ -208,6 +208,14 @@ Base.inject(/** @lends Base# */{
|
||||||
: list) || obj;
|
: list) || obj;
|
||||||
if (readIndex) {
|
if (readIndex) {
|
||||||
list.__index = begin + obj.__read;
|
list.__index = begin + obj.__read;
|
||||||
|
// This is only in use in Rectangle so far: Nested calls to
|
||||||
|
// Base.readNamed() would loose __filtered if it wasn't returned
|
||||||
|
// on the object.
|
||||||
|
var filtered = obj.__filtered;
|
||||||
|
if (filtered) {
|
||||||
|
list.__filtered = filtered;
|
||||||
|
obj.__filtered = undefined;
|
||||||
|
}
|
||||||
obj.__read = undefined;
|
obj.__read = undefined;
|
||||||
}
|
}
|
||||||
return obj;
|
return obj;
|
||||||
|
@ -281,18 +289,20 @@ Base.inject(/** @lends Base# */{
|
||||||
if (hasObject) {
|
if (hasObject) {
|
||||||
// Create a _filtered object that inherits from list[0], and
|
// Create a _filtered object that inherits from list[0], and
|
||||||
// override all fields that were already read with undefined.
|
// override all fields that were already read with undefined.
|
||||||
var filtered = list._filtered;
|
var filtered = list.__filtered;
|
||||||
if (!filtered) {
|
if (!filtered) {
|
||||||
filtered = list._filtered = Base.create(list[0]);
|
filtered = list.__filtered = Base.create(list[0]);
|
||||||
// Point _unfiltered to the original so Base#_set() can
|
// Point _unfiltered to the original so Base#_set() can
|
||||||
// execute hasOwnProperty on it.
|
// execute hasOwnProperty on it.
|
||||||
filtered._unfiltered = list[0];
|
filtered.__unfiltered = list[0];
|
||||||
}
|
}
|
||||||
// delete wouldn't work since the masked parent's value would
|
// delete wouldn't work since the masked parent's value would
|
||||||
// shine through.
|
// shine through.
|
||||||
filtered[name] = undefined;
|
filtered[name] = undefined;
|
||||||
}
|
}
|
||||||
return this.read(hasObject ? [value] : list, start, options, amount);
|
var l = hasObject ? [value] : list,
|
||||||
|
res = this.read(l, start, options, amount);
|
||||||
|
return res;
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -307,7 +317,7 @@ Base.inject(/** @lends Base# */{
|
||||||
list._hasObject = list.length === 1 && Base.isPlainObject(arg);
|
list._hasObject = list.length === 1 && Base.isPlainObject(arg);
|
||||||
if (list._hasObject)
|
if (list._hasObject)
|
||||||
// Return the whole arguments object if no name is provided.
|
// Return the whole arguments object if no name is provided.
|
||||||
return name ? arg[name] : list._filtered || arg;
|
return name ? arg[name] : list.__filtered || arg;
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -365,7 +375,7 @@ Base.inject(/** @lends Base# */{
|
||||||
// If source is a filtered object, we get the keys from the
|
// If source is a filtered object, we get the keys from the
|
||||||
// the original object (it's parent / prototype). See _filtered
|
// the original object (it's parent / prototype). See _filtered
|
||||||
// inheritance trick in the argument reading code.
|
// inheritance trick in the argument reading code.
|
||||||
Object.keys(source._unfiltered || source).forEach(handleKey);
|
Object.keys(source.__unfiltered || source).forEach(handleKey);
|
||||||
return dest;
|
return dest;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue