Beispiel #1
0
int extract(LVariableTable *variables, CArrRef var_array,
            int extract_type /* = EXTR_OVERWRITE */,
            String prefix /* = "" */) {
  FUNCTION_INJECTION_BUILTIN(extract);

  bool reference = extract_type & EXTR_REFS;
  extract_type &= ~EXTR_REFS;

  int count = 0;
  for (ArrayIter iter(var_array); iter; ++iter) {
    String name = iter.first();

    switch (extract_type) {
    case EXTR_SKIP:
      if (variables->exists(name)) continue;
      break;
    case EXTR_IF_EXISTS:
      if (!variables->exists(name)) continue;
      break;
    case EXTR_PREFIX_SAME:
      if (variables->exists(name)) name = prefix + "_" + name;
      break;
    case EXTR_PREFIX_ALL:
      name = prefix + "_" + name;
      break;
    case EXTR_PREFIX_INVALID:
      if (!name.isValidVariableName()) name = prefix + "_" + name;
      break;
    case EXTR_PREFIX_IF_EXISTS:
      if (!variables->exists(name)) continue;
      name = prefix + "_" + name;
      break;
    default:
      break;
    }

    // skip invalid variable names, as in PHP
    if (!name.isValidVariableName()) continue;

    if (reference) {
      variables->get(name).assignRef(iter.secondRef());
    } else {
      variables->get(name).assignVal(iter.second());
    }
    count++;
  }
  return count;
}
Beispiel #2
0
Variant func_get_arg(int num_args, CArrRef params, CArrRef args, int pos) {
  FUNCTION_INJECTION_BUILTIN(func_get_arg);
  if (num_args <= params.size()) {
    if (pos >= 0 && pos < num_args) {
      return params.rvalAt(pos);
    }
  } else {
    if (pos >= 0) {
      int index = pos - params.size();
      if (index < 0) {
        return params.rvalAt(pos);
      }
      if (index < args.size()) {
        return args.rvalAt(index);
      }
    }
  }
  return false;
}
Beispiel #3
0
Array func_get_args(int num_args, CArrRef params, CArrRef args) {
  FUNCTION_INJECTION_BUILTIN(func_get_args);
  if (params.empty() && args.empty()) return Array::Create();
  if (args.empty()) {
    if (num_args < params.size()) {
      return params.slice(0, num_args, false);
    }
    return params;
  }

  Array derefArgs;
  for (ArrayIter iter(args); iter; ++iter) {
    derefArgs.append(iter.second());
  }

  if (params.empty()) return derefArgs;
  ASSERT(num_args > params.size());
  Array ret = Array(params).merge(derefArgs);
  return ret;
}