oleaut32: Add support for const variables.

oldstable
Andrey Turkin 2010-07-17 11:40:10 +04:00 committed by Alexandre Julliard
parent eb03917935
commit fe7e384e07
1 changed files with 41 additions and 32 deletions

View File

@ -2026,6 +2026,7 @@ static HRESULT WINAPI ICreateTypeInfo2_fnAddVarDesc(
{ {
ICreateTypeInfo2Impl *This = (ICreateTypeInfo2Impl *)iface; ICreateTypeInfo2Impl *This = (ICreateTypeInfo2Impl *)iface;
HRESULT status = S_OK;
CyclicList *insert; CyclicList *insert;
INT *typedata; INT *typedata;
int var_datawidth; int var_datawidth;
@ -2079,7 +2080,7 @@ static HRESULT WINAPI ICreateTypeInfo2_fnAddVarDesc(
/* fill out the basic type information */ /* fill out the basic type information */
typedata[0] = 0x14 | (index << 16); typedata[0] = 0x14 | (index << 16);
typedata[2] = pVarDesc->wVarFlags; typedata[2] = pVarDesc->wVarFlags;
typedata[3] = (sizeof(VARDESC) << 16) | 0; typedata[3] = (sizeof(VARDESC) << 16) | pVarDesc->varkind;
/* update the index data */ /* update the index data */
insert->indice = 0x40000000 + index; insert->indice = 0x40000000 + index;
@ -2091,44 +2092,52 @@ static HRESULT WINAPI ICreateTypeInfo2_fnAddVarDesc(
&typedata[1], &var_datawidth, &var_alignment, &typedata[1], &var_datawidth, &var_alignment,
&var_type_size); &var_type_size);
/* pad out starting position to data width */ if (pVarDesc->varkind != VAR_CONST)
This->datawidth += var_alignment - 1; {
This->datawidth &= ~(var_alignment - 1); /* pad out starting position to data width */
typedata[4] = This->datawidth; This->datawidth += var_alignment - 1;
This->datawidth &= ~(var_alignment - 1);
/* add the new variable to the total data width */ typedata[4] = This->datawidth;
This->datawidth += var_datawidth;
if(This->dual)
This->dual->datawidth = This->datawidth;
/* add type description size to total required allocation */ /* add the new variable to the total data width */
typedata[3] += var_type_size << 16; This->datawidth += var_datawidth;
if(This->dual)
This->dual->datawidth = This->datawidth;
/* fix type alignment */ /* add type description size to total required allocation */
alignment = (This->typeinfo->typekind >> 11) & 0x1f; typedata[3] += var_type_size << 16;
if (alignment < var_alignment) {
alignment = var_alignment; /* fix type alignment */
This->typeinfo->typekind &= ~0xf800; alignment = (This->typeinfo->typekind >> 11) & 0x1f;
This->typeinfo->typekind |= alignment << 11; if (alignment < var_alignment) {
alignment = var_alignment;
This->typeinfo->typekind &= ~0xf800;
This->typeinfo->typekind |= alignment << 11;
}
/* ??? */
if (!This->typeinfo->res2) This->typeinfo->res2 = 0x1a;
if ((index == 0) || (index == 1) || (index == 2) || (index == 4) || (index == 9)) {
This->typeinfo->res2 <<= 1;
}
/* ??? */
if (This->typeinfo->res3 == -1) This->typeinfo->res3 = 0;
This->typeinfo->res3 += 0x2c;
/* pad data width to alignment */
This->typeinfo->size = (This->datawidth + (alignment - 1)) & ~(alignment - 1);
} else {
VARIANT *value = pVarDesc->DUMMYUNIONNAME.lpvarValue;
status = ctl2_encode_variant(This->typelib, typedata+4, value, V_VT(value));
/* ??? native sets size 0x34 */
typedata[3] += 0x10 << 16;
} }
/* ??? */
if (!This->typeinfo->res2) This->typeinfo->res2 = 0x1a;
if ((index == 0) || (index == 1) || (index == 2) || (index == 4) || (index == 9)) {
This->typeinfo->res2 <<= 1;
}
/* ??? */
if (This->typeinfo->res3 == -1) This->typeinfo->res3 = 0;
This->typeinfo->res3 += 0x2c;
/* increment the number of variable elements */ /* increment the number of variable elements */
This->typeinfo->cElement += 0x10000; This->typeinfo->cElement += 0x10000;
/* pad data width to alignment */ return status;
This->typeinfo->size = (This->datawidth + (alignment - 1)) & ~(alignment - 1);
return S_OK;
} }
/****************************************************************************** /******************************************************************************