2015-03-16 2 views
0

Я экспериментирование с двигателем V8, я не программист на С, и это очень трудно для меня .Но мне нужна эта вещь для себяTYPEOF в двигателе V8

меняю функция RUNTIME_FUNCTION (Runtime_Typeof); (Runtime-object.cc) И теперь, если создать прокси в JS:

prx = Proxy.create({ 
get:function(k,v){ 
    if(v == '%type_of%'){ 
     return 'string' 
    } 
    ....... 
} 
}) 

typeof prx -> "string" 

Хорошо, я хочу этот эффект

НО если попытаться сделать сравнения:

typeof prx == 'string' -> false =(
    typeof prx == 'object' -> true 
    (x = typeof prx) == 'string' -> true 

После многих часов я нашел это: В V8 (full-codegen-x64.cc) существует этот func void FullCodeGenerator :: EmitLiteralCompareType из

Он выглядит как Оптимизатор для выражения

typeof prx == "string" || "number" || "object" and etc.. 
    if (String::Equals(check, factory->number_string())) { 
    ... 
    } else if (String::Equals(check, factory->string_string())) { 
    and etc... 

это не называют Runtime_Typeof и

typeof prx -> "string" 
    typeof prx == 'string' -> false =(

Как я могу проверить, если TypeOf ргх это прокси-сервер, то v8 необходимо позвонить по телефону Runtime_Typeof ..

если typeof prx -> string, then typeof == 'string' must be true! Помогите мне пожалуйста

ответ

1

Вы должны были бы испускают код что отличает случаи во время выполнения. Это не слишком сложно, но и не совсем тривиальное изменение. Кроме того, вам также потребуется адаптировать оптимизирующий компилятор.

Но это легкая часть. Изменение значения typeof приведет к поломке других частей системы, которые полагаются на правильную семантику. Например, все использование примитива IS_STRING в встроенных библиотеках V8 станет неправильным - вы, вероятно, столкнетесь с такими проблемами.

Даже если вам удастся исправить все это, идея будет очень сомнительной с точки зрения семантики языка. Существует причина, по которой прокси не могут подделывать строки, в первую очередь, строки не являются объектами. Вы также нарушаете код JavaScript, который опирается на поведение spec'ed.

Вкратце: не. Это действительно плохая идея.

+0

Да, я знаю, что это плохая идея, потому что прокси должен быть объектом С другой стороны, когда я изменил Runtime_Typeof и скомпилировать .. он работает правильно На самом деле я не могу понять, что здесь происходит .. * * аннулируются FullCodeGenerator :: EmitLiteralCompareTypeof (выражение, sub_expr, чек) ** ** sub_expr -> это мой [TypeOf ргх] ** ** {AccumulatorValueContext контекст (это); VisitForTypeofValue (sub_expr); ** _ <- wtf? это означает, что v8 проверяет тип?_ **} ** – Ralo

+0

Тот факт, что он скомпилирован и не сработал сразу, не означает, что он работал «правильно». Возможно, я мог бы создать программу, которая сработала бы под этим изменением с небольшими усилиями. (Я не уверен, что конкретно ваш вопрос выше, но он генерирует код, специально предназначенный для случая, когда RHS является строковым литералом.) –

+0

Андреас Россберг, о том, что вы правы Большое вам спасибо, но мне это действительно нужно: \ – Ralo

Смежные вопросы