23 init(Tcl_NewStringObj(value.
data(), int(value.
size())));
29 init(Tcl_NewStringObj(value.
data(), int(value.
size())));
39 : interp(interp_.interp)
45 : interp(object.interp)
56 void TclObject::init(Tcl_Obj* obj_)
59 Tcl_IncrRefCount(obj);
64 Tcl_DecrRefCount(obj);
70 Tcl_DecrRefCount(obj);
71 interp = other.interp;
87 void TclObject::throwException()
const
89 string_ref message = interp ? Tcl_GetStringResult(interp)
96 if (Tcl_IsShared(obj)) {
97 Tcl_DecrRefCount(obj);
98 obj = Tcl_NewStringObj(value.
data(), int(value.
size()));
99 Tcl_IncrRefCount(obj);
101 Tcl_SetStringObj(obj, value.
data(), int(value.
size()));
107 if (Tcl_IsShared(obj)) {
108 Tcl_DecrRefCount(obj);
109 obj = Tcl_NewIntObj(value);
110 Tcl_IncrRefCount(obj);
112 Tcl_SetIntObj(obj, value);
118 if (Tcl_IsShared(obj)) {
119 Tcl_DecrRefCount(obj);
120 obj = Tcl_NewBooleanObj(value);
121 Tcl_IncrRefCount(obj);
123 Tcl_SetBooleanObj(obj, value);
129 if (Tcl_IsShared(obj)) {
130 Tcl_DecrRefCount(obj);
131 obj = Tcl_NewDoubleObj(value);
132 Tcl_IncrRefCount(obj);
134 Tcl_SetDoubleObj(obj, value);
140 if (Tcl_IsShared(obj)) {
141 Tcl_DecrRefCount(obj);
142 obj = Tcl_NewByteArrayObj(buf, length);
143 Tcl_IncrRefCount(obj);
145 Tcl_SetByteArrayObj(obj, buf, length);
171 if (Tcl_IsShared(obj)) {
172 Tcl_DecrRefCount(obj);
173 obj = Tcl_DuplicateObj(obj);
174 Tcl_IncrRefCount(obj);
176 if (Tcl_ListObjAppendElement(interp, obj, element) != TCL_OK) {
184 if (Tcl_GetIntFromObj(interp, obj, &result) != TCL_OK) {
193 if (Tcl_GetBooleanFromObj(interp, obj, &result) != TCL_OK) {
202 if (Tcl_GetDoubleFromObj(interp, obj, &result) != TCL_OK) {
211 char* buf = Tcl_GetStringFromObj(obj, &length);
217 return static_cast<const byte*
>(Tcl_GetByteArrayFromObj(
218 obj, reinterpret_cast<int*>(&length)));
224 if (Tcl_ListObjLength(interp, obj, &result) != TCL_OK) {
233 if (Tcl_ListObjIndex(interp, obj, index, &element) != TCL_OK) {
236 return element ?
TclObject(interp, element)
243 if (Tcl_DictObjGet(interp, obj, key.obj, &value) != TCL_OK) {
253 if (Tcl_ExprBooleanObj(interp, obj, &result) != TCL_OK) {
262 parse(tmp.
data(), int(tmp.
size()),
true);
268 parse(tmp.
data(), int(tmp.
size()),
false);
271 void TclObject::parse(
const char* str,
int len,
bool expression)
const
276 Tcl_ParseExpr(interp, str, len, &info) :
277 Tcl_ParseCommand(interp, str, len, 1, &info) != TCL_OK) {
281 ~Cleanup() { Tcl_FreeParse(p); }
283 } cleanup = { &info };
286 if (!expression && (info.tokenPtr[0].type == TCL_TOKEN_SIMPLE_WORD)) {
289 Tcl_Token& token2 = info.tokenPtr[1];
290 string procname(token2.start, token2.size);
291 if (!Tcl_GetCommandInfo(interp, procname.c_str(), &cmdinfo)) {
292 throw CommandException(
"invalid command name: \"" +
296 for (
auto i :
xrange(info.numTokens)) {
297 Tcl_Token& token = info.tokenPtr[i];
298 if (token.type == TCL_TOKEN_COMMAND) {
299 parse(token.start + 1, token.size - 2,
false);
300 }
else if ((token.type == TCL_TOKEN_VARIABLE) &&
301 (token.numComponents == 1)) {
303 Tcl_Token& token2 = info.tokenPtr[i + 1];
304 string varname(token2.start, token2.size);
305 if (!Tcl_GetVar2Ex(interp, varname.c_str(),
nullptr,
306 TCL_LEAVE_ERR_MSG)) {
307 throw CommandException(Tcl_GetStringResult(interp));
316 int flags = compile ? 0 : TCL_EVAL_DIRECT;
317 int success = Tcl_EvalObjEx(interp, obj, flags);
318 string result = Tcl_GetStringResult(interp);
319 if (success != TCL_OK) {