Macro: OBJECT$PROPERTIES
#DATA
#IFDEF !2 // is message in a variable?
#DPUSH !2 // yes, just push the value
#ELSE
#IFDEF !1_!2 // is this message defined?
#DPUSH !1_!2 // yes, push the definition
#ELSE
// If there is no message defined, try matching with mangled symbol.
#IFSAME !1 GET
#MANG !1_!2 !4 !5 !6 !7 !8 !9
#ELSE
#MING !1_!2 !4 !5 !6 !7 !8 !9
#ENDIF
// Push it, if we can, or push a fref to the mangled name.
// Fwd refs try to match without the syntactic sugar first.
#IFDEF !?
// Overloading does not allow File_Field, Field or Item (get only)
#IFSAME FILE_FIELD !2 !3 !4 !5 !6 !7 !8 !9
#ERROR DFERR_COMP_ILLEGAL_METHOD_DEFINTION "FILE_FIELD keyword not allowed in Overloaded messages"
#ELSE
#IFSAME FIELD !2 !3 !4 !5 !6 !7 !8 !9
#ERROR DFERR_COMP_ILLEGAL_METHOD_DEFINTION "FIELD keyword not allowed in Overloaded messages"
#ELSE
#IFSAME !1 GET // GET's #mang does not test for ITEM so we disallow it here.
#IFSAME ITEM !2 !3 !4 !5 !6 !7 !8 !9
#ERROR DFERR_COMP_ILLEGAL_METHOD_DEFINTION "ITEM keyword not allowed or needed in GET Overloaded messages"
#ENDIF
#ENDIF
#ENDIF
#ENDIF
#DPUSH !?
#ELSE
#DPUSH |CI0 // forward reference the message
#FREF !? !a,0 // add the reference to be defined
#ENDIF
#ENDIF
#ENDIF
#PUSH !Zg
#SET ZG$ 0
#PUSH !Zh
#SET ZH$ 2 // 3 unrestricted params following TO and TO is optional
#IF (!Zl & 1)
#SET ZH$ 3 // Its ok...no fancy checking
#ELSE
#IFSAME !1 GET
#SET ZH$ 1 // 1 means 1 param following TO
#ELSE
#IFSAME DFLT$2$!2 __2__ // is this a complex set message? (more than 1 param)
#ELSE
#IFSAME DFLT$!2 __X__ __F__ // is this a item or form type message?
//#IFSAME DFLT$!2 __F__ // is this a item or form type message?
#SET ZH$ 1 // 1 means 1 param following TO
#ENDIF
#ENDIF
#ENDIF
#ENDIF
PROPERTY$HELP !4 !5 !6 !7 !8 !9
#POP ZH$
#POP ZG$
// Precedence of Object ID resolution
// 1. If variable (hopefully local)
// 2. if expression
// 3. If .obj (old style, to be avoided)
// 4. If object access id
#IFDEF !3 // if a variable, constant or expression...it's defined
OBJECT$DEFINE !1 !3
#ELSE
// remove object.OBJ check - must explicitly add .obj if you want it
//#IFDEF !3.OBJ // old style: If global object or defined w/ .obj (ugh)
// OBJECT$DEFINE !1 !3.OBJ
//#ELSE
#IFDEF GET_!3 // if defined as a function
#IF (GET_!3>$40000000) // and an object access method
// replace simple name with expression syntax
OBJECT$DEFINE !1 (!3(Current_object))
#ELSE // if defined as a function but not an access method. This is an error
#ERROR DFERR_COMP_INVALID_OBJECT_REFERENCE "Already defined as a function"
#ENDIF
#ELSE
// 12.0 change:
// !3 is not defined but we will pass this on and allow the compiler to attempt to resolve it
OBJECT$DEFINE !1 (!3(Current_object))
//// not yet defined. We could either forward ref as object or
//// declare an error. For now let's just do an error.
//#ERROR DFERR_COMP_INVALID_OBJECT_REFERENCE Object .not. yet defined
//// here is how we would forward ref as obj
////Register_object !3
////!A [] OBJ$!1 (!3(Current_object)) |VL
#ENDIF
//#ENDIF
#ENDIF