Ejemplo n.º 1
0
void
Itcl_GetVariableFullName(
    Tcl_Interp * interp,
    Tcl_Var variable,
    Tcl_Obj * objPtr)
{
    Tcl_GetVariableFullName(interp, variable, objPtr);
}
Ejemplo n.º 2
0
int
TclOO_Object_VarName(
    ClientData clientData,	/* Ignored. */
    Tcl_Interp *interp,		/* Interpreter in which to create the object;
				 * also used for error reporting. */
    Tcl_ObjectContext context,	/* The object/call context. */
    int objc,			/* Number of arguments. */
    Tcl_Obj *const *objv)	/* The actual arguments. */
{
    Var *varPtr, *aryVar;
    Tcl_Obj *varNamePtr, *argPtr;
    const char *arg;

    if (Tcl_ObjectContextSkippedArgs(context)+1 != objc) {
        Tcl_WrongNumArgs(interp, Tcl_ObjectContextSkippedArgs(context), objv,
                         "varName");
        return TCL_ERROR;
    }
    argPtr = objv[objc-1];
    arg = Tcl_GetString(argPtr);

    /*
     * Convert the variable name to fully-qualified form if it wasn't already.
     * This has to be done prior to lookup because we can run into problems
     * with resolvers otherwise. [Bug 3603695]
     *
     * We still need to do the lookup; the variable could be linked to another
     * variable and we want the target's name.
     */

    if (arg[0] == ':' && arg[1] == ':') {
        varNamePtr = argPtr;
    } else {
        Tcl_Namespace *namespacePtr =
            Tcl_GetObjectNamespace(Tcl_ObjectContextObject(context));

        varNamePtr = Tcl_NewStringObj(namespacePtr->fullName, -1);
        Tcl_AppendToObj(varNamePtr, "::", 2);
        Tcl_AppendObjToObj(varNamePtr, argPtr);
    }
    Tcl_IncrRefCount(varNamePtr);
    varPtr = TclObjLookupVar(interp, varNamePtr, NULL,
                             TCL_NAMESPACE_ONLY|TCL_LEAVE_ERR_MSG, "refer to", 1, 1, &aryVar);
    Tcl_DecrRefCount(varNamePtr);
    if (varPtr == NULL) {
        Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "VARIABLE", arg, NULL);
        return TCL_ERROR;
    }

    /*
     * Now that we've pinned down what variable we're really talking about
     * (including traversing variable links), convert back to a name.
     */

    varNamePtr = Tcl_NewObj();
    if (aryVar != NULL) {
        Tcl_HashEntry *hPtr;
        Tcl_HashSearch search;

        Tcl_GetVariableFullName(interp, (Tcl_Var) aryVar, varNamePtr);

        /*
         * WARNING! This code pokes inside the implementation of hash tables!
         */

        hPtr = Tcl_FirstHashEntry((Tcl_HashTable *) aryVar->value.tablePtr,
                                  &search);
        while (hPtr != NULL) {
            if (varPtr == Tcl_GetHashValue(hPtr)) {
                Tcl_AppendToObj(varNamePtr, "(", -1);
                Tcl_AppendObjToObj(varNamePtr, hPtr->key.objPtr);
                Tcl_AppendToObj(varNamePtr, ")", -1);
                break;
            }
            hPtr = Tcl_NextHashEntry(&search);
        }
    } else {
        Tcl_GetVariableFullName(interp, (Tcl_Var) varPtr, varNamePtr);
    }
    Tcl_SetObjResult(interp, varNamePtr);
    return TCL_OK;
}