Only use C4V_C4Object as typecheck target, tag the values with C4V_Proplist

This simplifies a few places which had to check for both tags before.
Günther Brammer 2011-09-26 20:22:31 +02:00
parent 0fa37ef35d
commit 32e7eb2904
10 changed files with 89 additions and 79 deletions

View File

@ -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;

View File

@ -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 },

View File

@ -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 }

View File

@ -167,7 +167,7 @@ template <> struct C4ValueConv<C4ID>
};
template <> struct C4ValueConv<C4Object *>
{
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); }

View File

@ -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();

View File

@ -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(); }

View File

@ -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<C4String *> 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);

View File

@ -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<C4PropList*>(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<long>(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

View File

@ -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<C4Object *>(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<void*>(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)

View File

@ -25,6 +25,7 @@
#include <C4Aul.h>
#include <C4FindObject.h>
#include <C4Object.h>
C4ValueArray::C4ValueArray()
: iRefCnt(0), iSize(0), pData(NULL)
@ -94,7 +95,7 @@ void C4ValueArray::Sort(class C4SortObject &rSort)
pPos[i] = reinterpret_cast<intptr_t>(pData[pPos[i]]._getObj());
// Set the values
for (i = 0; i < iSize; i++)
pData[i].SetObject(reinterpret_cast<C4Object *>(pPos[i]));
pData[i].SetPropList(reinterpret_cast<C4Object *>(pPos[i]));
delete [] pPos;
}
else