V8 发动机的类型
Typeof in V8 engine
我正在试验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 代码。
简而言之:不要。这是一个非常糟糕的主意。
相关文章:
- 为什么会出现错误;未捕获的类型错误:undefined不是函数;
- 如何在DOM元素上按类型构建此函数
- 同样,同样的错误'ahorcado.js:26未捕获类型错误:无法读取属性'beginPath'
- YUI3 IO实用程序是否可以根据给定的内容类型标头值自动序列化数据
- Webpack/Rect:遵循egghead.io教程,但出现错误:您可能需要一个合适的加载程序来处理此文件类型
- 如何从querySelectorAll中获取按钮类型
- 如何在输入字段中的按钮的帮助下打开日历,该字段的类型为“=”;日期”;
- 如何将具有文本类型值的var放入jQuery函数中
- javascript解释器如何理解变量的数据类型
- 可变大小的JavaScript字符串如何成为基元类型
- AngularJS指令只识别双向绑定类型
- 在<输入类型=“;文件“/>
- 从查询字符串参数推断出正确的数据类型
- 未捕获的类型错误:无法读取属性'删除'的未定义
- 为什么不'我们在javascript中使用函数参数的数据类型
- Javascript 可选类型提示
- 可以<脚本类型=“;text/javascript”>window.location=“/"</
- 未捕获的类型错误:无法读取属性'name'即使它存在,也无法定义
- html5视频中的Youtube类型注释
- V8 发动机的类型