如何解析c ++ v8中的arguments对象

时间:2011-12-03 21:03:48

标签: c++ v8

我希望使用google v8引擎访问javascript到我的c ++函数,并根据我的javascript函数中的参数返回结果。

我的javascript功能如下:

var result = MyFc(
                 {
                  'stringData':'abc',
                  'numberData':123,
                  'arrData':[1,2,3],
                  'objData':{'a':true,'b':false,'c':true},
                  'callback':function(){}
                 }
);

我用过

global->Set(v8::String::New("myFc"), v8::FunctionTemplate::New(MyFc));

v8::Handle<v8::Value> MyFc(const v8::Arguments& args) {
  obj = args[0]->...
  if( obj->stringData != 'abc' ){
      //....
  }
  if( obj->numberData != 123 ){
      //....
  }
  if( obj->arrData[2] != 3 ){
      //....
  }
  if( obj->objData->b == false ){
      //....
  }
  if( obj->callback !='abc' ){
      //....
  }
}

我的问题是如何在c ++ v8中解析参数对象?我想访问参数中对象的所有键值,值可以是数字,字符串,数组,匿名函数或对象。

2 个答案:

答案 0 :(得分:13)

使用v8::ValueIsBoolean()IsArray()IsObject()等)的类型检查方法,然后v8::Handle<T>::Cast(v8::Handle<S>)args[i]值转换为相应的类型。

您的代码应如下所示:

if (args[0]->IsArray()) {
    Handle<Array> array = Handle<Array>::Cast(arg[0]);
    for (int i = 0; i < array->Length(); i++) {
       //...
    }
}
if (args[1]->IsObject()) {
    Handle<Object> object = Handle<Object>::Cast(args[i]);
    Handle<Value> fieldValue = object->Get(String::New("a"));
    Handle<Value> callback = object->Get(String::New("callback"));
    if (callback->IsFunction()) {
        Handle<Function> fn = Handle<Function>::Cast(callback);
    }
}

答案 1 :(得分:0)

注意

  

此方法仅适用于Node JS版本0.8 截至8月19日,   2013 v8 juice project由于不兼容程度而被放弃   2013年上半年核心v8的变化。

     

致力于更新the code aponxi/npm-execxi以解释C ++中的JavaScript变量   不使用cvv8库。


这是我处理参数的方式。我希望这有助于某人!

完整脚本来自execxi.cpp aponxi/npm-execxi

注意:我正在使用v8::juice将JS转换为C ++

#include <node/node.h>
#include <v8.h>
#include <stdio.h>
#include <stdlib.h>
#include <cstdio>

#include <cvv8/convert.hpp>

#include <iostream>
#include <string>
#include <sstream>
#include <set>
namespace cv = cvv8;
using namespace v8;

Handle<Value> executeArray(const Arguments& args) {
    HandleScope scope;

// here I define default options in c++
// later we will parse options that come from js
// and convert values to C++ values, and replace
// these default options with the one provided
// for the sace of example I just copy pasted one
// option here:

    // OPTIONS
    /////////////////////

    //
    // Chained (bool)
    //   If a command doesn't exit with 0 then we won't run the next command
    //   default: true
    bool Chained = true;

// there is code here that checks if first arguments is passed
// and handles that argument
// the second argument is options, as if 
// "myfunction("arg1", {chained: false})"
// comes from javascript.
// This part below checks if there are two arguments
// since passing options is totally optional.
// we begin by checking if two arguments are passed:

if (args.Length() == 2)
    {
      if (args[1]->IsObject())
      {
        // you must be passing options...
        // it must be an object


        Handle<Object> opt = Handle<Object>::Cast(args[1]);

        if (opt->Has(String::New("chained"))) {
          // you passed chained option
          if ((opt->Get(String::New("chained"))->IsBoolean())){
            // the chained option must be bool
            Handle<Value> _chained = opt->Get(String::New("chained"));
            Chained = cv::CastFromJS<bool>(_chained);

          } else {
            // chained is not bool, throw error
            ThrowException(Exception::TypeError(String::New("not bool")));
            return scope.Close(Undefined());
          }
        }
    }
  }
}