mirror of
https://github.com/justinian/jsix.git
synced 2025-12-10 08:24:32 -08:00
This commit contains a couple large, interdependent changes: - In preparation for capability checking, the _syscall_verify_* functions now load most handles passed in, and verify that they exist and are of the correct type. Lists and out-handles are not converted to objects. - Also in preparation for capability checking, the internal representation of handles has changed. j6_handle_t is now 32 bits, and a new j6_cap_t (also 32 bits) is added. Handles of a process are now a util::map<j6_handle_t, handle> where handle is a new struct containing the id, capabilities, and object pointer. - The kernel object definition DSL gained a few changes to support auto generating the handle -> object conversion in the _syscall_verify_* functions, mostly knowing the object type, and an optional "cname" attribute on objects where their names differ from C++ code. (Specifically vma/vm_area) - Kernel object code and other code under kernel/objects is now in a new obj:: namespace, because fuck you <cstdlib> for putting "system" in the global namespace. Why even have that header then? - Kernel object types constructed with the construct_handle helper now have a creation_caps static member to declare what capabilities a newly created object's handle should have.
149 lines
3.5 KiB
Python
149 lines
3.5 KiB
Python
from .parser import Transformer, v_args
|
|
|
|
def get_opts(args):
|
|
from .types import CName, Description, Options, Type, UID
|
|
|
|
kinds = {
|
|
Description: "desc",
|
|
Options: "opts",
|
|
CName: "cname",
|
|
UID: "uid",
|
|
Type: "typename",
|
|
}
|
|
|
|
result = dict()
|
|
outargs = []
|
|
for a in args:
|
|
for kind, name in kinds.items():
|
|
if isinstance(a, kind):
|
|
result[name] = a
|
|
break
|
|
else:
|
|
outargs.append(a)
|
|
|
|
return result, outargs
|
|
|
|
class DefTransformer(Transformer):
|
|
def __init__(self, filename):
|
|
self.filename = filename
|
|
|
|
def start(self, args):
|
|
from .types import Import, Interface, Object
|
|
|
|
imports = set()
|
|
objects = dict()
|
|
interfaces = dict()
|
|
|
|
for o in args:
|
|
if isinstance(o, Object):
|
|
objects[o.name] = o
|
|
|
|
elif isinstance(o, Interface):
|
|
interfaces[o.name] = o
|
|
|
|
elif isinstance(o, Import):
|
|
imports.add(o)
|
|
|
|
return imports, objects, interfaces
|
|
|
|
@v_args(inline=True)
|
|
def import_statement(self, path):
|
|
from .types import Import
|
|
return Import(path)
|
|
|
|
def object(self, args):
|
|
from .types import Object
|
|
specials, args = get_opts(args)
|
|
name, args = args[0], args[1:]
|
|
return Object(name, children=args, **specials)
|
|
|
|
def interface(self, args):
|
|
from .types import Interface
|
|
specials, args = get_opts(args)
|
|
name, args = args[0], args[1:]
|
|
return Interface(name, children=args, **specials)
|
|
|
|
def method(self, args):
|
|
from .types import Method
|
|
specials, args = get_opts(args)
|
|
name, args = args[0], args[1:]
|
|
return Method(name, children=args, **specials)
|
|
|
|
def function(self, args):
|
|
from .types import Function
|
|
specials, args = get_opts(args)
|
|
name, args = args[0], args[1:]
|
|
return Function(name, children=args, **specials)
|
|
|
|
def param(self, args):
|
|
from .types import Param
|
|
specials, args = get_opts(args)
|
|
name = args[0]
|
|
return Param(name, **specials)
|
|
|
|
@v_args(inline=True)
|
|
def expose(self, s):
|
|
from .types import Expose
|
|
return Expose(s)
|
|
|
|
@v_args(inline=True)
|
|
def uid(self, s):
|
|
return s
|
|
|
|
@v_args(inline=True)
|
|
def cname(self, s):
|
|
from .types import CName
|
|
return CName(s)
|
|
|
|
@v_args(inline=True)
|
|
def name(self, s):
|
|
return s
|
|
|
|
@v_args(inline=True)
|
|
def type(self, s):
|
|
return s
|
|
|
|
@v_args(inline=True)
|
|
def super(self, s):
|
|
from .types import ObjectRef
|
|
return ObjectRef(s, self.filename)
|
|
|
|
def options(self, args):
|
|
from .types import Options
|
|
return Options([str(s) for s in args])
|
|
|
|
def description(self, s):
|
|
from .types import Description
|
|
return Description("\n".join(s))
|
|
|
|
@v_args(inline=True)
|
|
def object_name(self, n):
|
|
from .types import ObjectRef
|
|
return ObjectRef(n, self.filename)
|
|
|
|
def PRIMITIVE(self, s):
|
|
from .types import get_primitive
|
|
return get_primitive(s)
|
|
|
|
def UID(self, s):
|
|
from .types import UID
|
|
return UID(int(s, base=16))
|
|
|
|
def INT_TYPE(self, s):
|
|
return s
|
|
|
|
def NUMBER(self, s):
|
|
if s.startswith("0x"):
|
|
return int(s,16)
|
|
return int(s)
|
|
|
|
def COMMENT(self, s):
|
|
return s[2:].strip()
|
|
|
|
def IDENTIFIER(self, s):
|
|
return str(s)
|
|
|
|
def PATH(self, s):
|
|
return str(s[1:-1])
|
|
|