V8发动机的类型

时间:2015-03-16 10:18:50

标签: javascript c++ google-chrome v8 chromium

我正在尝试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! 请帮帮我

1 个答案:

答案 0 :(得分:1)

您需要发出代码,以区分案例在运行时。这不是太难,但也不是一个完全微不足道的改变。此外,您还需要调整优化编译器。

但这很容易。改变typeof的含义将破坏系统的其他部分,这依赖于正确的语义。例如,V8内置库中IS_STRING原语的所有使用都将变得不正确 - 您可能会以这种方式引入崩溃。

即使你设法解决了所有问题,从语义语义的角度来看,这个想法也会非常值得怀疑。代理不能伪造字符串是有原因的,首先,字符串不是对象。您还将破坏依赖于特定行为的JavaScript代码。

简而言之:。这是一个非常糟糕的主意。