Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Ошибка 1009, но объект существует... (http://www.flasher.ru/forum/showthread.php?t=154514)

wvxvw 18.04.2011 23:01

Ошибка 1009, но объект существует...
 
Я в расстеряности... строчкой выше объект существует, а строчкой ниже - NPE. Я уже все возможные варианты перебрал, какие мог придумать. Дисассемблил, не видно там ничего такого... вобщем мистика какая-то, может у кого-нибудь будут идеи?

Функция в которой случается ошибка:
Код AS3:

public function read(from:AS3Sinks, flags:Vector.<Function>):Boolean
{
        var word:String;
        var subseq:String = from.source.substr(from.column);
        word = subseq.match(from.settings.alphaNumRegExp)[0];
        trace(flags[2], flags[2].apply, flags[2].length, flags[2](false));
        var foo:Function = flags[2];
        trace(foo); // function Function() {}
//        flags[0](false);
//        flags[1](false);
//        flags[2](false);
        foo(false); // NPE
 
        for (var i:int; i < word.length; i++)
        {
                from.advanceColumn(word.charAt(i));
        }
        if (from.onDefault)
                from.appendCollectedText(from.onDefault(word));
        return from.column < from.source.length;
}
// Функция, которую она вызывает: flags[2]
private function collectWords(value:Boolean):void
{
        this._collectWords = value;
}

http://a7.sphotos.ak.fbcdn.net/hphot..._3116299_n.jpg

ZZZubec 18.04.2011 23:18

а чему равен flags[2]? ясно
Я попробывал со статикой, всё гут. думаю...
и с динамиком тоже...
Код AS1/AS2:

var flags:Vector.<Function> = new Vector.<Function>();
flags.push( test );
flags.push( test );
flags.push( test );
var foo:Function = flags[2];
trace( flags[2] );
trace( foo );
foo( true );

вывод:
function Function() {}
function Function() {}
activate test: true

wvxvw 18.04.2011 23:36

Фишка в том, что функция вызывается несколько раз, и отрабатывает пару раз как нужно, а потом вдруг "забывает". Функция вызывается таким образом:

Код AS3:

while (nextSink = this._stack.next())
{
        //----------------------------------------\/  Вот это она.
        if (nextSink.isSinkStart(this) && nextSink.read(this, flags))
                this._stack.reset();
}

Код:

        debugline            17
        findpropstrict        :trace
        getlocal              5
        callproperty          :trace (1)
        pop                 
        debugline            21
        getlocal              5
        getglobalscope       
        pushfalse           
        call                  (1)
        pop

Это непосредственно проблемное место. Если чесно, я не знаю, что делает getglobalscope почему именно им воспользовались в данном случае...

ZZZubec 18.04.2011 23:43

а что если нет доступа не к функции, а к переменной this._collectWords

wvxvw 19.04.2011 00:18

как это нет, а как же он тогда скомпилировался? :) И не доходит он туда вообще, он умирает именно на строчке с вызовом функции, но не понятно, что он ищет (или где).

EDIT:
Дальше больше... получил NPE в вот такой вот строчке:
Код AS3:

super._collected.splice(0, super._collected.length);

super._collected объявлен так:
Код AS3:

protected const _collected:Vector.<String> = new <String>[];


ChuwY 19.04.2011 02:30

Ничего тут к сожалению не понял, но вспомнил баг, который недавно сам словил.
В одном месте (уже переписанном раза три) на простой строчке, где делался splice из вектора (по вполне существующему индексу) вываливался OutOfMemoryError. Причем, кажется, даже не на всех браузерах + в дебаге.
Может дело в версии плеера?


P.S. Последнего сообщения не видел. Вот примерно так же.

mikhailk 19.04.2011 13:02

Цитата:

Дальше больше... получил NPE в вот такой вот строчке:
интереса ради собрал конструкцию, никакой ошибки нет

Код AS3:

package  
{
 
        public class MainClass
        {
                protected const _collected:Vector.<String> = new <String>[];
 
                public function MainClass()
                {
                        _collected.push("test");
                }
 
        }
 
}

Код AS3:

package  
{
 
        public class NewClass extends MainClass
        {
 
                public function NewClass()
                {
                        trace("NewClass::NewClass super._collected.length",super._collected.length);
                        super._collected.splice(0, super._collected.length);
 
                        trace("NewClass::NewClass super._collected.length after splice",super._collected.length);
                }
 
        }
 
}

Вывод:

Код:

NewClass::NewClass super._collected.length 1
NewClass::NewClass super._collected.length after splice 0


wvxvw 19.04.2011 14:41

Так фишка-то в чем - и не должно быть ошибки. Ошибка только проявляется в конкретном проекте при определенном стечении обстоятельств, а вот какие именно обстоятельства важны для ее проявления - не понятно.

mikhailk 19.04.2011 15:07

как я понимаю, тут вариантов-то не много
либо сам вектор стал нуллом, либо параметры splice ссылаются на несуществующий индекс, т.е., нуллом является элемент вектора

ну, если конечно исключить баг плеера при использовании splice

я бы выставил отладочную печать в этом месте и банально ждал сбоя

wvxvw 19.04.2011 16:24

Вложений: 1
Так посмотрите внимательно на скриншот (кстати, вот еще один). Отладчик видит вектор, и ошибка возникает не при попытке вызвать splice - еще до того, когда обращаемся к length. Т.е. это бага либо плеера либо компилятора, а вот кого именно и что именно происходит - не понятно.


Часовой пояс GMT +4, время: 10:48.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.