| 302 | } |
| 303 | |
| 304 | void __nullcCloseUpvalue(__nullcUpvalue *&head, void *ptr) |
| 305 | { |
| 306 | __nullcUpvalue *curr = head; |
| 307 | |
| 308 | GC::unmanageableBase = (char*)&curr; |
| 309 | // close upvalue if it's target is equal to local variable, or it's address is out of stack |
| 310 | while(curr && ((char*)curr->ptr == ptr || (char*)curr->ptr < GC::unmanageableBase || (char*)curr->ptr > GC::unmanageableTop)) |
| 311 | { |
| 312 | __nullcUpvalue *next = curr->next; |
| 313 | unsigned int size = curr->size; |
| 314 | head = curr->next; |
| 315 | memcpy(&curr->next, curr->ptr, size); |
| 316 | curr->ptr = (unsigned int*)&curr->next; |
| 317 | curr = next; |
| 318 | } |
| 319 | } |
| 320 | NULLCFuncPtr<> __nullcMakeFunction(unsigned int id, void* context) |
| 321 | { |
| 322 | NULLCFuncPtr<> ret; |
no outgoing calls
no test coverage detected