|
@@ -6235,27 +6235,37 @@ implementation
|
|
|
|
|
|
|
|
|
|
function tobjectdef.vmtmethodoffset(index:longint):longint;
|
|
function tobjectdef.vmtmethodoffset(index:longint):longint;
|
|
|
|
+ var
|
|
|
|
+ codeptrsize: Integer;
|
|
begin
|
|
begin
|
|
|
|
+{$ifdef i8086}
|
|
|
|
+ if current_settings.x86memorymodel in x86_far_code_models then
|
|
|
|
+ codeptrsize:=4
|
|
|
|
+ else
|
|
|
|
+ codeptrsize:=2;
|
|
|
|
+{$else i8086}
|
|
|
|
+ codeptrsize:=sizeof(pint);
|
|
|
|
+{$endif i8086}
|
|
{ for offset of methods for classes, see rtl/inc/objpash.inc }
|
|
{ for offset of methods for classes, see rtl/inc/objpash.inc }
|
|
case objecttype of
|
|
case objecttype of
|
|
odt_class:
|
|
odt_class:
|
|
{ the +2*sizeof(pint) is size and -size }
|
|
{ the +2*sizeof(pint) is size and -size }
|
|
- vmtmethodoffset:=(index+10)*sizeof(pint)+2*sizeof(pint);
|
|
|
|
|
|
+ vmtmethodoffset:=index*codeptrsize+10*sizeof(pint)+2*sizeof(pint);
|
|
odt_helper,
|
|
odt_helper,
|
|
odt_objcclass,
|
|
odt_objcclass,
|
|
odt_objcprotocol:
|
|
odt_objcprotocol:
|
|
vmtmethodoffset:=0;
|
|
vmtmethodoffset:=0;
|
|
odt_interfacecom,odt_interfacecorba,odt_dispinterface:
|
|
odt_interfacecom,odt_interfacecorba,odt_dispinterface:
|
|
- vmtmethodoffset:=index*sizeof(pint);
|
|
|
|
|
|
+ vmtmethodoffset:=index*codeptrsize;
|
|
odt_javaclass,
|
|
odt_javaclass,
|
|
odt_interfacejava:
|
|
odt_interfacejava:
|
|
{ invalid }
|
|
{ invalid }
|
|
vmtmethodoffset:=-1;
|
|
vmtmethodoffset:=-1;
|
|
else
|
|
else
|
|
{$ifdef WITHDMT}
|
|
{$ifdef WITHDMT}
|
|
- vmtmethodoffset:=(index+4)*sizeof(pint);
|
|
|
|
|
|
+ vmtmethodoffset:=index*codeptrsize+4*sizeof(pint);
|
|
{$else WITHDMT}
|
|
{$else WITHDMT}
|
|
- vmtmethodoffset:=(index+3)*sizeof(pint);
|
|
|
|
|
|
+ vmtmethodoffset:=index*codeptrsize+3*sizeof(pint);
|
|
{$endif WITHDMT}
|
|
{$endif WITHDMT}
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|