Changeset 761
- Timestamp:
- 06/25/08 02:25:40 (2 months ago)
- Files:
-
- trunk/phobos/internal/object.d (modified) (50 diffs)
- trunk/phobos/object.d (modified) (2 diffs)
- trunk/phobos/std/bitmanip.d (modified) (1 diff)
- trunk/phobos/std/regexp.d (modified) (1 diff)
- trunk/phobos/std/typeinfo/ti_AC.d (modified) (1 diff)
- trunk/phobos/std/typeinfo/ti_Acdouble.d (modified) (2 diffs)
- trunk/phobos/std/typeinfo/ti_Acfloat.d (modified) (2 diffs)
- trunk/phobos/std/typeinfo/ti_Acreal.d (modified) (2 diffs)
- trunk/phobos/std/typeinfo/ti_Adouble.d (modified) (2 diffs)
- trunk/phobos/std/typeinfo/ti_Afloat.d (modified) (2 diffs)
- trunk/phobos/std/typeinfo/ti_Ag.d (modified) (1 diff)
- trunk/phobos/std/typeinfo/ti_Aint.d (modified) (1 diff)
- trunk/phobos/std/typeinfo/ti_Along.d (modified) (1 diff)
- trunk/phobos/std/typeinfo/ti_Areal.d (modified) (2 diffs)
- trunk/phobos/std/typeinfo/ti_Ashort.d (modified) (1 diff)
- trunk/phobos/std/typeinfo/ti_C.d (modified) (1 diff)
- trunk/phobos/std/typeinfo/ti_byte.d (modified) (1 diff)
- trunk/phobos/std/typeinfo/ti_cdouble.d (modified) (2 diffs)
- trunk/phobos/std/typeinfo/ti_cfloat.d (modified) (2 diffs)
- trunk/phobos/std/typeinfo/ti_char.d (modified) (1 diff)
- trunk/phobos/std/typeinfo/ti_creal.d (modified) (2 diffs)
- trunk/phobos/std/typeinfo/ti_dchar.d (modified) (1 diff)
- trunk/phobos/std/typeinfo/ti_delegate.d (modified) (1 diff)
- trunk/phobos/std/typeinfo/ti_double.d (modified) (2 diffs)
- trunk/phobos/std/typeinfo/ti_float.d (modified) (2 diffs)
- trunk/phobos/std/typeinfo/ti_int.d (modified) (1 diff)
- trunk/phobos/std/typeinfo/ti_long.d (modified) (1 diff)
- trunk/phobos/std/typeinfo/ti_ptr.d (modified) (1 diff)
- trunk/phobos/std/typeinfo/ti_real.d (modified) (2 diffs)
- trunk/phobos/std/typeinfo/ti_short.d (modified) (1 diff)
- trunk/phobos/std/typeinfo/ti_ubyte.d (modified) (1 diff)
- trunk/phobos/std/typeinfo/ti_uint.d (modified) (1 diff)
- trunk/phobos/std/typeinfo/ti_ulong.d (modified) (1 diff)
- trunk/phobos/std/typeinfo/ti_ushort.d (modified) (1 diff)
- trunk/phobos/std/typeinfo/ti_void.d (modified) (1 diff)
- trunk/phobos/std/typeinfo/ti_wchar.d (modified) (1 diff)
- trunk/phobos/std/variant.d (modified) (1 diff)
- trunk/phobos/std/xml.d (modified) (9 diffs)
- trunk/phobos/win32.mak (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/phobos/internal/object.d
r758 r761 7 7 * This module is implicitly imported. 8 8 * Macros: 9 * WIKI = Phobos/Object9 * WIKI = Phobos/Object 10 10 */ 11 11 … … 94 94 void print() 95 95 { 96 printf("%.*s\n", toString());96 printf("%.*s\n", toString()); 97 97 } 98 98 … … 102 102 string toString() 103 103 { 104 return this.classinfo.name;104 return this.classinfo.name; 105 105 } 106 106 … … 110 110 hash_t toHash() 111 111 { 112 // BUG: this prevents a compacting GC from working, needs to be fixed113 return cast(uint)cast(void *)this;112 // BUG: this prevents a compacting GC from working, needs to be fixed 113 return cast(uint)cast(void *)this; 114 114 } 115 115 … … 117 117 * Compare with another Object obj. 118 118 * Returns: 119 * $(TABLE119 * $(TABLE 120 120 * $(TR $(TD this < obj) $(TD < 0)) 121 121 * $(TR $(TD this == obj) $(TD 0)) … … 125 125 int opCmp(Object o) 126 126 { 127 // BUG: this prevents a compacting GC from working, needs to be fixed128 //return cast(int)cast(void *)this - cast(int)cast(void *)o;129 130 throw new Error(cast(string) ("need opCmp for class "127 // BUG: this prevents a compacting GC from working, needs to be fixed 128 //return cast(int)cast(void *)this - cast(int)cast(void *)o; 129 130 throw new Error(cast(string) ("need opCmp for class " 131 131 ~ this.classinfo.name)); 132 132 } … … 135 135 * Returns !=0 if this object does have the same contents as obj. 136 136 */ 137 intopEquals(Object o)138 { 139 return cast(int)(this is o);137 bool opEquals(Object o) 138 { 139 return (this is o); 140 140 } 141 141 … … 151 151 final void notifyRegister(void delegate(Object) dg) 152 152 { 153 //printf("notifyRegister(dg = %llx, o = %p)\n", dg, this);154 synchronized (this)155 {156 Monitor* m = cast(Monitor*)(cast(void**)this)[1];157 foreach (inout x; m.delegates)158 {159 if (!x || x == dg)160 { x = dg;161 return;162 }163 }164 165 // Increase size of delegates[]166 auto len = m.delegates.length;167 auto startlen = len;168 if (len == 0)169 {170 len = 4;171 auto p = calloc((void delegate(Object)).sizeof, len);172 if (!p)173 _d_OutOfMemory();174 m.delegates = (cast(void delegate(Object)*)p)[0 .. len];175 }176 else177 {178 len += len + 4;179 auto p = realloc(m.delegates.ptr, (void delegate(Object)).sizeof * len);180 if (!p)181 _d_OutOfMemory();182 m.delegates = (cast(void delegate(Object)*)p)[0 .. len];183 m.delegates[startlen .. len] = null;184 }185 m.delegates[startlen] = dg;186 }153 //printf("notifyRegister(dg = %llx, o = %p)\n", dg, this); 154 synchronized (this) 155 { 156 Monitor* m = cast(Monitor*)(cast(void**)this)[1]; 157 foreach (inout x; m.delegates) 158 { 159 if (!x || x == dg) 160 { x = dg; 161 return; 162 } 163 } 164 165 // Increase size of delegates[] 166 auto len = m.delegates.length; 167 auto startlen = len; 168 if (len == 0) 169 { 170 len = 4; 171 auto p = calloc((void delegate(Object)).sizeof, len); 172 if (!p) 173 _d_OutOfMemory(); 174 m.delegates = (cast(void delegate(Object)*)p)[0 .. len]; 175 } 176 else 177 { 178 len += len + 4; 179 auto p = realloc(m.delegates.ptr, (void delegate(Object)).sizeof * len); 180 if (!p) 181 _d_OutOfMemory(); 182 m.delegates = (cast(void delegate(Object)*)p)[0 .. len]; 183 m.delegates[startlen .. len] = null; 184 } 185 m.delegates[startlen] = dg; 186 } 187 187 } 188 188 … … 194 194 final void notifyUnRegister(void delegate(Object) dg) 195 195 { 196 synchronized (this)197 {198 Monitor* m = cast(Monitor*)(cast(void**)this)[1];199 foreach (inout x; m.delegates)200 {201 if (x == dg)202 x = null;203 }204 }196 synchronized (this) 197 { 198 Monitor* m = cast(Monitor*)(cast(void**)this)[1]; 199 foreach (inout x; m.delegates) 200 { 201 if (x == dg) 202 x = null; 203 } 204 } 205 205 } 206 206 … … 210 210 * a default constructor. 211 211 * Returns: 212 * null if failed212 * null if failed 213 213 */ 214 214 static Object factory(string classname) 215 215 { 216 auto ci = ClassInfo.find(classname);217 if (ci)218 {219 return ci.create();220 }221 return null;216 auto ci = ClassInfo.find(classname); 217 if (ci) 218 { 219 return ci.create(); 220 } 221 return null; 222 222 } 223 223 } … … 229 229 if (m.delegates.length) 230 230 { 231 auto dgs = m.delegates;232 synchronized (o)233 {234 dgs = m.delegates;235 m.delegates = null;236 }237 238 foreach (dg; dgs)239 {240 if (dg)241 {//printf("calling dg = %llx (%p)\n", dg, o);242 dg(o);243 }244 }245 246 free(dgs.ptr);231 auto dgs = m.delegates; 232 synchronized (o) 233 { 234 dgs = m.delegates; 235 m.delegates = null; 236 } 237 238 foreach (dg; dgs) 239 { 240 if (dg) 241 { //printf("calling dg = %llx (%p)\n", dg, o); 242 dg(o); 243 } 244 } 245 246 free(dgs.ptr); 247 247 } 248 248 } … … 256 256 struct Interface 257 257 { 258 ClassInfo classinfo; /// .classinfo for this interface (not for containing class)258 ClassInfo classinfo; /// .classinfo for this interface (not for containing class) 259 259 void *[] vtbl; 260 int offset; /// offset to Interface 'this' from Object 'this'260 int offset; /// offset to Interface 'this' from Object 'this' 261 261 } 262 262 … … 269 269 class ClassInfo : Object 270 270 { 271 byte[] init; /** class static initializer272 * (init.length gives size in bytes of class)273 */274 string name; /// class name275 void *[] vtbl; /// virtual function pointer table276 Interface[] interfaces; /// interfaces this class implements277 ClassInfo base; /// base class271 byte[] init; /** class static initializer 272 * (init.length gives size in bytes of class) 273 */ 274 string name; /// class name 275 void *[] vtbl; /// virtual function pointer table 276 Interface[] interfaces; /// interfaces this class implements 277 ClassInfo base; /// base class 278 278 void *destructor; 279 279 void (*classInvariant)(Object); 280 280 uint flags; 281 // 1:// is IUnknown or is derived from IUnknown282 // 2:// has no possible pointers into GC memory283 // 4:// has offTi[] member284 // 8:// has constructors285 // 16: // has xgetMembers member281 // 1: // is IUnknown or is derived from IUnknown 282 // 2: // has no possible pointers into GC memory 283 // 4: // has offTi[] member 284 // 8: // has constructors 285 // 16: // has xgetMembers member 286 286 void *deallocator; 287 287 OffsetTypeInfo[] offTi; 288 void function(Object) defaultConstructor; // default Constructor288 void function(Object) defaultConstructor; // default Constructor 289 289 const(MemberInfo[]) function(string) xgetMembers; 290 290 … … 295 295 static ClassInfo find(string classname) 296 296 { 297 foreach (m; ModuleInfo.modules())298 {299 //writefln("module %s, %d", m.name, m.localClasses.length);300 foreach (c; m.localClasses)301 {302 //writefln("\tclass %s", c.name);303 if (c.name == classname)304 return c;305 }306 }307 return null;297 foreach (m; ModuleInfo.modules()) 298 { 299 //writefln("module %s, %d", m.name, m.localClasses.length); 300 foreach (c; m.localClasses) 301 { 302 //writefln("\tclass %s", c.name); 303 if (c.name == classname) 304 return c; 305 } 306 } 307 return null; 308 308 } 309 309 … … 311 311 * Create instance of Object represented by 'this'. 312 312 * Returns: 313 * the object created, or null if the Object does314 * does not have a default constructor313 * the object created, or null if the Object does 314 * does not have a default constructor 315 315 */ 316 316 Object create() 317 317 { 318 if (flags & 8 && !defaultConstructor)319 return null;320 Object o = _d_newclass(this);321 if (flags & 8 && defaultConstructor)322 {323 defaultConstructor(o);324 }325 return o;318 if (flags & 8 && !defaultConstructor) 319 return null; 320 Object o = _d_newclass(this); 321 if (flags & 8 && defaultConstructor) 322 { 323 defaultConstructor(o); 324 } 325 return o; 326 326 } 327 327 … … 332 332 const(MemberInfo[]) getMembers(string name) 333 333 { 334 if (flags & 16 && xgetMembers)335 {336 return xgetMembers(name);337 }338 return null;334 if (flags & 16 && xgetMembers) 335 { 336 return xgetMembers(name); 337 } 338 return null; 339 339 } 340 340 } … … 350 350 struct OffsetTypeInfo 351 351 { 352 size_t offset; /// Offset of member from start of object353 TypeInfo ti; /// TypeInfo for this member352 size_t offset; /// Offset of member from start of object 353 TypeInfo ti; /// TypeInfo for this member 354 354 } 355 355 … … 363 363 { 364 364 override hash_t toHash() 365 { 366 hash_t hash; 367 368 foreach (char c; this.toString()) 369 hash = hash * 9 + c; 370 return hash; 365 { hash_t hash; 366 367 foreach (char c; this.toString()) 368 hash = hash * 9 + c; 369 return hash; 371 370 } 372 371 373 372 override int opCmp(Object o) 374 373 { 375 if (this is o)376 return 0;377 TypeInfo ti = cast(TypeInfo)o;378 if (ti is null)379 return 1;380 return std.string.cmp(this.toString(), ti.toString());381 } 382 383 override intopEquals(Object o)384 { 385 /* TypeInfo instances are singletons, but duplicates can exist386 * across DLL's. Therefore, comparing for a name match is387 * sufficient.388 */389 if (this is o)390 return 1;391 TypeInfo ti = cast(TypeInfo)o;392 return cast(int)(ti && this.toString() == ti.toString());374 if (this is o) 375 return 0; 376 TypeInfo ti = cast(TypeInfo)o; 377 if (ti is null) 378 return 1; 379 return std.string.cmp(this.toString(), ti.toString()); 380 } 381 382 override bool opEquals(Object o) 383 { 384 /* TypeInfo instances are singletons, but duplicates can exist 385 * across DLL's. Therefore, comparing for a name match is 386 * sufficient. 387 */ 388 if (this is o) 389 return 1; 390 TypeInfo ti = cast(TypeInfo)o; 391 return (ti && this.toString() == ti.toString()); 393 392 } 394 393 … … 397 396 398 397 /// Compares two instances for equality. 399 int equals(in void *p1, in void *p2) { return cast(int)(p1 == p2); }398 bool equals(in void *p1, in void *p2) { return (p1 == p2); } 400 399 401 400 /// Compares two instances for <, ==, or >. … … 408 407 void swap(void *p1, void *p2) 409 408 { 410 size_t n = tsize();411 for (size_t i = 0; i < n; i++)412 { byte t;413 414 t = (cast(byte *)p1)[i];415 (cast(byte *)p1)[i] = (cast(byte *)p2)[i];416 (cast(byte *)p2)[i] = t;417 }409 size_t n = tsize(); 410 for (size_t i = 0; i < n; i++) 411 { byte t; 412 413 t = (cast(byte *)p1)[i]; 414 (cast(byte *)p1)[i] = (cast(byte *)p2)[i]; 415 (cast(byte *)p2)[i] = t; 416 } 418 417 } 419 418 … … 442 441 override string toString() { return name; } 443 442 444 override intopEquals(Object o)443 override bool opEquals(Object o) 445 444 { TypeInfo_Typedef c; 446 445 447 return cast(int) 448 (this is o || 449 ((c = cast(TypeInfo_Typedef)o) !is null && 450 this.name == c.name && 451 this.base == c.base)); 446 return this is o || 447 ((c = cast(TypeInfo_Typedef)o) !is null && 448 this.name == c.name && 449 this.base == c.base); 452 450 } 453 451 454 452 override hash_t getHash(in void *p) { return base.getHash(p); } 455 override intequals(in void *p1, in void *p2) { return base.equals(p1, p2); }453 override bool equals(in void *p1, in void *p2) { return base.equals(p1, p2); } 456 454 override int compare(in void *p1, in void *p2) { return base.compare(p1, p2); } 457 455 override size_t tsize() { return base.tsize(); } … … 478 476 override string toString() { return cast(string) (m_next.toString() ~ "*"); } 479 477 480 override intopEquals(Object o)478 override bool opEquals(Object o) 481 479 { TypeInfo_Pointer c; 482 480 483 return this is o ||484 ((c = cast(TypeInfo_Pointer)o) !is null &&485 this.m_next == c.m_next);481 return this is o || 482 ((c = cast(TypeInfo_Pointer)o) !is null && 483 this.m_next == c.m_next); 486 484 } 487 485 … … 491 489 } 492 490 493 override intequals(in void *p1, in void *p2)494 { 495 return cast(int)(*cast(void* *)p1 == *cast(void* *)p2);491 override bool equals(in void *p1, in void *p2) 492 { 493 return (*cast(void* *)p1 == *cast(void* *)p2); 496 494 } 497 495 498 496 override int compare(in void *p1, in void *p2) 499 497 { 500 if (*cast(void* *)p1 < *cast(void* *)p2)501 return -1;502 else if (*cast(void* *)p1 > *cast(void* *)p2)503 return 1;504 else505 return 0;498 if (*cast(void* *)p1 < *cast(void* *)p2) 499 return -1; 500 else if (*cast(void* *)p1 > *cast(void* *)p2) 501 return 1; 502 else 503 return 0; 506 504 } 507 505 508 506 override size_t tsize() 509 507 { 510 return (void*).sizeof;508 return (void*).sizeof; 511 509 } 512 510 513 511 override void swap(void *p1, void *p2) 514 { 515 void* tmp; 516 tmp = *cast(void**)p1; 517 *cast(void**)p1 = *cast(void**)p2; 518 *cast(void**)p2 = tmp; 512 { void* tmp; 513 tmp = *cast(void**)p1; 514 *cast(void**)p1 = *cast(void**)p2; 515 *cast(void**)p2 = tmp; 519 516 } 520 517 … … 529 526 override string toString() { return cast(string) (value.toString() ~ "[]"); } 530 527 531 override intopEquals(Object o)528 override bool opEquals(Object o) 532 529 { TypeInfo_Array c; 533 530 534 return cast(int) 535 (this is o || 536 ((c = cast(TypeInfo_Array)o) !is null && 537 this.value == c.value)); 531 return this is o || 532 ((c = cast(TypeInfo_Array)o) !is null && 533 this.value == c.value); 538 534 } 539 535 540 536 override hash_t getHash(in void *p) 541 { 542 size_t sz = value.tsize(); 543 hash_t hash = 0; 544 void[] a = *cast(void[]*)p; 545 for (size_t i = 0; i < a.length; i++) 546 hash += value.getHash(a.ptr + i * sz); 537 { size_t sz = value.tsize(); 538 hash_t hash = 0; 539 void[] a = *cast(void[]*)p; 540 for (size_t i = 0; i < a.length; i++) 541 hash += value.getHash(a.ptr + i * sz); 547 542 return hash; 548 543 } 549 544 550 override intequals(in void *p1, in void *p2)551 { 552 void[] a1 = *cast(void[]*)p1;553 void[] a2 = *cast(void[]*)p2;554 if (a1.length != a2.length)555 return 0;556 size_t sz = value.tsize();557 for (size_t i = 0; i < a1.length; i++)558 {559 if (!value.equals(a1.ptr + i * sz, a2.ptr + i * sz))560 return 0;561 }545 override bool equals(in void *p1, in void *p2) 546 { 547 void[] a1 = *cast(void[]*)p1; 548 void[] a2 = *cast(void[]*)p2; 549 if (a1.length != a2.length) 550 return 0; 551 size_t sz = value.tsize(); 552 for (size_t i = 0; i < a1.length; i++) 553 { 554 if (!value.equals(a1.ptr + i * sz, a2.ptr + i * sz)) 555 return 0; 556 } 562 557 return 1; 563 558 } … … 565 560 override int compare(in void *p1, in void *p2) 566 561 { 567 void[] a1 = *cast(void[]*)p1;568 void[] a2 = *cast(void[]*)p2;569 size_t sz = value.tsize();570 size_t len = a1.length;562 void[] a1 = *cast(void[]*)p1; 563 void[] a2 = *cast(void[]*)p2; 564 size_t sz = value.tsize(); 565 size_t len = a1.length; 571 566 572 567 if (a2.length < len) … … 583 578 override size_t tsize() 584 579 { 585 return (void[]).sizeof;580 return (void[]).sizeof; 586 581 } 587 582 588 583 override void swap(void *p1, void *p2) 589 { 590 void[] tmp; 591 tmp = *cast(void[]*)p1; 592 *cast(void[]*)p1 = *cast(void[]*)p2; 593 *cast(void[]*)p2 = tmp; 584 { void[] tmp; 585 tmp = *cast(void[]*)p1; 586 *cast(void[]*)p1 = *cast(void[]*)p2; 587 *cast(void[]*)p2 = tmp; 594 588 } 595 589 … … 598 592 override TypeInfo next() 599 593 { 600 return value;594 return value; 601 595 } 602 596 … … 608 602 override string toString() 609 603 { 610 return cast(string)604 return cast(string) 611 605 (value.toString() ~ "[" ~ std.string.toString(len) ~ "]"); 612 606 } 613 607 614 override intopEquals(Object o)608 override bool opEquals(Object o) 615 609 { TypeInfo_StaticArray c; 616 610 617 return cast(int) 618 (this is o || 619 ((c = cast(TypeInfo_StaticArray)o) !is null && 620 this.len == c.len && 621 this.value == c.value)); 611 return this is o || 612 ((c = cast(TypeInfo_StaticArray)o) !is null && 613 this.len == c.len && 614 this.value == c.value); 622 615 } 623 616 624 617 override hash_t getHash(in void *p) 625 { 626 size_t sz = value.tsize(); 627 hash_t hash = 0; 628 for (size_t i = 0; i < len; i++) 629 hash += value.getHash(p + i * sz); 618 { size_t sz = value.tsize(); 619 hash_t hash = 0; 620 for (size_t i = 0; i < len; i++) 621 hash += value.getHash(p + i * sz); 630 622 return hash; 631 623 } 632 624 633 override intequals(in void *p1, in void *p2)634 { 635 size_t sz = value.tsize();625 override bool equals(in void *p1, in void *p2) 626 { 627 size_t sz = value.tsize(); 636 628 637 629 for (size_t u = 0; u < len; u++) 638 630 { 639 if (!value.equals(p1 + u * sz, p2 + u * sz))640 return 0;631 if (!value.equals(p1 + u * sz, p2 + u * sz)) 632 return 0; 641 633 } 642 634 return 1; … … 645 637 override int compare(in void *p1, in void *p2) 646 638 { 647 size_t sz = value.tsize();639 size_t sz = value.tsize(); 648 640 649 641 for (size_t u = 0; u < len; u++) … … 658 650 override size_t tsize() 659 651 { 660 return len * value.tsize();652 return len * value.tsize(); 661 653 } 662 654 663 655 override void swap(void *p1, void *p2) 664 { 665 void* tmp; 666 size_t sz = value.tsize(); 667 ubyte[16] buffer; 668 void* pbuffer; 669 670 if (sz < buffer.sizeof) 671 tmp = buffer.ptr; 672 else 673 tmp = pbuffer = (new void[sz]).ptr; 674 675 for (size_t u = 0; u < len; u += sz) 676 { size_t o = u * sz; 677 memcpy(tmp, p1 + o, sz); 678 memcpy(p1 + o, p2 + o, sz); 679 memcpy(p2 + o, tmp, sz); 680 } 681 if (pbuffer) 682 delete pbuffer; 656 { void* tmp; 657 size_t sz = value.tsize(); 658 ubyte[16] buffer; 659 void* pbuffer; 660 661 if (sz < buffer.sizeof) 662 tmp = buffer.ptr; 663 else 664 tmp = pbuffer = (new void[sz]).ptr; 665 666 for (size_t u = 0; u < len; u += sz) 667 { size_t o = u * sz; 668 memcpy(tmp, p1 + o, sz); 669 memcpy(p1 + o, p2 + o, sz); 670 memcpy(p2 + o, tmp, sz); 671 } 672 if (pbuffer) 673 delete pbuffer; 683 674 } 684 675 … … 689 680 override void destroy(void *p) 690 681 { 691 auto sz = value.tsize();692 p += sz * len;693 foreach (i; 0 .. len)694 {695 p -= sz;696 value.destroy(p);697 }682 auto sz = value.tsize(); 683 p += sz * len; 684 foreach (i; 0 .. len) 685 { 686 p -= sz; 687 value.destroy(p); 688 } 698 689 } 699 690 700 691 override void postblit(void *p) 701 692 { 702 auto sz = value.tsize();703 foreach (i; 0 .. len)704 {705 value.postblit(p);706 p += sz;707 }693 auto sz = value.tsize(); 694 foreach (i; 0 .. len) 695 { 696 value.postblit(p); 697 p += sz; 698 } 708 699 } 709 700 … … 716 707 override string toString() 717 708 { 718 return cast(string) (value.toString() ~ "[" ~ key.toString() ~ "]");719 } 720 721 override intopEquals(Object o)709 return cast(string) (value.toString() ~ "[" ~ key.toString() ~ "]"); 710 } 711 712 override bool opEquals(Object o) 722 713 { TypeInfo_AssociativeArray c; 723 714 724 return this is o ||725 ((c = cast(TypeInfo_AssociativeArray)o) !is null &&726 this.key == c.key &&727 this.value == c.value);715 return this is o || 716 ((c = cast(TypeInfo_AssociativeArray)o) !is null && 717 this.key == c.key && 718 this.value == c.value); 728 719 } 729 720 … … 732 723 override size_t tsize() 733 724 { 734 return (char[int]).sizeof;725 return (char[int]).sizeof; 735 726 } 736 727 … … 746 737 override string toString() 747 738 { 748 return cast(string) (next.toString() ~ "()");749 } 750 751 override intopEquals(Object o)739 return cast(string) (next.toString() ~ "()"); 740 } 741 742 override bool opEquals(Object o) 752 743 { TypeInfo_Function c; 753 744 754 return this is o ||755 ((c = cast(TypeInfo_Function)o) !is null &&756 this.next == c.next);745 return this is o || 746 ((c = cast(TypeInfo_Function)o) !is null && 747 this.next == c.next); 757 748 } 758 749 … … 761 752 override size_t tsize() 762 753 { 763 return 0;// no size for functions764 } 765 766 TypeInfo next; // function return type754 return 0; // no size for functions 755 } 756 757 TypeInfo next; // function return type 767 758 } 768 759 … … 771 762 override string toString() 772 763 { 773 return cast(string) (next.toString() ~ " delegate()");774 } 775 776 override intopEquals(Object o)764 return cast(string) (next.toString() ~ " delegate()"); 765 } 766 767 override bool opEquals(Object o) 777 768 { TypeInfo_Delegate c; 778 769 779 return this is o ||780 ((c = cast(TypeInfo_Delegate)o) !is null &&781 this.next == c.next);770 return this is o || 771 ((c = cast(TypeInfo_Delegate)o) !is null && 772 this.next == c.next); 782 773 } 783 774 … … 785 776 786 777 override size_t tsize() 787 { 788 alias int delegate() dg; 789 return dg.sizeof; 778 { alias int delegate() dg; 779 return dg.sizeof; 790 780 } 791 781 792 782 override uint flags() { return 1; } 793 783 794 TypeInfo next; // delegate return type784 TypeInfo next; // delegate return type 795 785 } 796 786 … … 799 789 override string toString() { return info.name; } 800 790 801 override intopEquals(Object o)791 override bool opEquals(Object o) 802 792 { TypeInfo_Class c; 803 793 804 return this is o ||805 ((c = cast(TypeInfo_Class)o) !is null &&806 this.info.name == c.classinfo.name);794 return this is o || 795 ((c = cast(TypeInfo_Class)o) !is null && 796 this.info.name == c.classinfo.name); 807 797 } 808 798 809 799 override hash_t getHash(in void *p) 810 800 { 811 Object o = *cast(Object*)p;812 return o ? o.toHash() : 0;813 } 814 815 override intequals(in void *p1, in void *p2)816 { 817 Object o1 = *cast(Object*)p1;818 Object o2 = *cast(Object*)p2;819 820 return (o1 is o2) || (o1 && o1.opEquals(o2));801 Object o = *cast(Object*)p; 802 return o ? o.toHash() : 0; 803 } 804 805 override bool equals(in void *p1, in void *p2) 806 { 807 Object o1 = *cast(Object*)p1; 808 Object o2 = *cast(Object*)p2; 809 810 return (o1 is o2) || (o1 && o1.opEquals(o2)); 821 811 } 822 812 823 813 override int compare(in void *p1, in void *p2) 824 814 { 825 Object o1 = *cast(Object*)p1; 826 Object o2 = *cast(Object*)p2; 827 int c = 0; 828 829 // Regard null references as always being "less than" 830 if (o1 !is o2) 831 { 832 if (o1) 833 { 834 if (!o2) 835 c = 1; 836 else 837 c = o1.opCmp(o2); 838 } 839 else 840 c = -1; 841 } 842 return c; 815 Object o1 = *cast(Object*)p1; 816 Object o2 = *cast(Object*)p2; 817 int c = 0; 818 819 // Regard null references as always being "less than" 820 if (o1 !is o2) 821 { 822 if (o1) 823 { if (!o2) 824 c = 1; 825 else 826 c = o1.opCmp(o2); 827 } 828 else 829 c = -1; 830 } 831 return c; 843 832 } 844 833 845 834 override size_t tsize() 846 835 { 847 return Object.sizeof;836 return Object.sizeof; 848 837 } 849 838 … … 852 841 override OffsetTypeInfo[] offTi() 853 842 { 854 return (info.flags & 4) ? info.offTi : null;843 return (info.flags & 4) ? info.offTi : null; 855 844 } 856 845 … … 862 851 override string toString() { return info.name; } 863 852 864 override intopEquals(Object o)853 override bool opEquals(Object o) 865 854 { TypeInfo_Interface c; 866 855 867 return this is o ||868 ((c = cast(TypeInfo_Interface)o) !is null &&869 this.info.name == c.classinfo.name);856 return this is o || 857 ((c = cast(TypeInfo_Interface)o) !is null && 858 this.info.name == c.classinfo.name); 870 859 } 871 860 872 861 override hash_t getHash(in void *p) 873 862 { 874 Interface* pi = **cast
