-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathstate.php
64 lines (59 loc) · 1.76 KB
/
state.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
<?php
require_once __DIR__."/emulator.php";
class EmulatorState extends Emulator
{
function __construct()
{
}
function extract_state($emul)
{
$res=[];
$res['variables'] = $emul->variables;
$currents=['node','file','line','function','statement_index'];
foreach ($currents as $current)
$res["current_{$current}"] = $emul->{"current_{$current}"};
$res['included_files'] = $emul->included_files;
$res['output'] = $emul->output;
$res['super_globals'] = $emul->super_globals;
$res['functions'] = $emul->functions;
$res['constants'] = $emul->constants;
$res['eval_depth'] = $emul->eval_depth;
$res['variable_stack'] = $emul->variable_stack;
$res['terminated'] = $emul->terminated;
$res['mock_functions'] = $emul->mock_functions;
$res['trace'] = $emul->trace;
$res['break'] = $emul->break;
$res['continue'] = $emul->continue;
$res['loop_depth'] = $emul->loop_depth;
$res['return'] = $emul->return;
$res['return_value'] = $emul->return_value;
$res['shutdown_functions'] = $emul->shutdown_functions;
$res['silenced'] = $emul->silenced;
$res['entry_file'] = $emul->entry_file;
return $res;
}
function save($emul)
{
$newfile=$this->filename($emul);
file_put_contents($newfile, gzcompress(serialize($this->extract_state($emul)),9) );
return $newfile;
}
function filename($emul)
{
$entry_file=$emul->entry_file;
$files=glob("{$entry_file}.state*.emu");
sort($files);
$last=end($files);
if (!$last)
return "{$entry_file}.state00000.emu";
$index=substr(basename($last),-9,5)*1;
return sprintf("{$entry_file}.state%05d.emu",$index+1);
}
function restore($file,$emul)
{
$state=unserialize(gzuncompress(file_get_contents($file)));
foreach ($state as $key=>$value)
$emul->$key=$value;
return $state;
}
}