在V8中保持UINT64值

时间:2015-03-19 11:00:32

标签: v8 spidermonkey duktape

我正在寻找在我的C / C ++程序中集成脚本引擎。目前,我正在关注Google V8。

如何有效处理V8中的64位值?我的C / C ++程序使用64位值进行扩展,以保持处理程序/指针。我不希望它们在堆上单独分配。似乎有一个V8 ::外部值类型。我可以将它分配给Javascript变量并将其用作值类型吗?

function foo() {

   var a = MyNativeFunctionReturningAnUnsigned64BitValue();

   var b = a; // Hopefully, b is a stack allocated value capable of
              // keeping a 64 bit pointer or some other uint64 structure.

   MyNativeFunctionThatAcceptsAnUnsigned64BitValue(b);

}

如果在V8中无法实现,SpiderMonkey怎么样?我知道Duktape(Javascript引擎)有一个非Ecmascript标准64位值类型(堆栈分配)来托管指针,但我会假设其他引擎也想跟踪其对象内部的外部指针。

1 个答案:

答案 0 :(得分:2)

不,这是不可能的,我担心duktape可能会违反规范,除非它花了很大的力气确保它不可观察。

您可以在对象中存储指针,以便直接在需要指针的对象上存储64位整数:

Local<FunctionTemplate> function_template = FunctionTemplate::New(isolate);
// Instances of this function have room for 1 internal field
function_template->InstanceTemplate()->SetInternalFieldCount(1);

Local<Object> object = function_template->GetFunction()->NewInstance();
static_assert(sizeof(void*) == sizeof(uint64_t));
uint64_t integer = 1;
object->SetAlignedPointerInInternalField(0, reinterpret_cast<void*>(integer));
uint64_t result = reinterpret_cast<uint64_t>(object->GetAlignedPointerInInternalField(0));

这当然远没有效率。