Index: TODO =================================================================== diff -u -r35e0efc0d8851a10c70071c12112b11538ce97af -raa1943604c4de3d538dff67d5e9e238323d37474 --- TODO (.../TODO) (revision 35e0efc0d8851a10c70071c12112b11538ce97af) +++ TODO (.../TODO) (revision aa1943604c4de3d538dff67d5e9e238323d37474) @@ -813,8 +813,10 @@ to xotcl.c, aligned order of method definitions - removed "[o exists varname]" from next scripting language - - reanimated "info vars" to show locals in eval method +- provide error messages for [objectproperty ... type ...] +- replace 0 by NULL in calls to GetClassFromObj() +- extended regression test TODO: - rename source files from xotcl{Int}.{ch}->next*.* | next-scripting*.* ? Index: generic/predefined.h =================================================================== diff -u -r35e0efc0d8851a10c70071c12112b11538ce97af -raa1943604c4de3d538dff67d5e9e238323d37474 --- generic/predefined.h (.../predefined.h) (revision 35e0efc0d8851a10c70071c12112b11538ce97af) +++ generic/predefined.h (.../predefined.h) (revision aa1943604c4de3d538dff67d5e9e238323d37474) @@ -315,7 +315,8 @@ "proc ::nx::core::parametersFromSlots {obj} {\n" "set parameterdefinitions [list]\n" "foreach slot [::nx::objectInfo slotobjects $obj] {\n" -"if {[::nx::core::objectproperty $obj type ::xotcl::Object] &&\n" +"if {[::nx::core::objectproperty ::xotcl::Object class]\n" +"&& [::nx::core::objectproperty $obj type ::xotcl::Object] &&\n" "([$slot name] eq \"mixin\" || [$slot name] eq \"filter\")} continue\n" "array set \"\" [$slot toParameterSyntax]\n" "lappend parameterdefinitions -$(oparam)}\n" Index: generic/predefined.xotcl =================================================================== diff -u -r35e0efc0d8851a10c70071c12112b11538ce97af -raa1943604c4de3d538dff67d5e9e238323d37474 --- generic/predefined.xotcl (.../predefined.xotcl) (revision 35e0efc0d8851a10c70071c12112b11538ce97af) +++ generic/predefined.xotcl (.../predefined.xotcl) (revision aa1943604c4de3d538dff67d5e9e238323d37474) @@ -784,9 +784,10 @@ foreach slot [::nx::objectInfo slotobjects $obj] { # Skip some slots for xotcl; # TODO: maybe different parameterFromSlots for xotcl? - if {[::nx::core::objectproperty $obj type ::xotcl::Object] && + if {[::nx::core::objectproperty ::xotcl::Object class] + && [::nx::core::objectproperty $obj type ::xotcl::Object] && ([$slot name] eq "mixin" || [$slot name] eq "filter") - } continue + } continue array set "" [$slot toParameterSyntax] lappend parameterdefinitions -$(oparam) } Index: generic/xotcl.c =================================================================== diff -u -ra2a10538733f58248a38ab9d13d342ebd0fb475d -raa1943604c4de3d538dff67d5e9e238323d37474 --- generic/xotcl.c (.../xotcl.c) (revision a2a10538733f58248a38ab9d13d342ebd0fb475d) +++ generic/xotcl.c (.../xotcl.c) (revision aa1943604c4de3d538dff67d5e9e238323d37474) @@ -644,7 +644,7 @@ result = callMethod((ClientData) baseClass, interp, methodObj, 3, &nameObj, XOTCL_CM_NO_PROTECT); if (result == TCL_OK) { - result = GetClassFromObj(interp, objPtr, cl, 0); + result = GetClassFromObj(interp, objPtr, cl, NULL); } } DECR_REF_COUNT(nameObj); @@ -6227,7 +6227,7 @@ if (pPtr->converterArg == NULL) return TCL_OK; - if ((GetClassFromObj(interp, pPtr->converterArg, &cl, 0) == TCL_OK) + if ((GetClassFromObj(interp, pPtr->converterArg, &cl, NULL) == TCL_OK) && isSubType(object->cl, cl)) { return TCL_OK; } @@ -6254,7 +6254,7 @@ static int convertToClass(Tcl_Interp *interp, Tcl_Obj *objPtr, XOTclParam CONST *pPtr, ClientData *clientData, Tcl_Obj **outObjPtr) { *outObjPtr = objPtr; - if (GetClassFromObj(interp, objPtr, (XOTclClass **)clientData, 0) == TCL_OK) { + if (GetClassFromObj(interp, objPtr, (XOTclClass **)clientData, NULL) == TCL_OK) { return objectOfType(interp, (XOTclObject *)*clientData, "class", objPtr, pPtr); } return XOTclObjErrType(interp, objPtr, "class", pPtr->name); @@ -7830,7 +7830,7 @@ if (result == TCL_OK) { Tcl_Obj *nameObj = Tcl_GetObjResult(interp); - if (GetClassFromObj(interp, nameObj, &defaultClass, 0) != TCL_OK) { + if (GetClassFromObj(interp, nameObj, &defaultClass, NULL) != TCL_OK) { XOTclErrMsg(interp, "default superclass is not a class", TCL_STATIC); } /*fprintf(stderr, "DefaultSuperClass for %s got from var %s\n", className(cl), ObjStr(nameObj));*/ @@ -11170,7 +11170,7 @@ if (isTypeString(constraintString)) { if (arg== NULL) return XOTclObjErrArgCnt(interp, NULL, NULL, "type "); success = (GetObjectFromObj(interp, valueObj, &object) == TCL_OK) - && (GetClassFromObj(interp, arg, &typeClass, 0) == TCL_OK) + && (GetClassFromObj(interp, arg, &typeClass, NULL) == TCL_OK) && isSubType(object->cl, typeClass); Tcl_SetIntObj(Tcl_GetObjResult(interp), success); @@ -11182,14 +11182,14 @@ if (*constraintString == 'o') { success = (GetObjectFromObj(interp, valueObj, &object) == TCL_OK); } else { - success = (GetClassFromObj(interp, valueObj, (XOTclClass **)&object, 0) == TCL_OK); + success = (GetClassFromObj(interp, valueObj, (XOTclClass **)&object, NULL) == TCL_OK); } if (success && withType) { - success = (GetClassFromObj(interp, withType, &typeClass, 0) == TCL_OK) + success = (GetClassFromObj(interp, withType, &typeClass, NULL) == TCL_OK) && isSubType(object->cl, typeClass); } if (success && withHasmixin) { - success = (GetClassFromObj(interp, withHasmixin, &mixinClass, 0) == TCL_OK) + success = (GetClassFromObj(interp, withHasmixin, &mixinClass, NULL) == TCL_OK) && hasMixin(interp, object, mixinClass); } Tcl_SetIntObj(Tcl_GetObjResult(interp), success); @@ -11699,9 +11699,13 @@ switch (objectkind) { case ObjectkindTypeIdx: if (valueObj == NULL) return XOTclObjErrArgCnt(interp, NULL, NULL, " type "); - success = (GetObjectFromObj(interp, obj, &object) == TCL_OK) - && (GetClassFromObj(interp, valueObj, &cl, 0) == TCL_OK) - && isSubType(object->cl, cl); + if (GetObjectFromObj(interp, obj, &object) != TCL_OK) { + return XOTclObjErrType(interp, obj, "object", "object"); + } + if (GetClassFromObj(interp, valueObj, &cl, NULL) != TCL_OK) { + return XOTclObjErrType(interp, valueObj, "class", "type"); + } + success = isSubType(object->cl, cl); break; case ObjectkindObjectIdx: @@ -11731,7 +11735,7 @@ case ObjectkindHasmixinIdx: if (valueObj == NULL) return XOTclObjErrArgCnt(interp, NULL, NULL, " hasmixin "); success = (GetObjectFromObj(interp, obj, &object) == TCL_OK) - && (GetClassFromObj(interp, valueObj, &cl, 0) == TCL_OK) + && (GetClassFromObj(interp, valueObj, &cl, NULL) == TCL_OK) && hasMixin(interp, object, cl); break; } @@ -11848,7 +11852,7 @@ return XOTclVarErrMsg(interp, "metaclass must be specified as third argument", (char *) NULL); } - GetClassFromObj(interp, valueObj, &metaClass, 0); + GetClassFromObj(interp, valueObj, &metaClass, NULL); if (!metaClass) return XOTclObjErrType(interp, valueObj, "class", ""); cl->object.flags |= XOTCL_IS_ROOT_CLASS; Index: tests/object-system.xotcl =================================================================== diff -u -r5670d611979156a6f4a6654fedc35e9e802e3dee -raa1943604c4de3d538dff67d5e9e238323d37474 --- tests/object-system.xotcl (.../object-system.xotcl) (revision 5670d611979156a6f4a6654fedc35e9e802e3dee) +++ tests/object-system.xotcl (.../object-system.xotcl) (revision aa1943604c4de3d538dff67d5e9e238323d37474) @@ -188,4 +188,12 @@ ? {::nx::core::objectproperty ::C class} 0 +::nx::Class create ::C + +? {catch {::nx::core::objectproperty ::C type ::UNKNOWN}} 1 +? {catch {::C info is type ::xyz::Bar}} 1 +? {catch {::nx::core::objectproperty ::CCCC type ::nx::Object}} 1 + +::C destroy + puts stderr ===EXIT