Octane, хай. может быть поможет:
ссылька
было бы круто заиметь окружение тестирования V8 в своих тестах, чтобы писать типа:
var lib = require('my-lib');
MUST_OPTIMIZE_NEXT_CALL('Передача числа');
lib.atan(45);
MUST_OPTIMIZE_NEXT_CALL('Передача строки'); // функция деоптимизируется. тест кинет ошибку здесь с сообщением "Передача строки"
lib.atan('ЙОЙО');
я вроде помню, во внутренних тестах V8 есть такой ужас(MUST_OPTIMIZE...), но как получить к этому доступ - хз
ну а чтобы конкретно ответить на твой вопрос, нужно качать dev версию v8 на линуксах, вызывать js код из него и смотреть лог движка. сейчас уже нельзя с уверенностью ничего сказать, ибо за год в движках могло многое измениться
вот
причины деооптимизаций. там есть:
Код:
|
V(kAssignmentToParameterFunctionUsesArgumentsObject, \
"Assignment to parameter, function uses arguments object") |
а
вот и место, где она кидается (hydrogen - это оптимизирующий движок в V8, если память не изменяет)
Код:
|
switch (var->location()) {
case Variable::CONTEXT: {
// Bail out if we try to mutate a parameter value in a function
// using the arguments object. We do not (yet) correctly handle the
// arguments property of the function.
if (current_info()->scope()->arguments() != NULL) {
// Parameters will be allocated to context slots. We have no
// direct way to detect that the variable is a parameter so we do
// a linear search of the parameter variables.
int count = current_info()->scope()->num_parameters();
for (int i = 0; i < count; ++i) {
if (var == current_info()->scope()->parameter(i)) {
Bailout(kAssignmentToParameterFunctionUsesArgumentsObject);
}
}
} |
сама
Variable::CONTEXT
Код:
|
// An indexed slot in a heap context. index() is the variable index in
// the context object on the heap, starting at 0. scope() is the
// corresponding scope.
CONTEXT, |
и теперь стало ещё непонятней ...
мало того, что на вопрос не ответил, так и сам запутался
в общем, если кто завладеет D8 в V8, отпишите сюда о результатах пож)