示例#1
0
文件: exec.c 项目: cbforks/streem
static int
exec_call(strm_stream* strm, strm_state* state, strm_string name, int argc, strm_value* argv, strm_value* ret)
{
  int n = STRM_NG;
  strm_value m;

  if (argc > 0) {
    strm_state* ns = strm_value_ns(argv[0]);
    if (ns) {
      n = strm_var_get(ns, name, &m);
    }
    else if (argc == 1 && strm_array_p(argv[0])) {
      m = strm_str_value(name);
      n = ary_get(strm, argv[0], 1, &m, ret);
      if (n == STRM_OK) return STRM_OK;
    }
  }
  if (n == STRM_NG) {
    n = strm_var_get(state, name, &m);
  }
  if (n == STRM_OK) {
    return strm_funcall(strm, m, argc, argv, ret);
  }
  strm_raise(strm, "function not found");
  return STRM_NG;
}
示例#2
0
文件: exec.c 项目: cbforks/streem
int
strm_funcall(strm_stream* strm, strm_value func, int argc, strm_value* argv, strm_value* ret)
{
  switch (strm_value_tag(func)) {
  case STRM_TAG_CFUNC:
    return (strm_value_cfunc(func))(strm, argc, argv, ret);
  case STRM_TAG_ARRAY:
    return ary_get(strm, func, argc, argv, ret);
  case STRM_TAG_PTR:
    if (!strm_lambda_p(func)) {
      strm_raise(strm, "not a function");
      return STRM_NG;
    }
    else {
      return lambda_call(strm, func, argc, argv, ret);
    }
  default:
    strm_raise(strm, "not a function");
    break;
  }
  return STRM_NG;
}
示例#3
0
文件: exec.c 项目: likeog/streem
int
strm_funcall(strm_state* state, strm_value func, int argc, strm_value* argv, strm_value* ret)
{
  switch (strm_value_tag(func)) {
  case STRM_TAG_CFUNC:
    return (strm_value_cfunc(func))(state, argc, argv, ret);
  case STRM_TAG_ARRAY:
    return ary_get(state, func, argc, argv, ret);
  case STRM_TAG_PTR:
    if (!strm_lambda_p(func)) {
      strm_raise(state, "not a function");
      return STRM_NG;
    }
    else {
      strm_lambda lambda = strm_value_lambda(func);
      node_lambda* nlbd = lambda->body;
      node_args* args = (node_args*)nlbd->args;
      strm_state c = {0};
      int i, n;

      c.prev = lambda->state;
      if ((args == NULL && argc != 0) &&
          (args->len != argc)) return STRM_NG;
      for (i=0; i<argc; i++) {
        n = strm_var_set(&c, node_to_sym(args->data[i]), argv[i]);
        if (n) return n;
      }
      n = exec_expr(&c, nlbd->compstmt, ret);
      if (c.exc && c.exc->type == NODE_ERROR_RETURN) {
        *ret = c.exc->arg;
        return STRM_OK;
      }
      return n;
    }
  default:
    break;
  }
  return STRM_NG;
}