TYPEOF和表达*在V8(Typeof and Expression* in V8)

2019-10-22 06:34发布

我与V8发动机试验。

在V8(full-codegen-x64.cc)存在此功能比较类型:

void FullCodeGenerator::EmitLiteralCompareTypeof(Expression* expr,
                                             Expression* sub_expr,
                                             Handle<String> check)

所以,如果,例如:

   typeof Obj == "object"

然后sub_expr“typeof运算的OBJ”检查是一个“对象”表达对象

我怎样才能得到一个Expression对象JSObject,如果可能的话? - 不可能的(你不能表达是一件语法安德烈亚斯Rossberg的)

在无效FullCodeGenerator :: EmitLiteralCompareTypeof我们可以检查:

Obj is function   __ CmpObjectType(rax, JS_FUNCTION_TYPE, rdx);
Obj is proxy function  __ CmpInstanceType(rdx, JS_FUNCTION_PROXY_TYPE);
Obj is proxy __ CmpObjectType(rax, FIRST_NONCALLABLE_SPEC_OBJECT_TYPE, rdx);
and etc...

只是举例来说,如果我们将使用此代码:

__ CmpObjectType(rax, FIRST_NONCALLABLE_SPEC_OBJECT_TYPE, rdx);
__ j(equal, if_true);
then
typeof Proxy_Obj == 'string'  ---> true

V8是怎么知道这件事? 难道是说- V8运行代码?

Answer 1:

你不能。 表达式是一块语法,一个JSObject是一个运行时对象。 他们有绝对无关,与对方。



文章来源: Typeof and Expression* in V8