| 414 | } |
| 415 | |
| 416 | void ScriptingType::SetupScriptVTable(ScriptingTypeHandle baseTypeHandle) |
| 417 | { |
| 418 | // Call setup for all class starting from the first native type (first that uses virtual calls will allocate table of a proper size, further base types will just add own methods) |
| 419 | for (ScriptingTypeHandle e = baseTypeHandle; e;) |
| 420 | { |
| 421 | const ScriptingType& eType = e.GetType(); |
| 422 | |
| 423 | if (eType.Script.SetupScriptVTable) |
| 424 | { |
| 425 | ASSERT(eType.ManagedClass); |
| 426 | eType.Script.SetupScriptVTable(eType.ManagedClass, Script.ScriptVTable, Script.ScriptVTableBase); |
| 427 | } |
| 428 | |
| 429 | auto interfaces = eType.Interfaces; |
| 430 | if (interfaces && Script.ScriptVTable) |
| 431 | { |
| 432 | while (interfaces->InterfaceType) |
| 433 | { |
| 434 | auto& interfaceType = interfaces->InterfaceType->GetType(); |
| 435 | if (interfaceType.Interface.SetupScriptVTable) |
| 436 | { |
| 437 | ASSERT(eType.ManagedClass); |
| 438 | const auto scriptOffset = interfaces->ScriptVTableOffset; // Shift the script vtable for the interface implementation start |
| 439 | Script.ScriptVTable += scriptOffset; |
| 440 | Script.ScriptVTableBase += scriptOffset; |
| 441 | interfaceType.Interface.SetupScriptVTable(eType.ManagedClass, Script.ScriptVTable, Script.ScriptVTableBase); |
| 442 | Script.ScriptVTable -= scriptOffset; |
| 443 | Script.ScriptVTableBase -= scriptOffset; |
| 444 | } |
| 445 | interfaces++; |
| 446 | } |
| 447 | } |
| 448 | e = eType.GetBaseType(); |
| 449 | } |
| 450 | } |
| 451 | |
| 452 | NO_SANITIZE_ADDRESS |
| 453 | void ScriptingType::SetupScriptObjectVTable(void* object, ScriptingTypeHandle baseTypeHandle, int32 wrapperIndex) |
no test coverage detected