Closed
Bug 203013
Opened 21 years ago
Closed 21 years ago
Any modification of sealed object should throw exception?
Categories
(Rhino Graveyard :: Core, enhancement)
Rhino Graveyard
Core
Tracking
(Not tracked)
RESOLVED
FIXED
1.5R5
People
(Reporter: igor, Assigned: norrisboyd)
Details
Attachments
(3 files)
7.07 KB,
patch
|
Details | Diff | Splinter Review | |
10.22 KB,
patch
|
Details | Diff | Splinter Review | |
3.01 KB,
patch
|
Details | Diff | Splinter Review |
Rhino supports a notion of a sealed object where properties can not be added / deleted from it. It does not make the object fully immune since the existing properties can be still modified. On the other hand Rhino also has an option to initialize standard objects as sealed ones but then it also makes all properties of the standard objects read only. In my opinion the later behavior is more natural and meets expectations that sealed == immune. Thus I suggest to make sealed == immune to hold always.
Reporter | ||
Comment 1•21 years ago
|
||
Patch makes sealed objects to behave as if their properties are read only.
Reporter | ||
Comment 2•21 years ago
|
||
I commited the patch.
Status: NEW → RESOLVED
Closed: 21 years ago
Resolution: --- → FIXED
Reporter | ||
Comment 4•21 years ago
|
||
Any modification of sealed object should throw exception? I reopen this since it seems that the notion sealed object -> all properties read only is less useful then the following sealed object -> any attempt to modify the object should fail with exception. In this way one would have guaranty that if a script that operates with sealed objects runs without exceptions then 1. the sealed objects are not modified 2. the script would run exactly in the same way if objects are not sealed Currently only 1 is satisfied since with read-only properties sealed objects are immune to modifications indeed, but the item 2 is not addressed as changes to read-only properties are silently ignored. If one has a script with Object.prototype.hasOwnProperty = myHasOwnproperty and later to save memory one decided to share sealed standard objects between different script invocations then the fact that it is not possible to do this with the above script would not be visible immediately. Moreover, read-only properties ignore changes on whole prototype chain so if Object.prototype is sealed with the current semantic then x = { hasOwnProperty: 1 } would not set hasOwnProperty in x since Object.prototype.hasOwnProperty is read only. In this example it makes perfect sense to have sealed shared standard library, but the current rules prevent it. On the other hand if sealed would mean that any modification to the object should fail without affecting prototype chain semantics, in the first case one would get an exception telling what is wrong and the second case would continue to work in the same way.
Status: VERIFIED → REOPENED
Resolution: FIXED → ---
Summary: Sealed -> all properties readonly?
Reporter | ||
Comment 5•21 years ago
|
||
New title
Summary: Any modification of sealed object should throw exception?
Reporter | ||
Comment 6•21 years ago
|
||
The patch also adds -sealedlib options to Rhino shell so after java -jar js.jar -sealedlib I have: Rhino 1.5 release 5 0000 00 00 js> Math.sin = 1 js: Cannot modify a property of a sealed object: sin. js> Object.prototype.hasOwnProperty = 1 js: Cannot modify a property of a sealed object: hasOwnProperty. js> x = { hasOwnProperty: 1} [object Object] js> x.hasOwnProperty 1
Reporter | ||
Comment 7•21 years ago
|
||
I committed the change in sealed semantics.
Status: REOPENED → RESOLVED
Closed: 21 years ago → 21 years ago
Resolution: --- → FIXED
Comment 8•21 years ago
|
||
I have a question. I do see what Igor reported above: ---------------- WITHOUT -sealedlib OPTION ---------------- [ ] java org.mozilla.javascript.tools.shell.Main Rhino 1.5 release 5 0000 00 00 js> Math.sin = 1; 1 js> Math.sin 1 ------------------ WITH -sealedlib OPTION ----------------- [ ] java org.mozilla.javascript.tools.shell.Main -sealedlib Rhino 1.5 release 5 0000 00 00 js> Math.sin = 1; js: Cannot modify a property of a sealed object: sin. However, I am able to modify |eval|, for example: js> eval = 1; 1 js> eval; 1 js> eval('a'); js: uncaught JavaScript exception: TypeError: 1 is not a function. That isn't the expected behavior under -sealedlib, is it? Shouldn't |eval| become ReadOnly then, just like |Math.sin|?
Comment 9•21 years ago
|
||
Compare the current SpiderMonkey shell: --------------------- WITHOUT SEALING --------------------- js> eval = 1; 1 js> eval; 1 ----------------------- WITH SEALING ---------------------- js> seal(this); js> eval = 1; 7: Error: eval is read-only
Reporter | ||
Comment 10•21 years ago
|
||
The option -sealedlib in the current form seals only the standard library objects themselves, it does not affect the global scope object and its properties. Otherwise no new properties can be added to the global object. So even with -sealedlib one can write Math = Object even if eval.length = 2 gives an exception. This is confusing, but then it is for another bug report.
Reporter | ||
Comment 11•21 years ago
|
||
The patch adds seal function to Rhino shell with to match SM.
Reporter | ||
Comment 12•21 years ago
|
||
I committed the above patch to add seal so now in Rhino one can also have: js> seal(this) js> eval = 1 js: "<stdin>", line 2: Cannot modify a property of a sealed object: eval.
Comment 13•21 years ago
|
||
Looks good: js> seal(this); js> eval = 1; js: "<stdin>", line 4: Cannot modify a property of a sealed object: eval. But I still have some questions: 1. If we have the seal() function, do we also want to have the optional second parameter, as in SpiderMonkey? seal(obj, true) ---> seals the entire object graph, including the __parent__ chain See bug 94693 comment 10, bug 94693 comment 22, etc. 2. The help message needs updating, to mention the -sealedlib option: [ ] java org.mozilla.javascript.tools.shell.Main -XXX Didn't understand "-XXX". Valid arguments are: -w -version 100|110|120|130|140|150 -opt [-1|0-9] -f script-filename -e script-source 3. Should |seal(this)| prevent the user from doing |this = 1| ? Note: the latter is currently causing a Rhino crash, independently of any sealing issues. I have filed bug 206658 -
You need to log in
before you can comment on or make changes to this bug.
Description
•