forked from IronLanguages/ironpython3
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPythonFileManager.cs
More file actions
93 lines (73 loc) · 2.97 KB
/
PythonFileManager.cs
File metadata and controls
93 lines (73 loc) · 2.97 KB
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the Apache 2.0 License.
// See the LICENSE file in the project root for more information.
using System.IO;
using Microsoft.Scripting.Utils;
using IronPython.Runtime.Exceptions;
namespace IronPython.Runtime {
internal class PythonFileManager {
private HybridMapping<object> mapping = new HybridMapping<object>(3);
public int AddToStrongMapping(Modules.PythonIOModule.FileIO file, int pos = -1) {
return mapping.StrongAdd(file, pos);
}
public int AddToStrongMapping(Stream stream, int pos = -1) {
return mapping.StrongAdd(stream, pos);
}
public void Remove(object o) {
mapping.RemoveOnObject(o);
}
public void RemoveObjectOnId(int id) {
mapping.RemoveOnId(id);
}
public Modules.PythonIOModule.FileIO GetFileFromId(PythonContext context, int id) {
if (TryGetFileFromId(context, id, out Modules.PythonIOModule.FileIO pf)) {
return pf;
}
throw PythonExceptions.CreateThrowable(PythonExceptions.OSError, 9, "Bad file descriptor");
}
public bool TryGetFileFromId(PythonContext context, int id, out Modules.PythonIOModule.FileIO pf) {
pf = mapping.GetObjectFromId(id) as Modules.PythonIOModule.FileIO;
return pf != null;
}
public bool TryGetObjectFromId(PythonContext context, int id, out object o) {
o = mapping.GetObjectFromId(id);
return o != null;
}
public object GetObjectFromId(int id) {
object o = mapping.GetObjectFromId(id);
if (o == null) {
throw PythonExceptions.CreateThrowable(PythonExceptions.OSError, 9, "Bad file descriptor");
}
return o;
}
public int GetIdFromFile(Modules.PythonIOModule.FileIO pf) {
return mapping.GetIdFromObject(pf);
}
public void CloseIfLast(CodeContext context, int fd, Modules.PythonIOModule.FileIO pf) {
mapping.RemoveOnId(fd);
if (-1 == mapping.GetIdFromObject(pf)) {
pf.close(context);
}
}
public void CloseIfLast(int fd, Stream stream) {
mapping.RemoveOnId(fd);
if (-1 == mapping.GetIdFromObject(stream)) {
stream.Close();
}
}
public int GetOrAssignIdForFile(Modules.PythonIOModule.FileIO pf) {
int res = mapping.GetIdFromObject(pf);
if (res == -1) {
// lazily created weak mapping
res = mapping.WeakAdd(pf);
}
return res;
}
public int GetIdFromObject(object o) {
return mapping.GetIdFromObject(o);
}
public bool ValidateFdRange(int fd) {
return fd >= 0 && fd < HybridMapping<object>.SIZE;
}
}
}