diff --git a/src/game/object/C4Object.cpp b/src/game/object/C4Object.cpp index 2f9856fed..d9df184a4 100644 --- a/src/game/object/C4Object.cpp +++ b/src/game/object/C4Object.cpp @@ -4430,7 +4430,7 @@ bool C4Object::GetDragImage(C4Object **drag_object, C4ID *drag_id) if (!parV) return false; // determine drag object/id C4Object *obj=NULL; C4ID id; - if (parV.GetType() == C4V_C4Object) obj = parV.getObj(); + if (parV.CheckConversion(C4V_Object)) obj = parV.getObj(); else if (parV.GetType() == C4V_PropList) id = parV.getC4ID(); if (drag_object) *drag_object = obj; if (drag_id) *drag_id = id; diff --git a/src/game/object/C4ObjectScript.cpp b/src/game/object/C4ObjectScript.cpp index 4013b42d0..ea641d785 100644 --- a/src/game/object/C4ObjectScript.cpp +++ b/src/game/object/C4ObjectScript.cpp @@ -918,7 +918,6 @@ static bool FnAddMenuItem(C4AulObjectContext *cthr, C4String * szCaption, C4Stri case C4V_Bool: SCopy(Parameter.getBool() ? "true" : "false", parameter); break; - case C4V_C4Object: case C4V_PropList: if (Parameter.getPropList()->GetObject()) sprintf(parameter, "Object(%d)", Parameter.getPropList()->GetObject()->Number); @@ -1027,7 +1026,7 @@ static bool FnAddMenuItem(C4AulObjectContext *cthr, C4String * szCaption, C4Stri case C4MN_Add_ImgObjRank: { // draw current gfx of XPar_C4V including rank - if (XPar.GetType() != C4V_C4Object) return false; + if (!XPar.CheckConversion(C4V_Object)) return false; C4Object *pGfxObj = XPar.getObj(); if (pGfxObj && pGfxObj->Status) { @@ -1080,10 +1079,10 @@ static bool FnAddMenuItem(C4AulObjectContext *cthr, C4String * szCaption, C4Stri case C4MN_Add_ImgObject: { // draw object picture - if (XPar.GetType() != C4V_C4Object) + if (!XPar.CheckConversion(C4V_Object)) throw new C4AulExecError(cthr->Obj, FormatString("call to \"%s\" parameter %d: got \"%s\", but expected \"%s\"!", - "AddMenuItem", 8, XPar.GetTypeName(), GetC4VName(C4V_C4Object) + "AddMenuItem", 8, XPar.GetTypeName(), GetC4VName(C4V_Object) ).getData()); C4Object *pGfxObj = XPar.getObj(); fctSymbol.Wdt = fctSymbol.Hgt = iSymbolSize; @@ -2336,9 +2335,9 @@ C4ScriptConstDef C4ScriptObjectConstMap[]= C4ScriptFnDef C4ScriptObjectFnMap[]= { - { "SetCommand", 1 ,C4V_Bool ,{ C4V_String ,C4V_C4Object,C4V_Any ,C4V_Int ,C4V_C4Object,C4V_Any ,C4V_Int ,C4V_Any ,C4V_Any ,C4V_Any} ,0 , FnSetCommand }, - { "AddCommand", 1 ,C4V_Bool ,{ C4V_String ,C4V_C4Object,C4V_Any ,C4V_Int ,C4V_C4Object,C4V_Int ,C4V_Any ,C4V_Int ,C4V_Int ,C4V_Any} ,0 , FnAddCommand }, - { "AppendCommand", 1 ,C4V_Bool ,{ C4V_String ,C4V_C4Object,C4V_Any ,C4V_Int ,C4V_C4Object,C4V_Int ,C4V_Any ,C4V_Int ,C4V_Int ,C4V_Any} ,0 , FnAppendCommand }, + { "SetCommand", 1 ,C4V_Bool ,{ C4V_String ,C4V_Object ,C4V_Any ,C4V_Int ,C4V_Object ,C4V_Any ,C4V_Int ,C4V_Any ,C4V_Any ,C4V_Any} ,0 , FnSetCommand }, + { "AddCommand", 1 ,C4V_Bool ,{ C4V_String ,C4V_Object ,C4V_Any ,C4V_Int ,C4V_Object ,C4V_Int ,C4V_Any ,C4V_Int ,C4V_Int ,C4V_Any} ,0 , FnAddCommand }, + { "AppendCommand", 1 ,C4V_Bool ,{ C4V_String ,C4V_Object ,C4V_Any ,C4V_Int ,C4V_Object ,C4V_Int ,C4V_Any ,C4V_Int ,C4V_Int ,C4V_Any} ,0 , FnAppendCommand }, { "GetCommand", 1 ,C4V_Any ,{ C4V_Int ,C4V_Int ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any} ,0 , FnGetCommand }, { "SetCrewExtraData", 1 ,C4V_Any ,{ C4V_String ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any} ,MkFnC4V FnSetCrewExtraData, 0 }, { "GetCrewExtraData", 1 ,C4V_Any ,{ C4V_String ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any} ,MkFnC4V FnGetCrewExtraData, 0 }, diff --git a/src/game/script/C4GameScript.cpp b/src/game/script/C4GameScript.cpp index 9d156fc21..22715b6aa 100644 --- a/src/game/script/C4GameScript.cpp +++ b/src/game/script/C4GameScript.cpp @@ -2678,8 +2678,8 @@ C4ScriptConstDef C4ScriptGameConstMap[]= C4ScriptFnDef C4ScriptGameFnMap[]= { - { "PlayerObjectCommand", 1 ,C4V_Bool ,{ C4V_Int ,C4V_String ,C4V_C4Object,C4V_Int ,C4V_Int ,C4V_C4Object,C4V_Any ,C4V_Int ,C4V_Any ,C4V_Any} ,0 , FnPlayerObjectCommand }, - { "FindObject", 1 ,C4V_C4Object ,{ C4V_Array ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any} ,0 , FnFindObject }, + { "PlayerObjectCommand", 1 ,C4V_Bool ,{ C4V_Int ,C4V_String ,C4V_Object ,C4V_Int ,C4V_Int ,C4V_Object ,C4V_Any ,C4V_Int ,C4V_Any ,C4V_Any} ,0 , FnPlayerObjectCommand }, + { "FindObject", 1 ,C4V_Object ,{ C4V_Array ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any} ,0 , FnFindObject }, { "FindObjects", 1 ,C4V_Array ,{ C4V_Array ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any} ,0 , FnFindObjects }, { "ObjectCount", 1 ,C4V_Int ,{ C4V_Array ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any} ,0 , FnObjectCount }, { "GameCall", 1 ,C4V_Any ,{ C4V_String ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any} ,MkFnC4V FnGameCall_C4V , 0 }, @@ -2687,11 +2687,11 @@ C4ScriptFnDef C4ScriptGameFnMap[]= { "DefinitionCall", 0 ,C4V_Any ,{ C4V_PropList,C4V_String ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any} ,MkFnC4V FnDefinitionCall_C4V , 0 }, { "Call", 1 ,C4V_Any ,{ C4V_String ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any} ,MkFnC4V FnCall_C4V , 0 }, { "GetPlrKnowledge", 1 ,C4V_Int ,{ C4V_Int ,C4V_PropList,C4V_Int ,C4V_Int ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any} ,MkFnC4V FnGetPlrKnowledge_C4V , 0 }, - { "GetComponent", 1 ,C4V_Int ,{ C4V_PropList,C4V_Int ,C4V_C4Object,C4V_PropList,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any} ,MkFnC4V FnGetComponent_C4V , 0 }, + { "GetComponent", 1 ,C4V_Int ,{ C4V_PropList,C4V_Int ,C4V_Object ,C4V_PropList,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any} ,MkFnC4V FnGetComponent_C4V , 0 }, { "PlayerMessage", 1 ,C4V_Int ,{ C4V_Int ,C4V_String ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any} ,MkFnC4V &FnPlayerMessage_C4V, 0 }, { "Message", 1 ,C4V_Bool ,{ C4V_String ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any} ,MkFnC4V &FnMessage_C4V, 0 }, { "AddMessage", 1 ,C4V_Bool ,{ C4V_String ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any} ,MkFnC4V &FnAddMessage_C4V, 0 }, - { "EditCursor", 1 ,C4V_C4Object ,{ C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any} ,0 , FnEditCursor }, + { "EditCursor", 1 ,C4V_Object ,{ C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any} ,0 , FnEditCursor }, { "GetHomebaseMaterial", 1 ,C4V_Int ,{ C4V_Int ,C4V_PropList,C4V_Int ,C4V_Int ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any} ,MkFnC4V FnGetHomebaseMaterial_C4V , 0 }, { "GetHomebaseProduction",1 ,C4V_Int ,{ C4V_Int ,C4V_PropList,C4V_Int ,C4V_Int ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any} ,MkFnC4V FnGetHomebaseProduction_C4V , 0 }, @@ -2705,9 +2705,9 @@ C4ScriptFnDef C4ScriptGameFnMap[]= { "SetPlrExtraData", 1 ,C4V_Any ,{ C4V_Int ,C4V_String ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any} ,MkFnC4V FnSetPlrExtraData, 0 }, { "GetPlrExtraData", 1 ,C4V_Any ,{ C4V_Int ,C4V_String ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any} ,MkFnC4V FnGetPlrExtraData, 0 }, - { "AddEffect", 1 ,C4V_PropList ,{ C4V_String ,C4V_C4Object,C4V_Int ,C4V_Int ,C4V_C4Object,C4V_PropList,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any} ,MkFnC4V FnAddEffect_C4V, 0 }, - { "CheckEffect", 1 ,C4V_Int ,{ C4V_String ,C4V_C4Object,C4V_Int ,C4V_Int ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any} ,MkFnC4V FnCheckEffect_C4V, 0 }, - { "EffectCall", 1 ,C4V_Any ,{ C4V_C4Object,C4V_PropList,C4V_String ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any} ,MkFnC4V FnEffectCall_C4V, 0 }, + { "AddEffect", 1 ,C4V_PropList ,{ C4V_String ,C4V_Object ,C4V_Int ,C4V_Int ,C4V_Object, C4V_PropList,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any} ,MkFnC4V FnAddEffect_C4V, 0 }, + { "CheckEffect", 1 ,C4V_Int ,{ C4V_String ,C4V_Object ,C4V_Int ,C4V_Int ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any} ,MkFnC4V FnCheckEffect_C4V, 0 }, + { "EffectCall", 1 ,C4V_Any ,{ C4V_Object ,C4V_PropList,C4V_String ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any} ,MkFnC4V FnEffectCall_C4V, 0 }, { NULL, 0 ,C4V_Nil ,{ C4V_Nil ,C4V_Nil ,C4V_Nil ,C4V_Nil ,C4V_Nil ,C4V_Nil ,C4V_Nil ,C4V_Nil ,C4V_Nil ,C4V_Nil} ,0, 0 } diff --git a/src/script/C4AulDefFunc.h b/src/script/C4AulDefFunc.h index 1bb47bad4..5c8c801a3 100644 --- a/src/script/C4AulDefFunc.h +++ b/src/script/C4AulDefFunc.h @@ -167,7 +167,7 @@ template <> struct C4ValueConv }; template <> struct C4ValueConv { - inline static C4V_Type Type() { return C4V_C4Object; } + inline static C4V_Type Type() { return C4V_Object; } inline static C4Object *FromC4V(C4Value &v) { return v.getObj(); } inline static C4Object *_FromC4V(C4Value &v) { return v._getObj(); } inline static C4Value ToC4V(C4Object *v) { return C4VObj(v); } diff --git a/src/script/C4AulExec.cpp b/src/script/C4AulExec.cpp index 89bdeee8b..6e2e3aedb 100644 --- a/src/script/C4AulExec.cpp +++ b/src/script/C4AulExec.cpp @@ -453,7 +453,7 @@ C4Value C4AulExec::Exec(C4AulBCC *pCPos, bool fPassErrors) } else { - assert(pStruct->GetType() == C4V_PropList || pStruct->GetType() == C4V_C4Object); + assert(pStruct->GetType() == C4V_PropList); C4PropList *pPropList = pStruct->_getPropList(); if (!pPropList->GetPropertyByS(pIndex->_getStr(), pResult)) pResult->Set0(); @@ -472,7 +472,7 @@ C4Value C4AulExec::Exec(C4AulBCC *pCPos, bool fPassErrors) } else { - assert(pStruct->GetType() == C4V_PropList || pStruct->GetType() == C4V_C4Object); + assert(pStruct->GetType() == C4V_PropList); C4PropList *pPropList = pStruct->_getPropList(); if (pPropList->IsFrozen()) throw new C4AulExecError(pCurCtx->Obj, "proplist write: proplist is readonly"); @@ -692,7 +692,7 @@ C4Value C4AulExec::Exec(C4AulBCC *pCPos, bool fPassErrors) // Get call target - "object" or "id" are allowed C4Object *pDestObj; C4Def *pDestDef; - if (pTargetVal->CheckConversion(C4V_C4Object)) + if (pTargetVal->CheckConversion(C4V_Object)) { // object call pDestObj = pTargetVal->_getObj(); diff --git a/src/script/C4AulParse.cpp b/src/script/C4AulParse.cpp index 0b926a75e..c3f5f3ab4 100644 --- a/src/script/C4AulParse.cpp +++ b/src/script/C4AulParse.cpp @@ -1497,7 +1497,7 @@ void C4AulParseState::Parse_FuncHead() if (SEqual(Idtf, C4AUL_TypeInt)) { Fn->ParType[cpar] = C4V_Int; Shift(); } else if (SEqual(Idtf, C4AUL_TypeBool)) { Fn->ParType[cpar] = C4V_Bool; Shift(); } else if (SEqual(Idtf, C4AUL_TypeC4ID)) { Fn->ParType[cpar] = C4V_PropList; Shift(); } - else if (SEqual(Idtf, C4AUL_TypeC4Object)) { Fn->ParType[cpar] = C4V_C4Object; Shift(); } + else if (SEqual(Idtf, C4AUL_TypeC4Object)) { Fn->ParType[cpar] = C4V_Object; Shift(); } else if (SEqual(Idtf, C4AUL_TypePropList)) { Fn->ParType[cpar] = C4V_PropList; Shift(); } else if (SEqual(Idtf, C4AUL_TypeString)) { Fn->ParType[cpar] = C4V_String; Shift(); } else if (SEqual(Idtf, C4AUL_TypeArray)) { Fn->ParType[cpar] = C4V_Array; Shift(); } diff --git a/src/script/C4Script.cpp b/src/script/C4Script.cpp index 5e4c626a1..766ed4739 100644 --- a/src/script/C4Script.cpp +++ b/src/script/C4Script.cpp @@ -354,9 +354,12 @@ static long FnAsyncRandom(C4AulContext *cthr, long iRange) return SafeRandom(iRange); } -static C4Value FnGetType(C4AulContext *cthr, C4Value* Value) +static int FnGetType(C4AulContext *cthr, const C4Value & Value) { - return C4VInt(Value->GetType()); + // dynamic types + if (Value.CheckConversion(C4V_Object)) return C4V_Object; + // static types + return Value.GetType(); } static C4ValueArray * FnCreateArray(C4AulContext *cthr, int iSize) @@ -597,18 +600,18 @@ static Nillable FnGetConstantNameByValue(C4AulContext *ctx, int valu C4ScriptConstDef C4ScriptConstMap[]= { - { "C4V_Nil" ,C4V_Int, C4V_Nil}, - { "C4V_Int" ,C4V_Int, C4V_Int}, - { "C4V_Bool" ,C4V_Int, C4V_Bool}, - { "C4V_C4Object" ,C4V_Int, C4V_C4Object}, - { "C4V_String" ,C4V_Int, C4V_String}, - { "C4V_Array" ,C4V_Int, C4V_Array}, - { "C4V_PropList" ,C4V_Int, C4V_PropList}, + { "C4V_Nil", C4V_Int, C4V_Nil}, + { "C4V_Int", C4V_Int, C4V_Int}, + { "C4V_Bool", C4V_Int, C4V_Bool}, + { "C4V_C4Object", C4V_Int, C4V_Object}, + { "C4V_String", C4V_Int, C4V_String}, + { "C4V_Array", C4V_Int, C4V_Array}, + { "C4V_PropList", C4V_Int, C4V_PropList}, - { "C4X_Ver1" ,C4V_Int, C4XVER1}, - { "C4X_Ver2" ,C4V_Int, C4XVER2}, - { "C4X_Ver3" ,C4V_Int, C4XVER3}, - { "C4X_Ver4" ,C4V_Int, C4XVER4}, + { "C4X_Ver1", C4V_Int, C4XVER1}, + { "C4X_Ver2", C4V_Int, C4XVER2}, + { "C4X_Ver3", C4V_Int, C4XVER3}, + { "C4X_Ver4", C4V_Int, C4XVER4}, { NULL, C4V_Nil, 0} }; @@ -626,8 +629,6 @@ C4ScriptFnDef C4ScriptFnMap[]= { "DebugLog", 1 ,C4V_Bool ,{ C4V_String ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any} ,MkFnC4V &FnDebugLog_C4V, 0 }, { "Format", 1 ,C4V_String ,{ C4V_String ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any} ,MkFnC4V &FnFormat_C4V, 0 }, - { "GetType", 1 ,C4V_Int ,{ C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any} ,MkFnC4V FnGetType, 0 }, - { "GetLength", 1 ,C4V_Int ,{ C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any} ,0, FnGetLength }, { "GetIndexOf", 1 ,C4V_Int ,{ C4V_Any ,C4V_Array ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any} ,0, FnGetIndexOf }, @@ -668,6 +669,7 @@ void InitCoreFunctionMap(C4AulScriptEngine *pEngine) AddFunc(pEngine, "Distance", FnDistance); AddFunc(pEngine, "Angle", FnAngle); AddFunc(pEngine, "GetChar", FnGetChar); + AddFunc(pEngine, "GetType", FnGetType); AddFunc(pEngine, "ModulateColor", FnModulateColor); AddFunc(pEngine, "WildcardMatch", FnWildcardMatch); AddFunc(pEngine, "FatalError", FnFatalError); diff --git a/src/script/C4Value.cpp b/src/script/C4Value.cpp index 0c684b0aa..49176292d 100644 --- a/src/script/C4Value.cpp +++ b/src/script/C4Value.cpp @@ -44,8 +44,6 @@ const char* GetC4VName(const C4V_Type Type) return "int"; case C4V_Bool: return "bool"; - case C4V_C4Object: - return "object"; case C4V_String: return "string"; case C4V_Array: @@ -54,6 +52,8 @@ const char* GetC4VName(const C4V_Type Type) return "proplist"; case C4V_Any: return "any"; + case C4V_Object: + return "object"; default: return "!Fehler!"; } @@ -66,6 +66,22 @@ bool C4Value::FnCnvObject() const return false; } +C4Value::C4Value(C4Object *pObj): NextRef(NULL), Type(pObj ? C4V_PropList : C4V_Nil) +{ + Data.PropList = pObj; AddDataRef(); +} + +C4Object * C4Value::getObj() const +{ + return CheckConversion(C4V_Object) ? Data.PropList->GetObject() : NULL; +} + +C4Object * C4Value::_getObj() const +{ + return Data.PropList ? Data.PropList->GetObject() : NULL; +} + +C4Value C4VObj(C4Object *pObj) { return C4Value(static_cast(pObj)); } bool C4Value::WarnAboutConversion(C4V_Type Type, C4V_Type vtToType) { @@ -74,11 +90,11 @@ bool C4Value::WarnAboutConversion(C4V_Type Type, C4V_Type vtToType) case C4V_Nil: return Type != C4V_Nil && Type != C4V_Any; case C4V_Int: return Type != C4V_Int && Type != C4V_Nil && Type != C4V_Bool && Type != C4V_Any; case C4V_Bool: return false; - case C4V_PropList: return Type != C4V_PropList && Type != C4V_C4Object && Type != C4V_Nil && Type != C4V_Any; - case C4V_C4Object: return Type != C4V_C4Object && Type != C4V_PropList && Type != C4V_Nil && Type != C4V_Any; + case C4V_PropList: return Type != C4V_PropList && Type != C4V_Object && Type != C4V_Nil && Type != C4V_Any; case C4V_String: return Type != C4V_String && Type != C4V_Nil && Type != C4V_Any; case C4V_Array: return Type != C4V_Array && Type != C4V_Nil && Type != C4V_Any; case C4V_Any: return false; + case C4V_Object: return Type != C4V_Object && Type != C4V_PropList && Type != C4V_Nil && Type != C4V_Any; default: assert(!"C4Value::ConvertTo: impossible conversion target"); return false; } } @@ -93,17 +109,16 @@ StdStrBuf C4Value::GetDataString(int depth) const return FormatString("%ld", static_cast(Data.Int)); case C4V_Bool: return StdStrBuf(Data ? "true" : "false"); - case C4V_C4Object: case C4V_PropList: { StdStrBuf DataString; DataString = "{"; if (Data.PropList->GetObject()) { - if (Data.Obj->Status == C4OS_NORMAL) - DataString.AppendFormat("#%d, ", Data.Obj->Number); + if (Data.PropList->GetObject()->Status == C4OS_NORMAL) + DataString.AppendFormat("#%d, ", Data.PropList->GetObject()->Number); else - DataString.AppendFormat("(#%d), ", Data.Obj->Number); + DataString.AppendFormat("(#%d), ", Data.PropList->GetObject()->Number); } else if (Data.PropList->GetDef()) DataString.AppendFormat("%s, ", Data.PropList->GetDef()->id.ToString()); @@ -198,13 +213,13 @@ uint32_t C4ValueNumbers::GetNumberForValue(C4Value * v) { // This is only used for C4Values containing pointers // Assume that all pointers have the same size - if (ValueNumbers.find(v->_getObj()) == ValueNumbers.end()) + if (ValueNumbers.find(v->GetData()) == ValueNumbers.end()) { ValuesToSave.push_back(v); - ValueNumbers[v->_getObj()] = ValuesToSave.size(); + ValueNumbers[v->GetData()] = ValuesToSave.size(); return ValuesToSave.size(); } - return ValueNumbers[v->_getObj()]; + return ValueNumbers[v->GetData()]; } static char GetC4VID(const C4V_Type Type) @@ -221,7 +236,6 @@ static char GetC4VID(const C4V_Type Type) case C4V_Array: case C4V_Enum: return 'E'; - case C4V_C4Object: case C4V_C4ObjectEnum: return 'O'; case C4V_String: @@ -313,7 +327,7 @@ void C4Value::CompileFunc(StdCompiler *pComp, C4ValueNumbers * numbers) break; // object: save object number instead - case C4V_C4Object: case C4V_PropList: + case C4V_PropList: { assert(!fCompiler); C4PropList * p = getPropList(); @@ -494,8 +508,8 @@ bool C4Value::operator == (const C4Value& Value2) const default: return false; } - case C4V_C4Object: case C4V_PropList: - if (Value2.Type == C4V_C4Object || Value2.Type == C4V_PropList) + case C4V_PropList: + if (Value2.Type == C4V_PropList) { // Compare as equal if and only if the proplists are indistinguishable // If one or both are mutable, they have to be the same diff --git a/src/script/C4Value.h b/src/script/C4Value.h index 7ff06b7ea..e255723e6 100644 --- a/src/script/C4Value.h +++ b/src/script/C4Value.h @@ -28,18 +28,20 @@ // C4Value type enum C4V_Type { - C4V_Nil=0, // nil + C4V_Nil=0, C4V_Int=1, C4V_Bool=2, C4V_PropList=3, - C4V_C4Object=4, - C4V_String=5, - C4V_Array=6, + C4V_String=4, + C4V_Array=5, C4V_Enum=8, // enumerated array or proplist C4V_C4ObjectEnum=9, // enumerated object C4V_C4DefEnum=10, // enumerated definition - C4V_Any=11, // for typechecks + + // for typechecks + C4V_Any, + C4V_Object, }; // last C4V_Type that doesn't vanish in Denumerate #define C4V_Last ((int) C4V_Array) @@ -51,21 +53,21 @@ const char* GetC4VName(const C4V_Type Type); union C4V_Data { intptr_t Int; - C4Object * Obj; + void * Ptr; C4PropList * PropList; C4String * Str; C4ValueArray * Array; // cheat a little - assume that all members have the same length - operator void * () { return Obj; } - operator const void * () const { return Obj; } - C4V_Data &operator = (void *p) { Obj = reinterpret_cast(p); return *this; } + operator void * () { return Ptr; } + operator const void * () const { return Ptr; } + C4V_Data &operator = (void *p) { assert(!p); Ptr = p; return *this; } }; class C4Value { public: - C4Value() : NextRef(NULL), Type(C4V_Nil) { Data.Obj = 0; } + C4Value() : NextRef(NULL), Type(C4V_Nil) { Data = 0; } C4Value(const C4Value &nValue) : Data(nValue.Data), NextRef(NULL), Type(nValue.Type) { AddDataRef(); } @@ -74,8 +76,7 @@ public: { Data.Int = data; } explicit C4Value(int32_t data): NextRef(NULL), Type(C4V_Int) { Data.Int = data; } - explicit C4Value(C4Object *pObj): NextRef(NULL), Type(pObj ? C4V_C4Object : C4V_Nil) - { Data.Obj = pObj; AddDataRef(); } + explicit C4Value(C4Object *pObj); explicit C4Value(C4String *pStr): NextRef(NULL), Type(pStr ? C4V_String : C4V_Nil) { Data.Str = pStr; AddDataRef(); } explicit C4Value(C4ValueArray *pArray): NextRef(NULL), Type(pArray ? C4V_Array : C4V_Nil) @@ -91,7 +92,7 @@ public: int32_t getInt() const { return CheckConversion(C4V_Int) ? Data.Int : 0; } bool getBool() const { return CheckConversion(C4V_Bool) ? !! Data : 0; } C4ID getC4ID() const; - C4Object * getObj() const { return CheckConversion(C4V_C4Object) ? Data.Obj : NULL; } + C4Object * getObj() const; C4PropList * getPropList() const { return CheckConversion(C4V_PropList) ? Data.PropList : NULL; } C4String * getStr() const { return CheckConversion(C4V_String) ? Data.Str : NULL; } C4ValueArray * getArray() const { return CheckConversion(C4V_Array) ? Data.Array : NULL; } @@ -99,7 +100,7 @@ public: // Unchecked getters int32_t _getInt() const { return Data.Int; } bool _getBool() const { return !! Data.Int; } - C4Object *_getObj() const { return Data.Obj; } + C4Object *_getObj() const; C4String *_getStr() const { return Data.Str; } C4ValueArray *_getArray() const { return Data.Array; } C4PropList *_getPropList() const { return Data.PropList; } @@ -113,7 +114,6 @@ public: void SetInt(int i) { C4V_Data d; d.Int = i; Set(d, C4V_Int); } void SetBool(bool b) { C4V_Data d; d.Int = b; Set(d, C4V_Bool); } - void SetObject(C4Object * Obj) { C4V_Data d; d.Obj = Obj; Set(d, C4V_C4Object); } void SetString(C4String * Str) { C4V_Data d; d.Str = Str; Set(d, C4V_String); } void SetArray(C4ValueArray * Array) { C4V_Data d; d.Array = Array; Set(d, C4V_Array); } void SetPropList(C4PropList * PropList) { C4V_Data d; d.PropList = PropList; Set(d, C4V_PropList); } @@ -153,11 +153,11 @@ public: case C4V_Nil: return Type == C4V_Nil || (Type == C4V_Int && !*this); case C4V_Int: return Type == C4V_Int || Type == C4V_Nil || Type == C4V_Bool; case C4V_Bool: return true; - case C4V_PropList: return Type == C4V_PropList || Type == C4V_C4Object || Type == C4V_Nil || (Type == C4V_Int && !*this); - case C4V_C4Object: return Type == C4V_C4Object || (Type == C4V_PropList && FnCnvObject()) || Type == C4V_Nil || (Type == C4V_Int && !*this); + case C4V_PropList: return Type == C4V_PropList || Type == C4V_Nil || (Type == C4V_Int && !*this); case C4V_String: return Type == C4V_String || Type == C4V_Nil || (Type == C4V_Int && !*this); case C4V_Array: return Type == C4V_Array || Type == C4V_Nil || (Type == C4V_Int && !*this); case C4V_Any: return true; + case C4V_Object: return (Type == C4V_PropList && FnCnvObject()) || Type == C4V_Nil || (Type == C4V_Int && !*this); default: assert(!"C4Value::CheckParConversion: impossible conversion target"); return false; } } @@ -168,11 +168,11 @@ public: case C4V_Nil: return Type == C4V_Nil; case C4V_Int: return Type == C4V_Nil || Type == C4V_Int || Type == C4V_Bool; case C4V_Bool: return true; - case C4V_PropList: return Type == C4V_PropList || Type == C4V_C4Object; - case C4V_C4Object: return Type == C4V_C4Object || (Type == C4V_PropList && FnCnvObject()); + case C4V_PropList: return Type == C4V_PropList; case C4V_String: return Type == C4V_String; case C4V_Array: return Type == C4V_Array; case C4V_Any: return true; + case C4V_Object: return Type == C4V_PropList && FnCnvObject(); default: assert(!"C4Value::CheckConversion: impossible conversion target"); return false; } } @@ -211,7 +211,7 @@ protected: // converter inline C4Value C4VInt(int32_t i) { return C4Value(i); } inline C4Value C4VBool(bool b) { return C4Value(b); } -inline C4Value C4VObj(C4Object *pObj) { return C4Value(pObj); } +C4Value C4VObj(C4Object *pObj); inline C4Value C4VPropList(C4PropList * p) { return C4Value(p); } inline C4Value C4VString(C4String *pStr) { return C4Value(pStr); } inline C4Value C4VArray(C4ValueArray *pArray) { return C4Value(pArray); } @@ -257,12 +257,6 @@ ALWAYS_INLINE void C4Value::AddDataRef() { case C4V_Array: Data.Array->IncRef(); break; case C4V_String: Data.Str->IncRef(); break; - case C4V_C4Object: -#ifdef _DEBUG - // check if the object actually exists - if (!C4PropListNumbered::CheckPropList(Data.PropList)) - { LogF("Warning: using wild object ptr %p!", static_cast(Data.Obj)); } -#endif case C4V_PropList: #ifdef _DEBUG assert(C4PropList::PropLists.Has(Data.PropList)); @@ -284,7 +278,7 @@ ALWAYS_INLINE void C4Value::DelDataRef(C4V_Data Data, C4V_Type Type, C4Value *pN // clean up switch (Type) { - case C4V_C4Object: case C4V_PropList: Data.PropList->DelRef(this, pNextRef); break; + case C4V_PropList: Data.PropList->DelRef(this, pNextRef); break; case C4V_Array: Data.Array->DecRef(); break; case C4V_String: Data.Str->DecRef(); break; default: break; @@ -315,7 +309,7 @@ ALWAYS_INLINE void C4Value::Set0() C4V_Type oType = Type; // change - Data.Obj = 0; + Data = 0; Type = C4V_Nil; // clean up (save even if Data was 0 before) diff --git a/src/script/C4ValueArray.cpp b/src/script/C4ValueArray.cpp index cbf2da2b7..ee7dff7c1 100644 --- a/src/script/C4ValueArray.cpp +++ b/src/script/C4ValueArray.cpp @@ -25,6 +25,7 @@ #include #include +#include C4ValueArray::C4ValueArray() : iRefCnt(0), iSize(0), pData(NULL) @@ -94,7 +95,7 @@ void C4ValueArray::Sort(class C4SortObject &rSort) pPos[i] = reinterpret_cast(pData[pPos[i]]._getObj()); // Set the values for (i = 0; i < iSize; i++) - pData[i].SetObject(reinterpret_cast(pPos[i])); + pData[i].SetPropList(reinterpret_cast(pPos[i])); delete [] pPos; } else