diff options
| author | jan.nijtmans <nijtmans@users.sourceforge.net> | 2017-06-02 11:08:57 (GMT) |
|---|---|---|
| committer | jan.nijtmans <nijtmans@users.sourceforge.net> | 2017-06-02 11:08:57 (GMT) |
| commit | 43f72f639e769da85db050f2e571b556502f32ab (patch) | |
| tree | 183b8ac2ca67fab6772f6e9738009e6a65799d4d /generic/tclExecute.c | |
| parent | 242f56b0931124121db5ea095c3fdc57c7240059 (diff) | |
| parent | f5f03750c82c00fb96383a48414a553b53130d73 (diff) | |
| download | tcl-43f72f639e769da85db050f2e571b556502f32ab.zip tcl-43f72f639e769da85db050f2e571b556502f32ab.tar.gz tcl-43f72f639e769da85db050f2e571b556502f32ab.tar.bz2 | |
merge trunk
Diffstat (limited to 'generic/tclExecute.c')
| -rw-r--r-- | generic/tclExecute.c | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/generic/tclExecute.c b/generic/tclExecute.c index 5c701a2..dbbea34 100644 --- a/generic/tclExecute.c +++ b/generic/tclExecute.c @@ -2628,11 +2628,34 @@ TEBCresume( opnd = TclGetUInt1AtPtr(pc+1); + objv = &OBJ_AT_DEPTH(opnd-1); + /* minor optimization in simplest cases */ + switch (opnd) { + case 1: /* only one object */ + objResultPtr = *objv; + goto endINST_STR_CONCAT1; + case 2: /* two objects - check empty */ + if (objv[0]->bytes == &tclEmptyString) { + objResultPtr = objv[1]; + goto endINST_STR_CONCAT1; + } + else + if (objv[1]->bytes == &tclEmptyString) { + objResultPtr = objv[0]; + goto endINST_STR_CONCAT1; + } + break; + case 0: /* no objects - use new empty */ + TclNewObj(objResultPtr); + goto endINST_STR_CONCAT1; + } + /* do concat */ if (TCL_OK != TclStringCatObjv(interp, /* inPlace */ 1, - opnd, &OBJ_AT_DEPTH(opnd-1), &objResultPtr)) { + opnd, objv, &objResultPtr)) { TRACE_ERROR(interp); goto gotError; } + endINST_STR_CONCAT1: TRACE_WITH_OBJ(("%u => ", opnd), objResultPtr); NEXT_INST_V(2, opnd, 1); |
