[PATCH v3 4/5] vbscript: Implement separate script dispatch objects for each named item.
Gabriel Ivăncescu
gabrielopcode at gmail.com
Thu Feb 6 09:55:31 CST 2020
Hi Jacek,
On 05/02/2020 22:54, Jacek Caban wrote:
> Hi Gabriel,
>
> On 05.02.2020 18:38, Gabriel Ivăncescu wrote:
>> Sorry for the noise, but another idea just dawned on me.
>>
>> What if we ref count the named_item_t itself, and store it from
>> vbscode_t instead. Then, we set the item->script_obj to NULL when it
>> has to be recreated (for persistent code). This shouldn't affect
>> external users that hold ScriptDisp, since it's only referenced from
>> vbscode_t.
>>
>> Of course we still unlink the named item from the list when script is
>> uninitialized, since that's what tests show.
>>
>> This approach should, I think, fix all corner cases, even with
>> multiple script dispatches referring to same named item.
>>
>> Thoughts?
>>
>
> Shouldn't we just ignore SCRIPTTEXT_ISPERSISTENT flag when it's executed
> in context of named item? Your tests seem to indicate that such code
> does not survive releasing script. Is there any way they could affect a
> reinitialized script engine?
>
>
> Thanks,
>
> Jacek
>
>
So, I've added a lot more tests as suggested (using arrays/loops to make
it easier to extend), which revealed some interesting quirks that I'll fix.
Now, referring to this part: it seems the code is indeed persistent, so
we can't clear the flag, even though it's not "accessible". Hence why it
probably sent the OnEnterScript/OnLeaveScript in the first place. With
my refcounting named_item_t idea, this should be done without special
cases for those callbacks and actually re-execute it properly.
I used a hacky test to verify that the script with persistent "code
context" does get re-executed even with a dangling context -- I used a
busy loop like the following:
w = DateAdd("s", 5, Now())
Do Until (Now() > w)
Loop
And printed a trace() when script was uninitialized. It then waited
another 5 seconds when it was restarted, proving that the dangling
context code was executed again.
Now, I know that sort of hack is unacceptable for a wine test. Do you
have some idea of how to test for side effects, or should I just let it
be? (I can't use visibleItem because it dies when script is
uninitialized, and even if you re-add it Windows will fail when
restarting the script).
After all, the named_item_t refcounting code will still fix the
OnEnterScript/OnLeaveScript tests, so technically we do have a minor
test for it. Will that be enough?
Thanks,
Gabriel
More information about the wine-devel
mailing list