我正在尝试V8引擎,我不是C程序员,对我来说很难。但我自己需要这个东西
我更改了一个函数 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 )中存在此函数void FullCodeGenerator :: EmitLiteralCompareTypeof
它看起来像表达式的优化器
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 prx 是否为代理,然后v8必须调用 Runtime_Typeof ..
如果typeof prx -> string, then typeof == 'string' must be true!
请帮帮我
答案 0 :(得分:1)
您需要发出代码,以区分案例在运行时。这不是太难,但也不是一个完全微不足道的改变。此外,您还需要调整优化编译器。
但这很容易。改变typeof的含义将破坏系统的其他部分,这依赖于正确的语义。例如,V8内置库中IS_STRING原语的所有使用都将变得不正确 - 您可能会以这种方式引入崩溃。
即使你设法解决了所有问题,从语义语义的角度来看,这个想法也会非常值得怀疑。代理不能伪造字符串是有原因的,首先,字符串不是对象。您还将破坏依赖于特定行为的JavaScript代码。
简而言之:不。这是一个非常糟糕的主意。