Re[4]: protect variables
От: c-smile Канада http://terrainformatica.com
Дата: 09.03.16 03:49
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Здравствуйте, c-smile, Вы писали:


CS>>аргументы или перменные — не важно.

CS>>Они все на стеке лежат если рассматривать идеальную "C машину".

EP>Не идеальную, а простую.


CS>>Практика показывает что не всегда на стеке, а например в регистрах.

CS>>Не сильно хочется влазить в специфику процессоров или компиляторов. Сейчас оно компилируется всем что шевелится, т.е. чистый и незамутнённый C/C++.
CS>>Но если без этого никак то придётся наверное.

EP>Даже если будешь некроссплатформенно сканировать регистры и стек, то проблема с консервативностью всё равно останется


Согласен.

EP>Либо через TLS, либо через быструю маску по адресу — проблема доп параметра решается. Ещё есть какие-нибудь барьеры для использования RAII обёрток?


EP>P.S. В SpiderMonkey используются именно RAII обёртки:


RAII оно не бесплатное к сожалению. Мне не нравится что приходится создавать RAII объекты когда технически они будут действительно нужны в 0.01 % случаев.
Обычно исполнение кода GC не вызывает. Ну и потом в JS/SS много функций с переменным числом параметров. И далеко не всегда известно что там будет.

Вот
  имплементация функции
static value CSF_concat(VM *c)
{
    value vector = ThisVector(c);
    value nvector = 0;
    PROTECT(vector,nvector);

    FETCH(c, vector);
    int n = c->argc - 3 + 1;
    if( n == 0)
      return vector;

    int_t d = CsVectorSize(c,vector);
    int i;

    int_t extra = 0;
    for( i = 3; i <= c->argc; ++i )
    {
      value t = CsGetArg(c,i);
      if( CsVectorP(t) )
        extra += CsVectorSize(c,t); 
      else
        extra ++; 
    }
    nvector = CsMakeVector(c,d+extra, CsVectorClass(vector));
    
    n = d;
    for( i = 0; i < d; ++i )
      CsSetVectorElement(c,nvector, i, CsVectorElement(c,vector,i));

    for( i = 3; i <= c->argc; ++i )
    {
      value t = CsGetArg(c,i);
      if( CsVectorP(t) )
      {
        for(int j = 0; j < CsVectorSize(c,t); ++j)
          CsSetVectorElement(c,nvector,n++,CsVectorElement(c,t,j));
      }
      else
        CsSetVectorElement(c,nvector,n++,t);
    }
    return nvector;
}

array.concat(p1,p2,p3, ...)

там вообще параметров нет, берутся непосредственно со стека VM.

Эх, что-то мне говорит что придется так и жить с этим PROTECT ... Нет шастя в жизни ...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.