330 return 0;
331
332 expr = strip_expr(expr);
333 if (!expr)
334 return 0;
335
336 if (is_array(expr))
337 return get_array_mtag_offset(expr, tag, offset);
338
339 if (expr->type == EXPR_PREOP && expr->op == '*') {
340 expr = strip_expr(expr->unop);
341 return get_implied_mtag_offset(expr, tag, offset);
342 } else if (expr->type == EXPR_DEREF) {
343 int tmp, tmp_offset = 0;
344
345 while (expr->type == EXPR_DEREF) {
346 tmp = get_member_offset_from_deref(expr);
347 if (tmp < 0)
348 return 0;
349 tmp_offset += tmp;
350 expr = expr->deref;
351 }
352 *offset = tmp_offset;
353 if (expr->type == EXPR_PREOP && expr->op == '*') {
354 expr = strip_expr(expr->unop);
355
356 if (get_implied_mtag_offset(expr, tag, &tmp_offset)) {
357 // FIXME: look it up recursively?
358 if (tmp_offset)
359 return 0;
360 return 1;
361 }
362 return 0;
363 } else if (expr->type == EXPR_SYMBOL) {
364 return get_symbol_mtag(expr->symbol, tag);
365 }
366 return 0;
367 } else if (expr->type == EXPR_SYMBOL) {
368 return get_symbol_mtag(expr->symbol, tag);
369 }
370 return 0;
|
330 return 0;
331
332 expr = strip_expr(expr);
333 if (!expr)
334 return 0;
335
336 if (is_array(expr))
337 return get_array_mtag_offset(expr, tag, offset);
338
339 if (expr->type == EXPR_PREOP && expr->op == '*') {
340 expr = strip_expr(expr->unop);
341 return get_implied_mtag_offset(expr, tag, offset);
342 } else if (expr->type == EXPR_DEREF) {
343 int tmp, tmp_offset = 0;
344
345 while (expr->type == EXPR_DEREF) {
346 tmp = get_member_offset_from_deref(expr);
347 if (tmp < 0)
348 return 0;
349 tmp_offset += tmp;
350 expr = strip_expr(expr->deref);
351 }
352 *offset = tmp_offset;
353 if (expr->type == EXPR_PREOP && expr->op == '*') {
354 expr = strip_expr(expr->unop);
355
356 if (get_implied_mtag_offset(expr, tag, &tmp_offset)) {
357 // FIXME: look it up recursively?
358 if (tmp_offset)
359 return 0;
360 return 1;
361 }
362 return 0;
363 } else if (expr->type == EXPR_SYMBOL) {
364 return get_symbol_mtag(expr->symbol, tag);
365 }
366 return 0;
367 } else if (expr->type == EXPR_SYMBOL) {
368 return get_symbol_mtag(expr->symbol, tag);
369 }
370 return 0;
|