FixedWidthPointer: Fix ==/!= operators, remove OtherType casts

* FixedWidthPointer:
  - operators ==/!=: Change second operand type from void* to const
    Type*. Also add non-const version to resolve ambiguity warning when
    comparing with non-const pointer.
  - Add Pointer() getter.
  - Remove templatized cast operators. They are nice for casting the
    pointer directly to another pointer type, but result in ambiguity.
* Make preloaded_image::debug_string_table non-const. Avoids clashes of
  the const and non-coast FixedWidthPointer comparison operators. A
  cleaner (but more verbose) solution would be to spezialize
  FixedWidthPointer for const types.
This commit is contained in:
Ingo Weinhold
2012-06-24 15:26:00 +01:00
committed by Alex Smith
parent ccadfaeeb5
commit 69a8b95491
7 changed files with 42 additions and 22 deletions
+1 -1
View File
@@ -32,7 +32,7 @@ struct preloaded_image {
uint8 elf_class;
addr_range dynamic_section;
FixedWidthPointer<const char> debug_string_table;
FixedWidthPointer<char> debug_string_table;
uint32 num_debug_symbols;
uint32 debug_string_table_size;
+29 -13
View File
@@ -20,30 +20,29 @@
template<typename Type>
class FixedWidthPointer {
public:
operator Type*() const
Type * Pointer() const
{
return (Type*)(addr_t)fValue;
}
template<typename OtherType>
operator OtherType*() const
operator Type*() const
{
return static_cast<OtherType*>((Type*)(addr_t)fValue);
return Pointer();
}
Type& operator*() const
{
return *((Type*)(addr_t)fValue);
return *Pointer();
}
Type* operator->() const
{
return (Type*)(addr_t)fValue;
return Pointer();
}
Type& operator[](size_t i) const
{
return ((Type*)(addr_t)fValue)[i];
return Pointer()[i];
}
FixedWidthPointer& operator=(const FixedWidthPointer& p)
@@ -85,15 +84,14 @@ private:
template<>
class FixedWidthPointer<void> {
public:
operator void*() const
void * Pointer() const
{
return (void*)(addr_t)fValue;
}
template<typename OtherType>
operator OtherType*() const
operator void*() const
{
return (OtherType*)(addr_t)fValue;
return Pointer();
}
FixedWidthPointer& operator=(const FixedWidthPointer& p)
@@ -122,16 +120,34 @@ private:
uint64 fValue;
} _PACKED;
template<typename Type>
inline bool
operator==(const FixedWidthPointer<Type>& a, void* b)
operator==(const FixedWidthPointer<Type>& a, const Type* b)
{
return a.Get() == (addr_t)b;
}
template<typename Type>
inline bool
operator!=(const FixedWidthPointer<Type>& a, void* b)
operator!=(const FixedWidthPointer<Type>& a, const Type* b)
{
return a.Get() != (addr_t)b;
}
template<typename Type>
inline bool
operator==(const FixedWidthPointer<Type>& a, Type* b)
{
return a.Get() == (addr_t)b;
}
template<typename Type>
inline bool
operator!=(const FixedWidthPointer<Type>& a, Type* b)
{
return a.Get() != (addr_t)b;
}
+5 -3
View File
@@ -534,7 +534,7 @@ debug_menu_display_current_log(Menu* menu, MenuItem* item)
static bool
debug_menu_display_previous_syslog(Menu* menu, MenuItem* item)
{
ring_buffer* buffer = (ring_buffer*)gKernelArgs.debug_output;
ring_buffer* buffer = (ring_buffer*)gKernelArgs.debug_output.Pointer();
if (buffer == NULL)
return true;
@@ -595,7 +595,8 @@ save_previous_syslog_to_volume(Directory* directory)
return fd;
}
ring_buffer* syslogBuffer = (ring_buffer*)gKernelArgs.debug_output;
ring_buffer* syslogBuffer
= (ring_buffer*)gKernelArgs.debug_output.Pointer();
iovec vecs[2];
int32 vecCount = ring_buffer_get_vecs(syslogBuffer, vecs);
if (vecCount > 0) {
@@ -899,7 +900,8 @@ add_debug_menu()
"Displays the debug info the boot loader has logged.");
}
ring_buffer* syslogBuffer = (ring_buffer*)gKernelArgs.debug_output;
ring_buffer* syslogBuffer
= (ring_buffer*)gKernelArgs.debug_output.Pointer();
if (syslogBuffer != NULL && ring_buffer_readable(syslogBuffer) > 0) {
if (!currentLogItemVisible)
menu->AddSeparatorItem();
+1 -1
View File
@@ -357,7 +357,7 @@ smp_cpu_ready(void)
//TRACE(("smp_cpu_ready: entry cpu %ld\n", curr_cpu));
preloaded_elf32_image *image = static_cast<preloaded_elf32_image *>(
gKernelArgs.kernel_image);
gKernelArgs.kernel_image.Pointer());
// Important. Make sure supervisor threads can fault on read only pages...
asm("movl %%eax, %%cr0" : : "a" ((1 << 31) | (1 << 16) | (1 << 5) | 1));
+1 -1
View File
@@ -83,7 +83,7 @@ platform_start_kernel(void)
= gKernelArgs.cpu_kstack[0].start + gKernelArgs.cpu_kstack[0].size;
preloaded_elf32_image *image = static_cast<preloaded_elf32_image *>(
gKernelArgs.kernel_image);
gKernelArgs.kernel_image.Pointer());
smp_init_other_cpus();
debug_cleanup();
@@ -221,7 +221,7 @@ hpet_init(struct kernel_args *args)
return B_ERROR;
if (sHPETRegs == NULL) {
sHPETRegs = (struct hpet_regs *)args->arch_args.hpet;
sHPETRegs = (struct hpet_regs *)args->arch_args.hpet.Pointer();
if (vm_map_physical_memory(B_SYSTEM_TEAM, "hpet",
(void **)&sHPETRegs, B_EXACT_ADDRESS, B_PAGE_SIZE,
B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA,
+4 -2
View File
@@ -1401,8 +1401,10 @@ syslog_init_post_vm(struct kernel_args* args)
sSyslogMessage->ident[0] = '\0';
//strcpy(sSyslogMessage->ident, "KERNEL");
if (args->debug_output != NULL)
syslog_write((const char*)args->debug_output, args->debug_size, false);
if (args->debug_output != NULL) {
syslog_write((const char*)args->debug_output.Pointer(),
args->debug_size, false);
}
char revisionBuffer[64];
length = snprintf(revisionBuffer, sizeof(revisionBuffer),