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; if (!parV) return false;
// determine drag object/id // determine drag object/id
C4Object *obj=NULL; C4ID 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(); else if (parV.GetType() == C4V_PropList) id = parV.getC4ID();
if (drag_object) *drag_object = obj; if (drag_object) *drag_object = obj;
if (drag_id) *drag_id = id; if (drag_id) *drag_id = id;

View File

@ -918,7 +918,6 @@ static bool FnAddMenuItem(C4AulObjectContext *cthr, C4String * szCaption, C4Stri
case C4V_Bool: case C4V_Bool:
SCopy(Parameter.getBool() ? "true" : "false", parameter); SCopy(Parameter.getBool() ? "true" : "false", parameter);
break; break;
case C4V_C4Object:
case C4V_PropList: case C4V_PropList:
if (Parameter.getPropList()->GetObject()) if (Parameter.getPropList()->GetObject())
sprintf(parameter, "Object(%d)", Parameter.getPropList()->GetObject()->Number); sprintf(parameter, "Object(%d)", Parameter.getPropList()->GetObject()->Number);
@ -1027,7 +1026,7 @@ static bool FnAddMenuItem(C4AulObjectContext *cthr, C4String * szCaption, C4Stri
case C4MN_Add_ImgObjRank: case C4MN_Add_ImgObjRank:
{ {
// draw current gfx of XPar_C4V including rank // 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(); C4Object *pGfxObj = XPar.getObj();
if (pGfxObj && pGfxObj->Status) if (pGfxObj && pGfxObj->Status)
{ {
@ -1080,10 +1079,10 @@ static bool FnAddMenuItem(C4AulObjectContext *cthr, C4String * szCaption, C4Stri
case C4MN_Add_ImgObject: case C4MN_Add_ImgObject:
{ {
// draw object picture // draw object picture
if (XPar.GetType() != C4V_C4Object) if (!XPar.CheckConversion(C4V_Object))
throw new C4AulExecError(cthr->Obj, throw new C4AulExecError(cthr->Obj,
FormatString("call to \"%s\" parameter %d: got \"%s\", but expected \"%s\"!", 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()); ).getData());
C4Object *pGfxObj = XPar.getObj(); C4Object *pGfxObj = XPar.getObj();
fctSymbol.Wdt = fctSymbol.Hgt = iSymbolSize; fctSymbol.Wdt = fctSymbol.Hgt = iSymbolSize;
@ -2336,9 +2335,9 @@ C4ScriptConstDef C4ScriptObjectConstMap[]=
C4ScriptFnDef C4ScriptObjectFnMap[]= 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 }, { "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_C4Object,C4V_Any ,C4V_Int ,C4V_C4Object,C4V_Int ,C4V_Any ,C4V_Int ,C4V_Int ,C4V_Any} ,0 , FnAddCommand }, { "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_C4Object,C4V_Any ,C4V_Int ,C4V_C4Object,C4V_Int ,C4V_Any ,C4V_Int ,C4V_Int ,C4V_Any} ,0 , FnAppendCommand }, { "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 }, { "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 }, { "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 }, { "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[]= 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 }, { "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_C4Object ,{ C4V_Array ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any} ,0 , FnFindObject }, { "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 }, { "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 }, { "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 }, { "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 }, { "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 }, { "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 }, { "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 }, { "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 }, { "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 }, { "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 }, { "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 }, { "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 }, { "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 }, { "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 }, { "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_C4Object,C4V_Int ,C4V_Int ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any} ,MkFnC4V FnCheckEffect_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_C4Object,C4V_PropList,C4V_String ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any ,C4V_Any} ,MkFnC4V FnEffectCall_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 } { 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 *> 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 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); } inline static C4Value ToC4V(C4Object *v) { return C4VObj(v); }

View File

@ -453,7 +453,7 @@ C4Value C4AulExec::Exec(C4AulBCC *pCPos, bool fPassErrors)
} }
else else
{ {
assert(pStruct->GetType() == C4V_PropList || pStruct->GetType() == C4V_C4Object); assert(pStruct->GetType() == C4V_PropList);
C4PropList *pPropList = pStruct->_getPropList(); C4PropList *pPropList = pStruct->_getPropList();
if (!pPropList->GetPropertyByS(pIndex->_getStr(), pResult)) if (!pPropList->GetPropertyByS(pIndex->_getStr(), pResult))
pResult->Set0(); pResult->Set0();
@ -472,7 +472,7 @@ C4Value C4AulExec::Exec(C4AulBCC *pCPos, bool fPassErrors)
} }
else else
{ {
assert(pStruct->GetType() == C4V_PropList || pStruct->GetType() == C4V_C4Object); assert(pStruct->GetType() == C4V_PropList);
C4PropList *pPropList = pStruct->_getPropList(); C4PropList *pPropList = pStruct->_getPropList();
if (pPropList->IsFrozen()) if (pPropList->IsFrozen())
throw new C4AulExecError(pCurCtx->Obj, "proplist write: proplist is readonly"); 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 // Get call target - "object" or "id" are allowed
C4Object *pDestObj; C4Def *pDestDef; C4Object *pDestObj; C4Def *pDestDef;
if (pTargetVal->CheckConversion(C4V_C4Object)) if (pTargetVal->CheckConversion(C4V_Object))
{ {
// object call // object call
pDestObj = pTargetVal->_getObj(); pDestObj = pTargetVal->_getObj();

View File

@ -1497,7 +1497,7 @@ void C4AulParseState::Parse_FuncHead()
if (SEqual(Idtf, C4AUL_TypeInt)) { Fn->ParType[cpar] = C4V_Int; Shift(); } 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_TypeBool)) { Fn->ParType[cpar] = C4V_Bool; Shift(); }
else if (SEqual(Idtf, C4AUL_TypeC4ID)) { Fn->ParType[cpar] = C4V_PropList; 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_TypePropList)) { Fn->ParType[cpar] = C4V_PropList; Shift(); }
else if (SEqual(Idtf, C4AUL_TypeString)) { Fn->ParType[cpar] = C4V_String; 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(); } 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); 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) static C4ValueArray * FnCreateArray(C4AulContext *cthr, int iSize)
@ -597,18 +600,18 @@ static Nillable<C4String *> FnGetConstantNameByValue(C4AulContext *ctx, int valu
C4ScriptConstDef C4ScriptConstMap[]= C4ScriptConstDef C4ScriptConstMap[]=
{ {
{ "C4V_Nil" ,C4V_Int, C4V_Nil}, { "C4V_Nil", C4V_Int, C4V_Nil},
{ "C4V_Int" ,C4V_Int, C4V_Int}, { "C4V_Int", C4V_Int, C4V_Int},
{ "C4V_Bool" ,C4V_Int, C4V_Bool}, { "C4V_Bool", C4V_Int, C4V_Bool},
{ "C4V_C4Object" ,C4V_Int, C4V_C4Object}, { "C4V_C4Object", C4V_Int, C4V_Object},
{ "C4V_String" ,C4V_Int, C4V_String}, { "C4V_String", C4V_Int, C4V_String},
{ "C4V_Array" ,C4V_Int, C4V_Array}, { "C4V_Array", C4V_Int, C4V_Array},
{ "C4V_PropList" ,C4V_Int, C4V_PropList}, { "C4V_PropList", C4V_Int, C4V_PropList},
{ "C4X_Ver1" ,C4V_Int, C4XVER1}, { "C4X_Ver1", C4V_Int, C4XVER1},
{ "C4X_Ver2" ,C4V_Int, C4XVER2}, { "C4X_Ver2", C4V_Int, C4XVER2},
{ "C4X_Ver3" ,C4V_Int, C4XVER3}, { "C4X_Ver3", C4V_Int, C4XVER3},
{ "C4X_Ver4" ,C4V_Int, C4XVER4}, { "C4X_Ver4", C4V_Int, C4XVER4},
{ NULL, C4V_Nil, 0} { 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 }, { "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 }, { "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 }, { "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 }, { "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, "Distance", FnDistance);
AddFunc(pEngine, "Angle", FnAngle); AddFunc(pEngine, "Angle", FnAngle);
AddFunc(pEngine, "GetChar", FnGetChar); AddFunc(pEngine, "GetChar", FnGetChar);
AddFunc(pEngine, "GetType", FnGetType);
AddFunc(pEngine, "ModulateColor", FnModulateColor); AddFunc(pEngine, "ModulateColor", FnModulateColor);
AddFunc(pEngine, "WildcardMatch", FnWildcardMatch); AddFunc(pEngine, "WildcardMatch", FnWildcardMatch);
AddFunc(pEngine, "FatalError", FnFatalError); AddFunc(pEngine, "FatalError", FnFatalError);

View File

@ -44,8 +44,6 @@ const char* GetC4VName(const C4V_Type Type)
return "int"; return "int";
case C4V_Bool: case C4V_Bool:
return "bool"; return "bool";
case C4V_C4Object:
return "object";
case C4V_String: case C4V_String:
return "string"; return "string";
case C4V_Array: case C4V_Array:
@ -54,6 +52,8 @@ const char* GetC4VName(const C4V_Type Type)
return "proplist"; return "proplist";
case C4V_Any: case C4V_Any:
return "any"; return "any";
case C4V_Object:
return "object";
default: default:
return "!Fehler!"; return "!Fehler!";
} }
@ -66,6 +66,22 @@ bool C4Value::FnCnvObject() const
return false; 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) 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_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_Int: return Type != C4V_Int && Type != C4V_Nil && Type != C4V_Bool && Type != C4V_Any;
case C4V_Bool: return false; case C4V_Bool: return false;
case C4V_PropList: return Type != C4V_PropList && Type != C4V_C4Object && Type != C4V_Nil && Type != C4V_Any; case C4V_PropList: return Type != C4V_PropList && Type != C4V_Object && Type != C4V_Nil && Type != C4V_Any;
case C4V_C4Object: return Type != C4V_C4Object && Type != C4V_PropList && Type != C4V_Nil && Type != C4V_Any;
case C4V_String: return Type != C4V_String && 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_Array: return Type != C4V_Array && Type != C4V_Nil && Type != C4V_Any;
case C4V_Any: return false; 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; 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)); return FormatString("%ld", static_cast<long>(Data.Int));
case C4V_Bool: case C4V_Bool:
return StdStrBuf(Data ? "true" : "false"); return StdStrBuf(Data ? "true" : "false");
case C4V_C4Object:
case C4V_PropList: case C4V_PropList:
{ {
StdStrBuf DataString; StdStrBuf DataString;
DataString = "{"; DataString = "{";
if (Data.PropList->GetObject()) if (Data.PropList->GetObject())
{ {
if (Data.Obj->Status == C4OS_NORMAL) if (Data.PropList->GetObject()->Status == C4OS_NORMAL)
DataString.AppendFormat("#%d, ", Data.Obj->Number); DataString.AppendFormat("#%d, ", Data.PropList->GetObject()->Number);
else else
DataString.AppendFormat("(#%d), ", Data.Obj->Number); DataString.AppendFormat("(#%d), ", Data.PropList->GetObject()->Number);
} }
else if (Data.PropList->GetDef()) else if (Data.PropList->GetDef())
DataString.AppendFormat("%s, ", Data.PropList->GetDef()->id.ToString()); 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 // This is only used for C4Values containing pointers
// Assume that all pointers have the same size // 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); ValuesToSave.push_back(v);
ValueNumbers[v->_getObj()] = ValuesToSave.size(); ValueNumbers[v->GetData()] = ValuesToSave.size();
return ValuesToSave.size(); return ValuesToSave.size();
} }
return ValueNumbers[v->_getObj()]; return ValueNumbers[v->GetData()];
} }
static char GetC4VID(const C4V_Type Type) static char GetC4VID(const C4V_Type Type)
@ -221,7 +236,6 @@ static char GetC4VID(const C4V_Type Type)
case C4V_Array: case C4V_Array:
case C4V_Enum: case C4V_Enum:
return 'E'; return 'E';
case C4V_C4Object:
case C4V_C4ObjectEnum: case C4V_C4ObjectEnum:
return 'O'; return 'O';
case C4V_String: case C4V_String:
@ -313,7 +327,7 @@ void C4Value::CompileFunc(StdCompiler *pComp, C4ValueNumbers * numbers)
break; break;
// object: save object number instead // object: save object number instead
case C4V_C4Object: case C4V_PropList: case C4V_PropList:
{ {
assert(!fCompiler); assert(!fCompiler);
C4PropList * p = getPropList(); C4PropList * p = getPropList();
@ -494,8 +508,8 @@ bool C4Value::operator == (const C4Value& Value2) const
default: default:
return false; return false;
} }
case C4V_C4Object: case C4V_PropList: case C4V_PropList:
if (Value2.Type == C4V_C4Object || Value2.Type == C4V_PropList) if (Value2.Type == C4V_PropList)
{ {
// Compare as equal if and only if the proplists are indistinguishable // Compare as equal if and only if the proplists are indistinguishable
// If one or both are mutable, they have to be the same // If one or both are mutable, they have to be the same

View File

@ -28,18 +28,20 @@
// C4Value type // C4Value type
enum C4V_Type enum C4V_Type
{ {
C4V_Nil=0, // nil C4V_Nil=0,
C4V_Int=1, C4V_Int=1,
C4V_Bool=2, C4V_Bool=2,
C4V_PropList=3, C4V_PropList=3,
C4V_C4Object=4, C4V_String=4,
C4V_String=5, C4V_Array=5,
C4V_Array=6,
C4V_Enum=8, // enumerated array or proplist C4V_Enum=8, // enumerated array or proplist
C4V_C4ObjectEnum=9, // enumerated object C4V_C4ObjectEnum=9, // enumerated object
C4V_C4DefEnum=10, // enumerated definition 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 // last C4V_Type that doesn't vanish in Denumerate
#define C4V_Last ((int) C4V_Array) #define C4V_Last ((int) C4V_Array)
@ -51,21 +53,21 @@ const char* GetC4VName(const C4V_Type Type);
union C4V_Data union C4V_Data
{ {
intptr_t Int; intptr_t Int;
C4Object * Obj; void * Ptr;
C4PropList * PropList; C4PropList * PropList;
C4String * Str; C4String * Str;
C4ValueArray * Array; C4ValueArray * Array;
// cheat a little - assume that all members have the same length // cheat a little - assume that all members have the same length
operator void * () { return Obj; } operator void * () { return Ptr; }
operator const void * () const { return Obj; } operator const void * () const { return Ptr; }
C4V_Data &operator = (void *p) { Obj = reinterpret_cast<C4Object *>(p); return *this; } C4V_Data &operator = (void *p) { assert(!p); Ptr = p; return *this; }
}; };
class C4Value class C4Value
{ {
public: 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) C4Value(const C4Value &nValue) : Data(nValue.Data), NextRef(NULL), Type(nValue.Type)
{ AddDataRef(); } { AddDataRef(); }
@ -74,8 +76,7 @@ public:
{ Data.Int = data; } { Data.Int = data; }
explicit C4Value(int32_t data): NextRef(NULL), Type(C4V_Int) explicit C4Value(int32_t data): NextRef(NULL), Type(C4V_Int)
{ Data.Int = data; } { Data.Int = data; }
explicit C4Value(C4Object *pObj): NextRef(NULL), Type(pObj ? C4V_C4Object : C4V_Nil) explicit C4Value(C4Object *pObj);
{ Data.Obj = pObj; AddDataRef(); }
explicit C4Value(C4String *pStr): NextRef(NULL), Type(pStr ? C4V_String : C4V_Nil) explicit C4Value(C4String *pStr): NextRef(NULL), Type(pStr ? C4V_String : C4V_Nil)
{ Data.Str = pStr; AddDataRef(); } { Data.Str = pStr; AddDataRef(); }
explicit C4Value(C4ValueArray *pArray): NextRef(NULL), Type(pArray ? C4V_Array : C4V_Nil) 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; } int32_t getInt() const { return CheckConversion(C4V_Int) ? Data.Int : 0; }
bool getBool() const { return CheckConversion(C4V_Bool) ? !! Data : 0; } bool getBool() const { return CheckConversion(C4V_Bool) ? !! Data : 0; }
C4ID getC4ID() const; 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; } C4PropList * getPropList() const { return CheckConversion(C4V_PropList) ? Data.PropList : NULL; }
C4String * getStr() const { return CheckConversion(C4V_String) ? Data.Str : NULL; } C4String * getStr() const { return CheckConversion(C4V_String) ? Data.Str : NULL; }
C4ValueArray * getArray() const { return CheckConversion(C4V_Array) ? Data.Array : NULL; } C4ValueArray * getArray() const { return CheckConversion(C4V_Array) ? Data.Array : NULL; }
@ -99,7 +100,7 @@ public:
// Unchecked getters // Unchecked getters
int32_t _getInt() const { return Data.Int; } int32_t _getInt() const { return Data.Int; }
bool _getBool() 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; } C4String *_getStr() const { return Data.Str; }
C4ValueArray *_getArray() const { return Data.Array; } C4ValueArray *_getArray() const { return Data.Array; }
C4PropList *_getPropList() const { return Data.PropList; } 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 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 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 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 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); } 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_Nil: return Type == C4V_Nil || (Type == C4V_Int && !*this);
case C4V_Int: return Type == C4V_Int || Type == C4V_Nil || Type == C4V_Bool; case C4V_Int: return Type == C4V_Int || Type == C4V_Nil || Type == C4V_Bool;
case C4V_Bool: return true; case C4V_Bool: return true;
case C4V_PropList: return Type == C4V_PropList || Type == C4V_C4Object || Type == C4V_Nil || (Type == C4V_Int && !*this); case C4V_PropList: return Type == C4V_PropList || 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_String: return Type == C4V_String || 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_Array: return Type == C4V_Array || Type == C4V_Nil || (Type == C4V_Int && !*this);
case C4V_Any: return true; 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; default: assert(!"C4Value::CheckParConversion: impossible conversion target"); return false;
} }
} }
@ -168,11 +168,11 @@ public:
case C4V_Nil: return Type == C4V_Nil; case C4V_Nil: return Type == C4V_Nil;
case C4V_Int: return Type == C4V_Nil || Type == C4V_Int || Type == C4V_Bool; case C4V_Int: return Type == C4V_Nil || Type == C4V_Int || Type == C4V_Bool;
case C4V_Bool: return true; case C4V_Bool: return true;
case C4V_PropList: return Type == C4V_PropList || Type == C4V_C4Object; case C4V_PropList: return Type == C4V_PropList;
case C4V_C4Object: return Type == C4V_C4Object || (Type == C4V_PropList && FnCnvObject());
case C4V_String: return Type == C4V_String; case C4V_String: return Type == C4V_String;
case C4V_Array: return Type == C4V_Array; case C4V_Array: return Type == C4V_Array;
case C4V_Any: return true; case C4V_Any: return true;
case C4V_Object: return Type == C4V_PropList && FnCnvObject();
default: assert(!"C4Value::CheckConversion: impossible conversion target"); return false; default: assert(!"C4Value::CheckConversion: impossible conversion target"); return false;
} }
} }
@ -211,7 +211,7 @@ protected:
// converter // converter
inline C4Value C4VInt(int32_t i) { return C4Value(i); } inline C4Value C4VInt(int32_t i) { return C4Value(i); }
inline C4Value C4VBool(bool b) { return C4Value(b); } 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 C4VPropList(C4PropList * p) { return C4Value(p); }
inline C4Value C4VString(C4String *pStr) { return C4Value(pStr); } inline C4Value C4VString(C4String *pStr) { return C4Value(pStr); }
inline C4Value C4VArray(C4ValueArray *pArray) { return C4Value(pArray); } 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_Array: Data.Array->IncRef(); break;
case C4V_String: Data.Str->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: case C4V_PropList:
#ifdef _DEBUG #ifdef _DEBUG
assert(C4PropList::PropLists.Has(Data.PropList)); 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 // clean up
switch (Type) 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_Array: Data.Array->DecRef(); break;
case C4V_String: Data.Str->DecRef(); break; case C4V_String: Data.Str->DecRef(); break;
default: break; default: break;
@ -315,7 +309,7 @@ ALWAYS_INLINE void C4Value::Set0()
C4V_Type oType = Type; C4V_Type oType = Type;
// change // change
Data.Obj = 0; Data = 0;
Type = C4V_Nil; Type = C4V_Nil;
// clean up (save even if Data was 0 before) // clean up (save even if Data was 0 before)

View File

@ -25,6 +25,7 @@
#include <C4Aul.h> #include <C4Aul.h>
#include <C4FindObject.h> #include <C4FindObject.h>
#include <C4Object.h>
C4ValueArray::C4ValueArray() C4ValueArray::C4ValueArray()
: iRefCnt(0), iSize(0), pData(NULL) : 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()); pPos[i] = reinterpret_cast<intptr_t>(pData[pPos[i]]._getObj());
// Set the values // Set the values
for (i = 0; i < iSize; i++) for (i = 0; i < iSize; i++)
pData[i].SetObject(reinterpret_cast<C4Object *>(pPos[i])); pData[i].SetPropList(reinterpret_cast<C4Object *>(pPos[i]));
delete [] pPos; delete [] pPos;
} }
else else