func (ctx ppctx) fields(obj *otto.Object) []string { var ( vals, methods []string seen = make(map[string]bool) ) add := func(k string) { if seen[k] || boringKeys[k] { return } seen[k] = true if v, _ := obj.Get(k); v.IsFunction() { methods = append(methods, k) } else { vals = append(vals, k) } } // add own properties ctx.doOwnProperties(obj.Value(), add) // add properties of the constructor if cp := constructorPrototype(obj); cp != nil { ctx.doOwnProperties(cp.Value(), add) } sort.Strings(vals) sort.Strings(methods) return append(vals, methods...) }
func gremlinFollowR(kind string, prevObj *otto.Object, env *otto.Otto, ses *GremlinSession) func(otto.FunctionCall) otto.Value { return func(call otto.FunctionCall) otto.Value { call.Otto.Run("var out = {}") out, _ := call.Otto.Object("out") out.Set("_gremlin_type", kind) out.Set("_gremlin_values", call.ArgumentList) outStrings := concatStringArgs(call) if len(*outStrings) > 0 { out.Set("string_args", *outStrings) } if len(call.ArgumentList) == 0 { return prevObj.Value() } arg := call.Argument(0) if isVertexChain(arg.Object()) { return prevObj.Value() } newChain, _ := reverseGremlinChainTo(call.Otto, arg.Object(), "") out.Set("_gremlin_prev", prevObj) out.Set("_gremlin_followr", newChain) embedTraversals(env, ses, out) if isVertexChain(call.This.Object()) { embedFinals(env, ses, out) } return out.Value() } }
func (wk *worker) gremlinFollowR(kind string, prev *otto.Object, env *otto.Otto) func(otto.FunctionCall) otto.Value { return func(call otto.FunctionCall) otto.Value { call.Otto.Run("var out = {}") out, _ := call.Otto.Object("out") out.Set("_gremlin_type", kind) out.Set("_gremlin_values", call.ArgumentList) args := argsOf(call) if len(args) > 0 { out.Set("string_args", args) } if len(call.ArgumentList) == 0 { return prev.Value() } arg := call.Argument(0) if isVertexChain(arg.Object()) { return prev.Value() } newChain, _ := reverseGremlinChainTo(call.Otto, arg.Object(), "") out.Set("_gremlin_prev", prev) out.Set("_gremlin_followr", newChain) wk.embedTraversals(env, out) if isVertexChain(call.This.Object()) { wk.embedFinals(env, out) } return out.Value() } }
func iterOwnKeys(vm *otto.Otto, obj *otto.Object, f func(string)) { Object, _ := vm.Object("Object") rv, _ := Object.Call("getOwnPropertyNames", obj.Value()) gv, _ := rv.Export() switch gv := gv.(type) { case []interface{}: for _, v := range gv { f(v.(string)) } case []string: for _, v := range gv { f(v) } default: panic(fmt.Errorf("Object.getOwnPropertyNames returned unexpected type %T", gv)) } }