| 2407 | } |
| 2408 | |
| 2409 | void parseMethodTable(Thread* t, Stream& s, GcClass* class_, GcSingleton* pool) |
| 2410 | { |
| 2411 | PROTECT(t, class_); |
| 2412 | PROTECT(t, pool); |
| 2413 | |
| 2414 | GcHashMap* virtualMap = makeHashMap(t, 0, 0); |
| 2415 | PROTECT(t, virtualMap); |
| 2416 | |
| 2417 | unsigned virtualCount = 0; |
| 2418 | unsigned declaredVirtualCount = 0; |
| 2419 | |
| 2420 | GcArray* superVirtualTable = 0; |
| 2421 | PROTECT(t, superVirtualTable); |
| 2422 | |
| 2423 | if ((class_->flags() & ACC_INTERFACE) == 0) { |
| 2424 | if (class_->super()) { |
| 2425 | superVirtualTable = cast<GcArray>(t, class_->super()->virtualTable()); |
| 2426 | } |
| 2427 | |
| 2428 | if (superVirtualTable) { |
| 2429 | virtualCount = superVirtualTable->length(); |
| 2430 | for (unsigned i = 0; i < virtualCount; ++i) { |
| 2431 | object method = superVirtualTable->body()[i]; |
| 2432 | hashMapInsert(t, virtualMap, method, method, methodHash); |
| 2433 | } |
| 2434 | } |
| 2435 | } |
| 2436 | |
| 2437 | GcList* newVirtuals = makeList(t, 0, 0, 0); |
| 2438 | PROTECT(t, newVirtuals); |
| 2439 | |
| 2440 | unsigned count = s.read2(); |
| 2441 | |
| 2442 | if (DebugClassReader) { |
| 2443 | fprintf(stderr, " method count %d\n", count); |
| 2444 | } |
| 2445 | |
| 2446 | if (count) { |
| 2447 | GcArray* methodTable = makeArray(t, count); |
| 2448 | PROTECT(t, methodTable); |
| 2449 | |
| 2450 | GcMethodAddendum* addendum = 0; |
| 2451 | PROTECT(t, addendum); |
| 2452 | |
| 2453 | GcCode* code = 0; |
| 2454 | PROTECT(t, code); |
| 2455 | |
| 2456 | for (unsigned i = 0; i < count; ++i) { |
| 2457 | unsigned flags = s.read2(); |
| 2458 | unsigned name = s.read2(); |
| 2459 | unsigned spec = s.read2(); |
| 2460 | |
| 2461 | if (DebugClassReader) { |
| 2462 | fprintf(stderr, |
| 2463 | " method flags %d name %d spec %d '%s%s'\n", |
| 2464 | flags, |
| 2465 | name, |
| 2466 | spec, |
no test coverage detected