• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

tarantool / luajit / 11139910794

02 Oct 2024 07:45AM UTC coverage: 92.891% (+0.006%) from 92.885%
11139910794

push

github

Buristan
Fix bit op coercion in DUALNUM builds.

Thanks to Sergey Kaplun.

(cherry picked from commit f5fd22203)

The `lj_carith_check64()` function coerces the given number value to the
32-bit wide value. In this case, the 64-bit-wide operands will lose
upper bits.

This patch removes the excess coercion for the DUALNUM mode and drops
the corresponding skipcond introduced for the test in the previous
commit.

Sergey Kaplun:
* added the description and the test for the problem

Part of tarantool/tarantool#10199

5684 of 6026 branches covered (94.32%)

Branch coverage included in aggregate %.

1 of 1 new or added line in 1 file covered. (100.0%)

2 existing lines in 1 file now uncovered.

21679 of 23431 relevant lines covered (92.52%)

2951479.61 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

86.84
/src/lj_vmevent.c
1
/*
2
** VM event handling.
3
** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
4
*/
5

6
#include <stdio.h>
7

8
#define lj_vmevent_c
9
#define LUA_CORE
10

11
#include "lj_obj.h"
12
#include "lj_str.h"
13
#include "lj_tab.h"
14
#include "lj_state.h"
15
#include "lj_dispatch.h"
16
#include "lj_vm.h"
17
#include "lj_vmevent.h"
18

19
ptrdiff_t lj_vmevent_prepare(lua_State *L, VMEvent ev)
20,276✔
20
{
21
  global_State *g = G(L);
20,276✔
22
  GCstr *s = lj_str_newlit(L, LJ_VMEVENTS_REGKEY);
20,276✔
23
  cTValue *tv = lj_tab_getstr(tabV(registry(L)), s);
20,276✔
24
  if (tvistab(tv)) {
20,276✔
25
    int hash = VMEVENT_HASH(ev);
20,276✔
26
    tv = lj_tab_getint(tabV(tv), hash);
20,276✔
27
    if (tv && tvisfunc(tv)) {
20,276✔
28
      lj_state_checkstack(L, LUA_MINSTACK);
20,229✔
29
      setfuncV(L, L->top++, funcV(tv));
20,229✔
30
      if (LJ_FR2) setnilV(L->top++);
20,229✔
31
      return savestack(L, L->top);
20,229✔
32
    }
33
  }
34
  g->vmevmask &= ~VMEVENT_MASK(ev);  /* No handler: cache this fact. */
47✔
35
  return 0;
47✔
36
}
37

38
void lj_vmevent_call(lua_State *L, ptrdiff_t argbase)
20,229✔
39
{
40
  global_State *g = G(L);
20,229✔
41
  uint8_t oldmask = g->vmevmask;
20,229✔
42
  uint8_t oldh = hook_save(g);
20,229✔
43
  int status;
20,229✔
44
  g->vmevmask = 0;  /* Disable all events. */
20,229✔
45
  hook_vmevent(g);
20,229✔
46
  status = lj_vm_pcall(L, restorestack(L, argbase), 0+1, 0);
20,229✔
47
  if (LJ_UNLIKELY(status)) {
20,229✔
48
    /* Really shouldn't use stderr here, but where else to complain? */
49
    L->top--;
×
50
    fputs("VM handler failed: ", stderr);
×
51
    fputs(tvisstr(L->top) ? strVdata(L->top) : "?", stderr);
×
52
    fputc('\n', stderr);
×
53
  }
54
  hook_restore(g, oldh);
20,229✔
55
  if (g->vmevmask != VMEVENT_NOCACHE)
20,229✔
56
    g->vmevmask = oldmask;  /* Restore event mask, but not if not modified. */
20,229✔
57
}
20,229✔
58

STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc