001: /*
002: * ------------------------------------------------------------------------
003: * PACKAGE: [incr Tcl]
004: * DESCRIPTION: Object-Oriented Extensions to Tcl
005: *
006: * This file contains procedures that belong in the Tcl/Tk core.
007: * Hopefully, they'll migrate there soon.
008: *
009: * ========================================================================
010: * AUTHOR: Michael J. McLennan
011: * Bell Labs Innovations for Lucent Technologies
012: * mmclennan@lucent.com
013: * http://www.tcltk.com/itcl
014: *
015: * RCS: $Id: Migrate.java,v 1.1 2005/09/11 20:56:57 mdejong Exp $
016: * ========================================================================
017: * Copyright (c) 1993-1998 Lucent Technologies, Inc.
018: * ------------------------------------------------------------------------
019: * See the file "license.itcl" for information on usage and redistribution
020: * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
021: */
022:
023: package itcl.lang;
024:
025: import tcl.lang.*;
026:
027: class Migrate {
028:
029: /*
030: *----------------------------------------------------------------------
031: *
032: * _Tcl_GetCallFrame -> Migrate.GetCallFrame
033: *
034: * Checks the call stack and returns the call frame some number
035: * of levels up. It is often useful to know the invocation
036: * context for a command.
037: *
038: * Results:
039: * Returns a token for the call frame 0 or more levels up in
040: * the call stack.
041: *
042: * Side effects:
043: * None.
044: *
045: *----------------------------------------------------------------------
046: */
047:
048: static CallFrame GetCallFrame(Interp interp, // interpreter being queried
049: int level) // number of levels up in the call stack (>= 0)
050: {
051: if (level < 0) {
052: Util
053: .Assert(false,
054: "Migrate.GetCallFrame called with bad number of levels");
055: }
056:
057: return ItclAccess.getCallFrame(interp, level);
058: }
059:
060: /*
061: *----------------------------------------------------------------------
062: *
063: * _Tcl_ActivateCallFrame -> Migrate.ActivateCallFrame
064: *
065: * Makes an existing call frame the current frame on the
066: * call stack. Usually called in conjunction with
067: * GetCallFrame to simulate the effect of an "uplevel"
068: * command.
069: *
070: * Note that this procedure is different from Tcl_PushCallFrame,
071: * which adds a new call frame to the call stack. This procedure
072: * assumes that the call frame is already initialized, and it
073: * merely activates it on the call stack.
074: *
075: * Results:
076: * Returns a token for the call frame that was in effect before
077: * activating the new context. That call frame can be restored
078: * by calling _Tcl_ActivateCallFrame again.
079: *
080: * Side effects:
081: * None.
082: *
083: *----------------------------------------------------------------------
084: */
085:
086: static CallFrame ActivateCallFrame(Interp interp, // interpreter being queried
087: CallFrame frame) // call frame to be activated
088: {
089: return ItclAccess.activateCallFrame(interp, frame);
090: }
091:
092: /*
093: *----------------------------------------------------------------------
094: *
095: * _TclNewVar -> Migrate.NewVar
096: *
097: * Create a new variable that will eventually be
098: * entered into a hashtable.
099: *
100: * Results:
101: * The return value is a reference to the new variable structure. It is
102: * marked as a scalar variable (and not a link or array variable). Its
103: * value initially is null. The variable is not part of any hash table
104: * yet. Since it will be in a hashtable and not in a call frame, its
105: * name field is set null. It is initially marked as undefined.
106: *
107: * Side effects:
108: * Storage gets allocated.
109: *
110: *----------------------------------------------------------------------
111: */
112:
113: static Var NewVar() {
114: return ItclAccess.newVar();
115: }
116:
117: } // end class Migrate
|