Closed
Bug 83051
Opened 23 years ago
Closed 22 years ago
A function defined under a with block can't be invoked outside it
Categories
(Rhino Graveyard :: Core, defect)
Tracking
(Not tracked)
VERIFIED
FIXED
1.5R4
People
(Reporter: pschwartau, Assigned: norrisboyd)
Details
In SpiderMonkey, I can define f() under a with block and then call it from
top-level code. In Rhino, I cannot:
DEFINITION OF f
js> with(Math) {function f(){return PI}}
function f() {
return PI;
}
THIS SUCCEEDS:
js> with(Math) {f()}
3.141592653589793
THIS FAILS:
js> f()
js: "<stdin>", line 10: uncaught JavaScript exception: ReferenceError: "f" is
not defined. (<stdin>; line 10)
This issue is causing the following testcase to fail:
js/tests/ecma_3/Function/scope-001.js
Reporter | ||
Comment 1•23 years ago
|
||
Update: I AM able to invoke f globally in Rhino (as well as SpiderMonkey)
if I use a variable assignment instead of a function declaration:
js> with(Math) {var f = function(){return PI}}
js> f()
3.141592653589793
Summary: A function defined under a with block can't be invoked outside it → A function defined under a with block can't be invoked outside it
Reporter | ||
Comment 2•23 years ago
|
||
This may be the explanation:
1st test above: under the with statement there is a function declaration
2nd test above: under the with statement there is a function expression
It may be that ECMA does not specifially provide for function declarations
to appear under with statements, and that this is a SpiderMonkey extension
to the language. I will have to do more ECMA research to find out -
Reporter | ||
Comment 3•23 years ago
|
||
Another puzzle: Rhino gives me different errors on testcase
js/tests/ecma_3/Function/scope-001.js
depending on whether or not I use the -f operator or the load() method:
[//d/JS_TRUNK/mozilla/js/tests/ecma_3/Function]
java org.mozilla.javascript.tools.shell.Main -f ../shell.js -f scope-001.js
js: "D:\JS_trunk\mozilla\js\tests\ecma_3\Function\scope-001.js", line 100:
uncaught JavaScript exception: ReferenceError: "f"
is not defined. (D:\JS_trunk\mozilla\js\tests\ecma_3\Function\scope-001.js; line
100)
[//d/JS_TRUNK/mozilla/js/tests/ecma_3/Function]
$ java org.mozilla.javascript.tools.shell.Main
js> load('../shell.js')
js> load('scope-001.js')
BUGNUMBER: (none)
STATUS: Testing that functions are scoped statically, not dynamically
FAILED!: [reported from test()] Section C of test
FAILED!: [reported from test()] Expected value '2', Actual value '1'
FAILED!: [reported from test()]
FAILED!: [reported from test()] Section D of test
FAILED!: [reported from test()] Expected value '3', Actual value '1'
FAILED!: [reported from test()]
FAILED!: [reported from test()] Section E of test
FAILED!: [reported from test()] Expected value '2', Actual value '1'
FAILED!: [reported from test()]
FAILED!: [reported from test()] Section F of test
FAILED!: [reported from test()] Expected value '2', Actual value '1'
FAILED!: [reported from test()]
Any idea why this would be???
Reporter | ||
Comment 4•23 years ago
|
||
Note: in Rhino interpreted mode, I only get the latter type of failure,
whether I use the -f option or the load() method -
Reporter | ||
Comment 5•23 years ago
|
||
I take that back : now I'm getting the same behavior in the rhinoi shell
(interpreted mode) as in the rhino shell(compiled mode:
a discrepancy between the failure under the -f option as opposed
to the load() method. I don't how to explain what happened above ...
Reporter | ||
Comment 6•23 years ago
|
||
Now I see what I did wrong. When I was using load() to run the two
different tests in the shell, I wasn't exiting the shell in between them.
The function f is successfully defined by the one test. If I then happened
to run the other test, f was still in memory and produced output...
Sorry for the confusion -
Reporter | ||
Comment 7•23 years ago
|
||
To summarize: whether using the -f option or load(), both Rhino shells error on
js/tests/ecma_3/Function/scope-001.js
js: "D:\JS_trunk\mozilla\js\tests\ecma_3\Function\scope-001.js", line 100:
uncaught JavaScript exception: ReferenceError: "f"
is not defined. (D:\JS_trunk\mozilla\js\tests\ecma_3\Function\scope-001.js; line
100)
This is the test with the function DECLARATION under the with statement,
where we try to invoke the function globally. SpiderMonkey allows this.
Both Rhino and SpiderMonkey pass the other test:
js/tests/ecma_3/Function/scope-002.js
This is the test with the function EXPRESSION under the with statement,
where we try to invoke the function globally. Both engines allow this.
Comment 8•22 years ago
|
||
This can be market as fixed as the bug 184107 is effectively a duplicate of this
and it is fixed. Now the bug can be removed from the excluding list in
mozilla/js/tests/rhino-n.tests:
Index: rhino-n.tests
===================================================================
RCS file: /cvsroot/mozilla/js/tests/rhino-n.tests,v
retrieving revision 1.50
diff -u -r1.50 rhino-n.tests
--- rhino-n.tests 4 Sep 2002 22:56:39 -0000 1.50
+++ rhino-n.tests 23 Dec 2002 15:14:53 -0000
@@ -6,8 +6,6 @@
#
#bug 152646 Will not fix this in Rhino; too much of a corner case
js1_5/Regress/regress-152646.js
-# bug 83051
-ecma_3/Function/scope-001.js
# bug 59861
ecma/Date/15.9.4.3.js
#See bug number 94506
Reporter | ||
Comment 9•22 years ago
|
||
Igor is correct.
The testcase, js/tests/ecma_3/Function/scope-001.js, started
passing in Rhino when the fix for bug 184107 was checked in.
Marking FIXED -
Status: NEW → RESOLVED
Closed: 22 years ago
Resolution: --- → FIXED
Reporter | ||
Comment 10•22 years ago
|
||
Marking Verified Fixed.
I have removed these two lines from the rhino-n.tests skip list:
# bug 83051
ecma_3/Function/scope-001.js
[//d/JS_TRUNK/mozilla/js/tests] cvs ci rhino-n.tests
Checking in rhino-n.tests;
/cvsroot/mozilla/js/tests/rhino-n.tests,v <-- rhino-n.tests
new revision: 1.51; previous revision: 1.50
done
Status: RESOLVED → VERIFIED
You need to log in
before you can comment on or make changes to this bug.
Description
•