diff --git a/artiq/coredevice/comm_kernel.py b/artiq/coredevice/comm_kernel.py index 8bb8305d8..77f1ed74d 100644 --- a/artiq/coredevice/comm_kernel.py +++ b/artiq/coredevice/comm_kernel.py @@ -6,6 +6,7 @@ import socket import re import linecache import os +import json from enum import Enum from fractions import Fraction from collections import namedtuple @@ -657,7 +658,17 @@ class CommKernel: return_tags = self._read_bytes() if service_id == 0: - def service(obj, attr, value): return setattr(obj, attr, value) + def service(header, *values): + counter = 0 + for obj in json.loads(header): + old_val = embedding_map.globals_map[obj["id"]] + if "fields" in obj: + for name in obj["fields"]: + setattr(old_val, name, values[counter]) + counter += 1 + else: + old_val[:] = values[counter] + counter += 1 else: service = embedding_map.retrieve_function(service_id) logger.debug("rpc service: [%d]%r%s %r %r -> %s", service_id, service, diff --git a/artiq/language/embedding_map.py b/artiq/language/embedding_map.py index e98aa0252..6c323e7a4 100644 --- a/artiq/language/embedding_map.py +++ b/artiq/language/embedding_map.py @@ -9,6 +9,7 @@ class EmbeddingMap: self.string_map = {} self.string_reverse_map = {} self.function_map = {} + self.globals_map = {} # preallocate exception names # must be kept in sync with EXCEPTION_ID_LOOKUP in artiq/firmware/ksupport/eh_artiq.rs,