Fixes in handling void values.

Making quicksort test more real.
Better error reporting for invalid parameters.



git-svn-id: http://picoc.googlecode.com/svn/trunk@318 21eae674-98b7-11dd-bd71-f92a316d2d60
This commit is contained in:
zik.saleeba 2009-06-02 07:01:43 +00:00
parent 9f9728dab5
commit a4889edcf1
4 changed files with 16 additions and 12 deletions

View file

@ -270,34 +270,34 @@ void ExpressionAssignToPointer(struct ParseState *Parser, struct Value *ToValue,
#endif
}
else
ProgramFail(Parser, "can't assign from a %t to a %t", FromValue->Typ, ToValue->Typ);
ProgramFail(Parser, "can't set a %t from a %t", ToValue->Typ, FromValue->Typ);
}
/* assign any kind of value */
void ExpressionAssign(struct ParseState *Parser, struct Value *DestValue, struct Value *SourceValue, int Force)
{
if (!DestValue->IsLValue && !Force)
ProgramFail(Parser, "can't assign to this");
ProgramFail(Parser, "can't set this");
switch (DestValue->Typ->Base)
{
case TypeInt:
if (!IS_NUMERIC_COERCIBLE(SourceValue))
ProgramFail(Parser, "can't assign to this");
ProgramFail(Parser, "can't set a %t from a %t", DestValue->Typ, SourceValue->Typ);
DestValue->Val->Integer = COERCE_INTEGER(SourceValue);
break;
case TypeChar:
if (!IS_NUMERIC_COERCIBLE(SourceValue))
ProgramFail(Parser, "can't assign to this");
ProgramFail(Parser, "can't set a %t from a %t", DestValue->Typ, SourceValue->Typ);
DestValue->Val->Character = COERCE_INTEGER(SourceValue);
break;
#ifndef NO_FP
case TypeFP:
if (!IS_NUMERIC_COERCIBLE(SourceValue))
ProgramFail(Parser, "can't assign to this");
ProgramFail(Parser, "can't set a %t from a %t", DestValue->Typ, SourceValue->Typ);
DestValue->Val->FP = COERCE_FP(SourceValue);
break;
@ -308,7 +308,7 @@ void ExpressionAssign(struct ParseState *Parser, struct Value *DestValue, struct
case TypeArray:
if (DestValue->Typ != SourceValue->Typ)
ProgramFail(Parser, "can't assign from a %t to a %t", SourceValue->Typ, DestValue->Typ);
ProgramFail(Parser, "can't set a %t from a %t", DestValue->Typ, SourceValue->Typ);
if (DestValue->Val->Array.Size != SourceValue->Val->Array.Size)
ProgramFail(Parser, "can't assign from an array of size %d to one of size %d", SourceValue->Val->Array.Size, DestValue->Val->Array.Size);
@ -319,13 +319,13 @@ void ExpressionAssign(struct ParseState *Parser, struct Value *DestValue, struct
case TypeStruct:
case TypeUnion:
if (DestValue->Typ != SourceValue->Typ)
ProgramFail(Parser, "can't assign from a %t to a %t", SourceValue->Typ, DestValue->Typ);
ProgramFail(Parser, "can't set a %t from a %t", DestValue->Typ, SourceValue->Typ);
memcpy((void *)DestValue->Val, (void *)SourceValue->Val, TypeSizeValue(SourceValue));
break;
default:
ProgramFail(Parser, "can't assign to a %t", DestValue->Typ);
ProgramFail(Parser, "can't set a %t", DestValue->Typ);
break;
}
}

View file

@ -474,7 +474,9 @@ int ParseStatement(struct ParseState *Parser)
if (!ExpressionParse(Parser, &CValue) && TopStackFrame->ReturnValue->Typ->Base != TypeVoid)
ProgramFail(Parser, "value required in return");
ExpressionAssign(Parser, TopStackFrame->ReturnValue, CValue, TRUE);
if (TopStackFrame->ReturnValue->Typ->Base != TypeVoid)
ExpressionAssign(Parser, TopStackFrame->ReturnValue, CValue, TRUE);
VariableStackPop(Parser, CValue);
Parser->Mode = RunModeReturn;
}

View file

@ -39,7 +39,7 @@ int partition(int left, int right)
{
if(array[i] < pivotValue)
{
swap(array, i, index);
swap(i, index);
index += 1;
}
}
@ -66,7 +66,7 @@ for (i = 0; i < 16; i++)
printf("\n");
//quicksort(0, 15);
quicksort(0, 15);
for (i = 0; i < 16; i++)
printf("%d ", array[i]);

View file

@ -216,7 +216,9 @@ void VariableStackPop(struct ParseState *Parser, struct Value *Var)
if (Var->ValOnHeap)
{
HeapFree(Var->Val);
if (Var->Val != NULL)
HeapFree(Var->Val);
Success = HeapPopStack(Var, sizeof(struct Value)); /* free from heap */
}
else if (Var->ValOnStack)