diff options
author | dkf <donal.k.fellows@manchester.ac.uk> | 2011-10-02 16:29:42 (GMT) |
---|---|---|
committer | dkf <donal.k.fellows@manchester.ac.uk> | 2011-10-02 16:29:42 (GMT) |
commit | 28efdc8a7830a383b4c27727ce1a879727756958 (patch) | |
tree | 78ba81a5aec65786bae802dffe6380b52637f19e /generic/tclExecute.c | |
parent | 9f6d7b9f3e4e3b2920f51e94c6444e6e41c8e195 (diff) | |
download | tcl-28efdc8a7830a383b4c27727ce1a879727756958.zip tcl-28efdc8a7830a383b4c27727ce1a879727756958.tar.gz tcl-28efdc8a7830a383b4c27727ce1a879727756958.tar.bz2 |
Experimental compilation of the [dict with] subcommand. No tests yet, and not
yet certain that the added bytecode opcodes are correct; evaluation is still
needed (but the test suite does pass...)
Diffstat (limited to 'generic/tclExecute.c')
-rw-r--r-- | generic/tclExecute.c | 45 |
1 files changed, 41 insertions, 4 deletions
diff --git a/generic/tclExecute.c b/generic/tclExecute.c index 691c8d7..e3db83e 100644 --- a/generic/tclExecute.c +++ b/generic/tclExecute.c @@ -1992,9 +1992,8 @@ TclNRExecuteByteCode( * Push the callback for bytecode execution */ - TclNRAddCallback(interp, TEBCresume, TD, - /*resume*/ INT2PTR(0), NULL, NULL); - + TclNRAddCallback(interp, TEBCresume, TD, /*resume*/ INT2PTR(0), + NULL, NULL); return TCL_OK; } @@ -5625,7 +5624,7 @@ TEBCresume( { int opnd2, allocateDict, done, i, allocdict; - Tcl_Obj *dictPtr, *statePtr, *keyPtr; + Tcl_Obj *dictPtr, *statePtr, *keyPtr, *listPtr, *varNamePtr, *keysPtr; Tcl_Obj *emptyPtr, **keyPtrPtr; Tcl_DictSearch *searchPtr; DictUpdateInfo *duiPtr; @@ -6105,6 +6104,44 @@ TEBCresume( } } NEXT_INST_F(9, 1, 0); + + case INST_DICT_EXPAND: + dictPtr = OBJ_UNDER_TOS; + listPtr = OBJ_AT_TOS; + if (TclListObjGetElements(interp, listPtr, &objc, &objv) != TCL_OK) { + TRACE_WITH_OBJ(("%.30s %.30s => ERROR: ", + O2S(dictPtr), O2S(listPtr)), Tcl_GetObjResult(interp)); + goto gotError; + } + objResultPtr = TclDictWithInit(interp, dictPtr, objc, objv); + if (objResultPtr == NULL) { + TRACE_WITH_OBJ(("%.30s %.30s => ERROR: ", + O2S(dictPtr), O2S(listPtr)), Tcl_GetObjResult(interp)); + goto gotError; + } + TRACE_APPEND(("%.30s\n", O2S(objResultPtr))); + NEXT_INST_F(1, 2, 1); + + case INST_DICT_RECOMBINE: + varNamePtr = OBJ_AT_DEPTH(2); + listPtr = OBJ_UNDER_TOS; + keysPtr = OBJ_AT_TOS; + if (TclListObjGetElements(interp, listPtr, &objc, &objv) != TCL_OK) { + TRACE_WITH_OBJ(("%.30s %.30s %.30s => ERROR: ", + O2S(varNamePtr), O2S(listPtr), O2S(keysPtr)), + Tcl_GetObjResult(interp)); + goto gotError; + } + if (TclDictWithFinish(interp, varNamePtr, objc, objv, + keysPtr) != TCL_OK) { + TRACE_WITH_OBJ(("%.30s %.30s %.30s => ERROR: ", + O2S(varNamePtr), O2S(listPtr), O2S(keysPtr)), + Tcl_GetObjResult(interp)); + goto gotError; + } + TclDecrRefCount(keysPtr); + POP_OBJECT(); + NEXT_INST_F(1, 2, 0); } /* |