- From: Cameron McCormack <cam@mcc.id.au>
- Date: Tue, 03 Apr 2012 09:34:38 +1000
- To: Boris Zbarsky <bzbarsky@MIT.EDU>
- CC: "public-script-coord@w3.org" <public-script-coord@w3.org>
Boris Zbarsky: > I was reading the array sections of WebIDL, and I had two questions. > > 1) The spec says that for platform array objects the [[Extensible]] > property is always true. Why is that, exactly? Shouldn't one be able > to Object.seal() or Object.preventExtensions() platform array objects? > It's doable for other platform objects, afaict... If a platform array object is not [[Extensible]], is not a fixed length array, and the array gets longer, what happens? Does the length property reflect the new longer value but not expose the additional array index properties with its [[GetOwnProperty]]? It seemed simpler to disallow this. (I wonder now whether I've done the same thing for objects with indexed properties, though...) > 2) http://dev.w3.org/2006/webapi/WebIDL/#idl-array says that arrays are > passed by reference and that "Passing an array to a platform object > could result in that array being modified by the object." However > http://dev.w3.org/2006/webapi/WebIDL/#es-array says that converting an > ES value to an IDL array always allocates a new array. I'm not sure how > to reconcile these two statements; at the moment I'm assuming that the > informative text at the first link is in error and the normative > requirements are correct: arrays are passed by value but returned by > reference. Is that right? I think the confusions is because I'm using "array" in two different senses. The set of values for an IDL array type T[] are just references to platform array objects of that element type. When you pass in a JS Array object, the JS value is converted to the IDL type by creating a new platform array object from the values in the JS Array. So if you had interface A { attribute long[] x; }; where x is defined to just store and return the same value, nothing special, then: var y = [1, 2, 3]; myA.x = y; assert(myA.x == myA.x); assert(myA.x != y); myA.x[0] = 4; assert(y[0] == 1); assert(myA.x[0] == 4); The statement that says "passing an array to a platform object could result in that array being modified by the object" is referring to the IDL array type, not a JS array. For example: interface B { long[] range(unsigned long min, unsigned long max); void incrementAll(long[] a); }; Let's say range returns a reference to a newly created IDL array (so in the ECMAScript binding this means a new platform array object) with values from min to max. The statement is saying that if you pass an IDL array value to incrementAll, then the object might modify that array: var a1 = myB.range(1, 5); assert(a1[0] == 1); myB.incrementAll(a); assert(a1[0] == 2); var a2 = [1, 2, 3, 4, 5]; myB.incrementAll(a2); assert(a2[0] == 1); The second call to incrementAll creates a new IDL array value from the JS Array object and then operates on that.
Received on Monday, 2 April 2012 23:35:11 UTC