Macro: DF$OBJECT
#IF (!b & 2) // if within a class
#IF ( (!b & 4)=0 ) // should be within a method
#ERROR DFERR_COMP_ILLEGAL_CODE_PLACEMENT Objects in classes should be within a method
#ENDIF
#ENDIF
// if we are within a method we will keep track of the number of
// nested objects. When the method ends we will verify that this is 0.
// This lets us warn about mismathed object/end-object commands
#IF ( !b & 4) // if object within method
#SET ZM$ !ZM // increment
#ENDIF
#DATA // start up the data stream
#PUSH !Zj // save the unique object label
#PUSH !b // save current definition state
#IF (!b > 0) // if not global..we make no guesses about
// dependent numbers. Let the runtime assign
// dependent order.
//#IF (!b = 4) // if in procedure and not class
#SET ZJ$ 0 // do not inc z
#ELSE
#SET ZJ$ !ZB // assign the next object id
#ENDIF
#PUSH !Zb // save this level on stack
#IFDEF !4.AGG // was this a class with sub objects?
#SET ZB$ !4.AGG // sub objects will begin at the
#ELSE // next object after superclass
#SET ZB$ 0 // base classes start at 0
#ENDIF
#SET ZI$ !ZI // count this object at the current level
#PUSH !Zi // and push the level
#IF (!b > 0) // if (in_object | in_class)
#IF (!b & 2) // obj_flag == in_class?
#IF (!b & 1) // obj_flag == in_Object?
#ELSE // No Name for Subobject in constructor
// don't define this anymore...
//#REPLACE !$.!1.OBJ |CI-!Zj // object_name = -current_object
#ENDIF
#ENDIF
// (LS) removed setting of ZJ; it is NOT being used.
// (Removed when max lines increased > 32k)
// #SET ZJ$ (32766-!a) // a very unique label for this object
#DPUSH |CS".!1" // make name from parent and child
#ELSE // global object name
#DPUSH |CS"!1" // assign an absolute name to object
#ENDIF
#CHECK U_!4 _U // does class exist?
#DPUSH U_!4 // define then class the class id
GET$OBJ$IMAGE !5 // define the objects image
#IF ((!b & 3) = 2) // if in_class & !in_object
// don't assign dep nums anymore
//#DPUSH !$.!1.OBJ // pick the assigned dependant number
// New code just sets 0
#DPUSH |CI0 // pick the next dependant number
#ELSE //
#IF (!b = 0) // A global object must assign #
#IFDEF !1.OBJ // Is the symbol defined, name_object?
#DPUSH |CI0 // pick the next dependant number
#ELSE
#DPUSH |CI!Zj // force the dependant number
// #SET ZJ$ ($1000+!Zj) // mark as global object
#SET ZJ$ ($10000000+!Zj) // using 32-bit ids now
// as of 8.3 we no longer use dependent lists so we cannot create the ObjName.obj symbol anymore. This method of ussage has
// been deprecated since early framework days and it is now no longer suppoted. The only way you can use the .obj method is to
// use name_object, which moves this into a global integer variable. Developers are advised to change the ObjName.obj to
// (ObjName(desktop)).
// Also I don't think the above Zj is even needed, but for now they remain.
//#REPLACE !1.OBJ |CI!Zj // Assign an ID to this object
#ENDIF
#ELSE
#DPUSH |CI0 // pick the next dependant number
#ENDIF
#ENDIF
REGISTER_OBJECT !1
#DPUSH GET_!1
#SET B$ (!b | 1) // we are in a object definition
!A [] OBJ$CREATE |VL // create the object now
#IFDEF !1.OBJ
#IFCLASS !1.OBJ V$ // does this object have a global?
MOVE CURRENT_OBJECT TO !1.OBJ // Move the object id to its global
#ENDIF
#ENDIF
#SPUSH //save the old class name
#SET $$ !4
#IFSUB '!$$SC' // if flex-defined class
#IFSUB '!$$SM' // if begin-instance macro exists
#IFDEF IS$WINDOWS
// in windows we know that an image is always passed (object creates one if needed)
// and that images are never used. Therefore replace image argument with 0.
!$$SM !$ 0 !6 !7 !8 !9
#ELSE
// character might be passing an image and it might not. We must pass the value
!$$SM !$ !5 !6 !7 !8 !9
#ENDIF
#ELSE
FORWARD_BEGIN_CONSTRUCT !$ !5 !6 !7 !8 !9
#ENDIF
#ELSE
ADD$IMAGE$ARGS MSG_CONSTRUCT_OBJECT !5 !6 !7 !8 !9 //else use default
#ENDIF