Hi,

as far as I remember the objects should be sealed, so no new properties
should be added / removed. Thus, we can generate their property list (by
iterating through the properties) during compile phase, can't we?

Regards,
Zoltan

> Hi,
>   In your solution you silently assume that 'b' has property 'y' and 'a'
> has
> 'x', how you can now that?
> Cheers,
>   Jędrek
>
> On Monday 23. May 2011 09.04.40 ext Zoltan Herczeg wrote:
>> Hi,
>>
>> we could further improve this solution. As far as I remember, the QML
>> objects contain a list of attributes:
>>
>> object {
>>    attrib 1: JS for attrib 1
>>    attrib 2: JS for attrib 2
>>    attrib 3: JS for attrib 3
>>    ....
>> }
>>
>> We could generate something like the following for each object:
>>
>> function generate()
>> {
>>      // listing the accessible members for the scope chain
>>      // and remember their indices for further use
>>      var x = a.x;
>>      var y = b.y;
>>      var array = [
>>           // Funtion for calculating the attributes
>>           // we should also remember their indices
>>           function() { JS for attrib 1 }
>>           function() { JS for attrib 2 }
>>           function() { JS for attrib 3 }
>>           // Setters when something changed. We don't
>>           // actually need the new value, since we can simply read it.
>>           function() { x = a.x }
>>           function() { y = b.y }
>>      ];
>>      return function( /* list of which functions should be called. */ )
>> {
>>          // We could declare the array here, but this is faster
>>          // since we don't need to initialize it each time when
>>          // we call this function (local arrays are bad for JS perf).
>>          for (var 0 = 1; var < arguments.length, ++i)
>>              array[i]();
>>      }
>> }
>>
>> var f = generate();
>> // We call the property setters first to update local variables
>> // Later we call the JS calculators for each attribute.
>> // We know their indices.
>> f(5, 6, 7, 1, 2, 3);
>>
>> As far as I know this soultion does not involve any lookups, easy to
>> generate, and engine independent. What do you think?
>>
>> Regards,
>> Zoltan
>>
>> > Hi,
>> >
>> > I played with the statement and turned out that it is really do a full
>> > scope chain resolution which was unexpected. I thought this feature is
>> > similar to joined objects:
>> >
>> > function f() {
>> >
>> >     var x = 3;
>> >     this.get = function() { return x; }
>> >     this.set = function(value) { x = value; }
>> >
>> > }
>> >
>> > o = new f();     // prints 3
>> > print(o.get());
>> > o.set(7);
>> > print(o.get());  // prints 7
>> >
>> > If we cannot find a better solution, we should "export" the whole
>> scope
>> > chain as local variables, and let the joined object mechanism handle
>> the
>> > expression.
>> >
>> > var a = { x:5 }
>> > var b = { y:6 }
>> >
>> > // expression: return x + y
>> > // scope a, b
>> >
>> > var f = (function() {
>> >
>> >     // Generate the accessible member list
>> >     var x = a.x; // index 1
>> >     var y = b.y; // index 2
>> >     return [
>> >
>> >         // index 0 - the function
>> >         // the members are resolved
>> >         // by locals if possible
>> >         function() { return x + y; },
>> >         // same order as the vars above
>> >         function(value) { x = value; },
>> >         function(value) { y = value; },
>> >
>> >     ];
>> >
>> > })();
>> >
>> > // The following code does not involves lookups,
>> > // only joined objects
>> >
>> > print(f[0]()); // 5 + 6 = 11
>> > a.x = 8;
>> > print(f[0]()); // still 11, the change
>> >
>> >                // does not affects it anymore
>> >
>> > f[1](12);      // change 'x' to 12
>> > print(f[0]()); // 12 + 6 = 18
>> >
>> > This mechanism really does not involve any lookups, and we only need
>> to
>> > statically record the property indicies for each function instance.
>> When
>> > the property is changed, just call the appropriate handler (by the
>> index,
>> > no lookup here either). We could wrap the array into another function,
>> so
>> > f[1](12) could be turned to f(1, 12), which has a call API in v8. '1'
>> is
>> > SMI, so changing the value does not involve memory allocation (except
>> for
>> > the second argument sometimes).
>> >
>> > Regards,
>> > Zoltan
>> >
>> >> Hello guys,
>> >>
>> >> Zoltan, I think I'm misunderstanding something here. :-/  I have some
>> >> questions that will help me understand better:
>> >>
>> >> 1) Thinking about the example that uses JS
>> >>
>> >>   globalObject->Set(String::New("context"), instance);
>> >>   globalObject->Set(String::New("newGlobal"), globalObject);
>> >>
>> >>   Local<Value> result = CompileRun(
>> >>
>> >>       "(function() {"
>> >>       "   with(context)"
>> >>       "     with(newGlobal)"
>> >>       "       return (function() { valueA + valueB + Math.sin(0) });"
>> >>       "})();");
>> >>
>> >> imagine that during compilation 'newGlobal' has valueA. If I
>> >> understand correct, you are saying that when I execute the function
>> in
>> >> result, it will not perform lookup?
>> >>
>> >> Imagine that we remove it from 'newGlobal' and add another into
>> >> 'context'. We need another lookup to know that valueA comes from
>> >> context and not newGlobal anymore, right? How does v8 knows that it's
>> >> time to perform lookup again?
>> >>
>> >>
>> >> 2) The C++ API we have exists to create programatically the construct
>> >> with with-statements in JavaScript. So I wasn't really expecting that
>> >> we get too much difference from the both approaches. This is how the
>> >> feature is implemented today.
>> >>
>> >>> As for cunclusion I would suggest the with statement, since if you
>> >>> happens
>> >>> to change the JS engine again, it will still work.
>> >>
>> >> Yes, we get the semantics we want with this approach but the whole
>> >> point is that it is slow in current engines :-(  so we have two ways:
>> >> (a) optimize the cases we use; (b) find another approach.
>> >>
>> >> For (a) there is the idea that engine could do better if knew that
>> the
>> >> objects in with() are "sealed". For (b) there's the approach of
>> >> changing the lookup code to match our semantics.
>> >>
>> >>
>> >> Cheers,
>> >>
>> >>
>> >> --
>> >> Caio Marcelo de Oliveira Filho
>> >> OpenBossa - INdT
>>
>> _______________________________________________
>> Qt-script mailing list
>> [email protected]
>> http://lists.qt.nokia.com/mailman/listinfo/qt-script
> _______________________________________________
> Qt-script mailing list
> [email protected]
> http://lists.qt.nokia.com/mailman/listinfo/qt-script
>

_______________________________________________
Qt-script mailing list
[email protected]
http://lists.qt.nokia.com/mailman/listinfo/qt-script

Reply via email to