Thread overview | ||||||
---|---|---|---|---|---|---|
|
June 26, 2017 Modifying vtbl in ClassInfo | ||||
---|---|---|---|---|
| ||||
I realize I am doing bad things, anyway... I'd like to modify the vtbl inside ClassInfo. My goal is to stick a pointer inside each instance of a series of types, and I thought I'd reserve a slot in the vtbl and put the pointer in place of the function, like this: import std.stdio; class MethObject { void methSlotTable() { } } int[] a_slots = [ 0, 1 ]; void main() { int firstUserVFunc = 5; assert(MethObject.classinfo.vtbl[firstUserVFunc] == &MethObject.methSlotTable); writeln(MethObject.classinfo.vtbl); MethObject.classinfo.vtbl[firstUserVFunc] = cast(void*) a_slots.ptr; } Not so surprisingly, I get a segfault: ldc2 -unittest --run abi.d [624230, 40CC50, 40C9E0, 40CC70, 40CB70, 40CED0] Error: abi failed with status: -2 Error: message: Segmentation fault (core dumped) Error: program received signal 2 (Interrupt) Is the vtbl mprotected? Is there a chance of making this work? |
June 27, 2017 Re: Modifying vtbl in ClassInfo | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jean-Louis Leroy | On 2017-06-27 00:19, Jean-Louis Leroy wrote: > I realize I am doing bad things, anyway... > > I'd like to modify the vtbl inside ClassInfo. My goal is to stick a > pointer inside each instance of a series of types, and I thought I'd > reserve a slot in the vtbl and put the pointer in place of the function, > like this: > > import std.stdio; > > class MethObject > { > void methSlotTable() { } > } > > int[] a_slots = [ 0, 1 ]; > > void main() > { > int firstUserVFunc = 5; > assert(MethObject.classinfo.vtbl[firstUserVFunc] == > &MethObject.methSlotTable); > writeln(MethObject.classinfo.vtbl); > MethObject.classinfo.vtbl[firstUserVFunc] = cast(void*) a_slots.ptr; > } > > Not so surprisingly, I get a segfault: > ldc2 -unittest --run abi.d > [624230, 40CC50, 40C9E0, 40CC70, 40CB70, 40CED0] > Error: abi failed with status: -2 > Error: message: Segmentation fault (core dumped) > Error: program received signal 2 (Interrupt) > > Is the vtbl mprotected? Is there a chance of making this work? It works for me on macOS using DMD. Might behave differently on different systems with different compilers. -- /Jacob Carlborg |
July 21, 2017 Re: Modifying vtbl in ClassInfo | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jean-Louis Leroy | You could make it work by making a copy of the vtbl[], modifying it as you please, and seeing __vptr to it. If you're trying to implement signals and slots, it's already in the library: http://dlang.org/phobos/std_signals.html |
July 23, 2017 Re: Modifying vtbl in ClassInfo | ||||
---|---|---|---|---|
| ||||
Posted in reply to Walter Bright | On Saturday, 22 July 2017 at 01:18:12 UTC, Walter Bright wrote:
> You could make it work by making a copy of the vtbl[], modifying it as you please, and seeing __vptr to it.
>
> If you're trying to implement signals and slots, it's already in the library:
>
> http://dlang.org/phobos/std_signals.html
Thanks for the suggestion. I am working on open methods, not signals. So far I've hijacked the 'deallocator' field but now I am experimenting with a perfect hash of the vptr. Seems to work quite well...
|
Copyright © 1999-2021 by the D Language Foundation