V8 发动机的类型

Typeof in V8 engine

本文关键字:类型 发动机 V8      更新时间:2023-09-26

我正在试验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 =(

我如何检查 prx 的类型是否是代理,然后 v8 必须调用 Runtime_Typeof..

如果typeof prx -> string, then typeof == 'string' must be true! 请帮帮我

您需要发出在运行时区分大小写的代码。这并不难,但也不是完全微不足道的变化。此外,您还需要调整优化编译器。

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

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

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