为什么Boolean :: New()返回一个Handle<>而其他原语返回Local<>?

时间:2012-09-01 16:55:12

标签: boolean v8 language-implementation

这些是在V8 C ++ API中创建新原语的函数:

Handle<Boolean> v8::Boolean::New(bool value)
Local<Number> v8::Number::New(double value)
Local<String> v8::String::New(const char *data, int length=-1)

我想知道为什么Boolean会返回Handle而其他人返回Local

我的假设是,它与只有两个可能值的布尔有关,但不幸的是,文档真的很差,并且没有提到类似的东西。

1 个答案:

答案 0 :(得分:5)

这是Boolean :: New的实现:(v8.h

Handle<Boolean> Boolean::New(bool value) {
  return value ? True() : False();
}

以下是我们从api.cc获得的信息:

v8::Handle<Boolean> True() {
  i::Isolate* isolate = i::Isolate::Current();
  if (!EnsureInitializedForIsolate(isolate, "v8::True()")) {
    return v8::Handle<Boolean>();
  }
  return v8::Handle<Boolean>(
      ToApi<Boolean>(isolate->factory()->true_value()));
}

看起来他们正在为每个Isolate实现真值和假值。 AFAIK这是虚拟机中经常使用的一种技术,用于减少创建对象的数量 - 例如,Java实习生所有字符串文字,以及布尔和字节对象(即使仅在JVM规范中为字符串提及实习,我'我们也看到它发生在小整数等等。)。