Здравствуйте, 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 ... Нет шастя в жизни ...