Section 1 of the existing tests is already in js/src/tests/ecma_3/Function/
15.3.4.4-1.js. Section 2 is an internal detail of our implementation that in
the near future is going to be changing. Currently, we sometimes stilll walk
the parent pointers to get to globals; soon we will have a faster way to get
them in all cases, either through compile-n-go or IM. What we really want to
test is that we get the lexical globals, not the caller globals. This adds such
a test to our newer Function tests and simply removes the old Function tests.
--HG--
extra : rebase_source : 8d4c9440750245e895a01f8b92d1ceb3d18d8e8f
We only have one good reason for the useAllocator distinction: when C++ calls JS with a dipper parameter (ie, a string), the caller has already created the relevant nsAString or nsCString, so we shouldn't allocate another one. All other uses are superfluous or irrelevant, so we can get rid of them.
This is the last remaining place where we might pass a non-dipper with useAllocator==false to XPCConvert *and, as a consequence*, do something different within XPCConvert. This paves the way for the elimination of useAllocator for non-dipper types.
XPC_JSArgumentFormatter adds 3 special format string tokens to spidermonkey: %ip, %iv, and %is. These were unused outside of testing according to a free-text MXR search, and don't appear to be well-documented anywhere either. They also happen to be quite dangerous and easy to use improperly: we pass untyped variadic parameters to XPCConvert::JSData2Native with useAllocator==false. This causes JSData2Native to blindly cast the values to concrete class pointers (like nsAString*) and call methods on them.
AFAICT we'd crash if we hit these cases anyway. bsmedberg and khuey requested that I assert against this case within XPConnect, and file a bug to make XPIDL enforce that [shared] parameters exist only in [noscript] methods. Filed bug 685281 for this.
This patch is best reviewed while listening to http://www.youtube.com/watch?v=MK6TXMsvgQg
NB - The code here would make a great "find the bugs in this code" interview screen question.
We only have one good reason for the useAllocator distinction: when C++ calls JS with a dipper parameter (ie, a string), the caller has already created the relevant nsAString or nsCString, so we shouldn't allocate another one. All other uses are superfluous or irrelevant, so we can get rid of them.
This is the last remaining place where we might pass a non-dipper with useAllocator==false to XPCConvert *and, as a consequence*, do something different within XPCConvert. This paves the way for the elimination of useAllocator for non-dipper types.
XPC_JSArgumentFormatter adds 3 special format string tokens to spidermonkey: %ip, %iv, and %is. These were unused outside of testing according to a free-text MXR search, and don't appear to be well-documented anywhere either. They also happen to be quite dangerous and easy to use improperly: we pass untyped variadic parameters to XPCConvert::JSData2Native with useAllocator==false. This causes JSData2Native to blindly cast the values to concrete class pointers (like nsAString*) and call methods on them.
AFAICT we'd crash if we hit these cases anyway. bsmedberg and khuey requested that I assert against this case within XPConnect, and file a bug to make XPIDL enforce that [shared] parameters exist only in [noscript] methods. Filed bug 685281 for this.