V8中的Typeof和Expression *

时间:2015-03-17 15:17:46

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

我正在试验V8引擎。

在V8(full -codegen-x64.cc)中存在此函数用于比较类型:

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

所以,例如:

   typeof Obj == "object"

然后 sub_expr 是一个表达式对象&#34; typeof Obj&#34; 检查是一个&#34;对象&#34;

如果可能的话,如何从Expression对象获取JSObject? - 不可能(你不能。表达式是一段语法Andreas Rossberg)

在void 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运行代码?

1 个答案:

答案 0 :(得分:3)

你不能。 Expression是一段语法,JSObject是一个运行时对象。他们完全没有任何关系。