Re: Multiple globals and direct/indirect eval

2011-03-03 Thread David Herman
Hi Jeff,

I agree that the spec should deal with multiple global objects. I'm aware of a 
few of the subtleties of multiple globals, but I wouldn't be surprised if there 
are more. Thanks for raising this one. I created a placeholder strawman last 
week, because I've been intending to get into this topic. I've given it some 
contents now, but there's more work to be done. Here's what I've got so far:

http://wiki.ecmascript.org/doku.php?id=strawman:multiple_globals

> The Chrome/Safari behavior would resurrect the vestigial EvalError, so I 
> don't think it makes sense.  It also contradicts the specification of the 
> steps in the definition of the eval function.

I think I agree with this.

> Firefox's behavior is inconsistent and seems not amenable to host-agnostic 
> specification as ECMA would require.

I agree that we don't want things like the same-origin policy to show up in the 
ES spec. But I'm not sure I'm convinced there isn't a way to specify things 
loosely enough that the same-origin policy is consistent with whatever spec we 
end up with. I need to chew on that for a while, though.

> Thus we are left with the IE9/Opera behavior, which seems sensible and 
> natural to me: an eval function should always act in the context of the 
> global from which it came.

Now this I think I don't agree with. The reason is that direct eval is really a 
static operator in ECMAScript, not an ordinary function call. It's more than a 
function call because, for example, it has access to the lexical environment. 
Now, it has this strange dynamic component where, if the value turns out 
dynamically *not* to be an evaluation function, then it degenerates into a 
function call. But this doesn't change the fact that direct eval is imbued with 
special static-operator powers not available to other function calls -- in 
particular, access to the lexical environment.

At any rate, I can see two semantics that seem reasonable to me. First let me 
make up some terminology: an "apparently direct eval" is a call that's of the 
right form to be a direct eval, but whether it actually turns out to be a 
direct eval depends on the dynamic value of the callee.

So the two alternatives:

1) an apparently direct eval is a direct eval if its callee is *any* evaluation 
function
2) an apparently direct eval is a direct eval *only* if its callee is the 
evaluation function of the same global context as the call site

In either alternative, though, the global object of the eval'ed code is the 
same global object as the call site. At least for same-origin, semantics #1 
agrees with what Firefox is doing. But either one makes sense to me.

As for the same-origin stuff, I'm not yet sure what I think. I'll need to be 
schooled in the implications for the browser security model.

> What needs to be done to standardize this behavior?  And more generally, what 
> needs to be done to begin standardizing multiple globals in ECMAScript, 
> including issues like this one?

The above wiki page is a step in that direction, but there's more work to do. 
One thing that I think we have to do is nail down the notion of what callee 
values constitute an actual direct eval. It's not enough to say "the eval 
function," which is as bogus a phrase as "the global object."

Dave

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: "Harmony is a super-set of ES5 strict"

2011-03-03 Thread David Herman
>> So I think it might be a little misleading to say Harmony is strict-only.
> 
> Who ever said that? :-P

Yikes... not playing who-said-what. For whatever reason, Waldemar got the 
impression that someone said it, and I'm correcting the misconception, that's 
all.

> I've written that Harmony is based on ES5 strict. But even ES5 strict code 
> can call non-strict code. Same goes for Harmony. It's a big shared-heap world 
> out there...

Right.

Dave

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: "Harmony is a super-set of ES5 strict"

2011-03-03 Thread Brendan Eich
On Mar 3, 2011, at 6:55 PM, David Herman wrote:

> So I think it might be a little misleading to say Harmony is strict-only.

Who ever said that? :-P

I've written that Harmony is based on ES5 strict. But even ES5 strict code can 
call non-strict code. Same goes for Harmony. It's a big shared-heap world out 
there...

/be
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: Multiple globals and direct/indirect eval

2011-03-03 Thread Allen Wirfs-Brock

On Mar 3, 2011, at 5:45 PM, Jeff Walden wrote:

> On 03/03/2011 04:41 PM, Allen Wirfs-Brock wrote:
>> I think your real question reduces to this:
>> 
>> //none strict mode code
>> globalObj= function() {return this}();
>> print(otherGlobal.eval("this") === globalObj)  //??
>> 
>> The two different calls and the "indirect" name in your example may make the 
>> question seen like it is about something else (direct/indirect eval).
> 
> Not quite so.  For the example I gave, yes -- but you could see the 
> direct/indirect distinction by putting the code I provided inside a function 
> (and a little more gussying to demonstrate behavior better):
> 
>  var global = this;
>  function f()
>  {
>var indirect = otherGlobal.eval;
>eval = indirect;
>print(eval("this") === this);
>print(eval("this) === global);
>print(eval("this") === otherGlobal);
>print(indirect("this") === this);
>print(indirect("this") === global);
>print(indirect("this") === otherGlobal);
>  }
>  new f();

I tried to simplify because the above depends upon too many possible points of 
variation including whether you correctly are/aren't  treating the first three 
calls as direct evals.  That decision, itself may be subject to the answer to 
the test I suggested. So it is probably best to resolve that one first.

the following would also be interesting to test:

 new function f() {
 var indirectEval = eval;
 var indirectForeignEval = otherGlobal.eval;
 print(indirectEval === indirectForeignEval);  //see if they are the same object
 print(indirectEval("this") === indirectForeignEval("this"));  //do they 
evaluate to the same global object?
 eval=indirectForeign;
 print(eval("this")===this);
}



> 
> IE9/Opera prints false/false/true and false/false/true.  Chrome/Safari throws 
> EvalError every time.  Firefox prints true/false/false and false/false/true 
> if otherGlobal is same-origin, false/false/true and false/false/true if 
> otherGlobal is different-origin-but-same-document.domain.
> 
>> A more  generally, do built-in functions capture their global environment at 
>> the time of their creation or do they they operate in the dynamic context of 
>> an ambient global environment. I hope it is the former.
>> 
>> An example of the more general question would be:
>> print((Object.getPrototypeOf(new otherGlobal.Array(0)) ===  Array.prototype)
>> 
>> I believe the second example prints false for all browser implementations.
> 
> This is an orthogonal issue, I believe, but I might as well respond since 
> it's being discussed.  There's a Firefox 4 bug that makes this not the case, 
> ran out of time to fix it for release.  It'll be fixed in 5.0, and I could 
> imagine I might get a fix for it in a 4.0 point release, although with a fast 
> release cycle that may not be necessary.  If I recall correctly Nitro may be 
> buggy this same way as well.  I think Chrome/IE9/Opera did not demonstrate 
> the bug in my testing.  But in any case, printing false there is in my 
> opinion the correct behavior.

I don't really agree that it is an orthogonal issue.  The reason is because 
there are many places in the ES5 specification, including other built-in 
functions there the phrasing "standard built-in function" is used as well as 
the the phrase "the global object". When extending that specification to an 
environment that includes multiple global object, these phrases should still be 
consistently applied.  If one built-in function works as if it was lexically 
bound to a specific global object while another use the current ambient global 
environment (whatever that might mean) then the implementation would seem to be 
internal inconsistent.   The specification of direct eval is one of the places 
that use this phrasing in the spec.. so it is quite relevant whether an 
implementations is internally consistent in this regard.
> 


___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: "Harmony is a super-set of ES5 strict"

2011-03-03 Thread David Herman
On Mar 3, 2011, at 5:33 PM, Waldemar Horwat wrote:

> If we're saying that Harmony is strict-only, settable by a  tag, what 
> will indirect eval and the Function constructor do if the evaluated code 
> doesn't start with a "use strict" directive?

Yeah, "strict-only" is probably not quite the right way to describe it. We 
discussed this a bit at the last face-to-face. Generally, Harmony still has to 
allow for the existence of non-Harmony code living and executing in the same 
heap. For example, a web page can contain