From 73a7550a72f71e8b791f31ef761571aaf8cde7fc Mon Sep 17 00:00:00 2001
From: Marcus Lagergren <1062473+lagergren@users.noreply.github.com>
Date: Tue, 1 Sep 2026 13:47:34 +0200
Subject: [PATCH 1/8] Add the container-owned native template table
Native templates are built per container: NativeContainer constructs a
complete set for every instance, and a single JVM can build several. Each
template carries an owner, so a lookup has to answer with the template that
belongs to the container doing the asking.
NativeTemplates is the one place that answers that question. Templates that
are addressable by name in the container's own registry - the name follows
from the class, numbers.xFloat64 backs numbers.Float64 - are resolved lazily
on first use. Templates that implement a composite type declared by another
template, and so have no name of their own, are published by their declaring
template from registerNativeTemplates(), which runs after construction.
registerNativeTemplate() is split in two: the existing method now also claims
the template's class, while registerAuxiliaryTemplate() only adds a type
mapping. xRTComponentTemplate uses the latter, since it registers a second
instance of its own class for RTMultiMethodTemplate and must not displace the
template registered for its own structure.
No behaviour change yet: the INSTANCE statics are still in place and still
what the runtime reads.
---
.../java/org/xvm/runtime/ClassTemplate.java | 31 +++
.../main/java/org/xvm/runtime/Container.java | 7 +
.../java/org/xvm/runtime/NativeContainer.java | 5 +
.../java/org/xvm/runtime/NativeTemplates.java | 177 ++++++++++++++++++
.../_native/reflect/xRTComponentTemplate.java | 2 +-
5 files changed, 221 insertions(+), 1 deletion(-)
create mode 100644 javatools/src/main/java/org/xvm/runtime/NativeTemplates.java
diff --git a/javatools/src/main/java/org/xvm/runtime/ClassTemplate.java b/javatools/src/main/java/org/xvm/runtime/ClassTemplate.java
index 650582016e..067330644b 100644
--- a/javatools/src/main/java/org/xvm/runtime/ClassTemplate.java
+++ b/javatools/src/main/java/org/xvm/runtime/ClassTemplate.java
@@ -127,9 +127,40 @@ public void registerNativeTemplates() {
* @param template the new template
*/
protected void registerNativeTemplate(ClassTemplate template) {
+ registerAuxiliaryTemplate(template);
+
+ // this template implements a composite type declared by "this" one, so it has no name of
+ // its own to be found under; publish it into the container's native template table
+ nativeTemplates().register(template);
+ }
+
+ /**
+ * Register a native template that serves an additional structure using a template class that
+ * is already spoken for. Unlike {@link #registerNativeTemplate}, this does not make the
+ * template its class's native instance - {@link NativeTemplates#get} must keep answering with
+ * the template registered for the class's own structure.
+ *
+ * @param template the new template
+ */
+ protected void registerAuxiliaryTemplate(ClassTemplate template) {
((NativeContainer) f_container).registerNativeTemplate(template.getCanonicalType(), template);
}
+ /**
+ * @return this template's container's table of native templates
+ */
+ protected NativeTemplates nativeTemplates() {
+ return NativeTemplates.of(f_container);
+ }
+
+ /**
+ * @return true iff this is the container's native template for its class, rather than one of
+ * the per-structure templates that the same class also backs
+ */
+ protected boolean isNativeInstance() {
+ return nativeTemplates().isNativeInstance(this);
+ }
+
/**
* Initialize native properties, methods and functions.
*/
diff --git a/javatools/src/main/java/org/xvm/runtime/Container.java b/javatools/src/main/java/org/xvm/runtime/Container.java
index 0ff905d34b..ca7bf9201b 100644
--- a/javatools/src/main/java/org/xvm/runtime/Container.java
+++ b/javatools/src/main/java/org/xvm/runtime/Container.java
@@ -399,6 +399,13 @@ public Container getOriginContainer(SingletonConstant constSingle) {
: this;
}
+ /**
+ * @return this container's table of native templates
+ */
+ public NativeTemplates nativeTemplates() {
+ return getNativeContainer().f_templates;
+ }
+
/**
* @return a ClassTemplate for a type associated with the specified name (core classes only)
*/
diff --git a/javatools/src/main/java/org/xvm/runtime/NativeContainer.java b/javatools/src/main/java/org/xvm/runtime/NativeContainer.java
index 0a1d09f09c..6b203254d7 100644
--- a/javatools/src/main/java/org/xvm/runtime/NativeContainer.java
+++ b/javatools/src/main/java/org/xvm/runtime/NativeContainer.java
@@ -884,6 +884,11 @@ public String toString() {
private ObjectHandle m_hSecureNetwork;
private ObjectHandle m_hInsecureNetwork;
+ /**
+ * This container's native template table; see {@link NativeTemplates}.
+ */
+ final NativeTemplates f_templates = new NativeTemplates(this);
+
private final ModuleRepository f_repository;
private ModuleStructure m_moduleSystem;
private ModuleStructure m_moduleTurtle;
diff --git a/javatools/src/main/java/org/xvm/runtime/NativeTemplates.java b/javatools/src/main/java/org/xvm/runtime/NativeTemplates.java
new file mode 100644
index 0000000000..6ed9ada8cb
--- /dev/null
+++ b/javatools/src/main/java/org/xvm/runtime/NativeTemplates.java
@@ -0,0 +1,177 @@
+package org.xvm.runtime;
+
+
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+import static java.util.Objects.requireNonNull;
+
+import org.xvm.runtime.template.Proxy;
+
+
+/**
+ * The container-owned lookup table for native templates.
+ *
+ *
Native templates are built per container - {@link NativeContainer} constructs a complete set
+ * for every instance, and a single JVM can build several. Every template therefore carries an
+ * owner ({@link ClassTemplate#f_container}), and a lookup has to answer with the template that
+ * belongs to the container doing the asking.
+ *
+ *
This class is the one place that answers that question. It replaces the {@code INSTANCE}
+ * static that each native template used to publish from its own constructor: a process-global
+ * mutable field, written by a {@code this}-escape, which the last container to be constructed
+ * silently took over from every container built before it.
+ *
+ *
How a template is found
+ *
+ *
Most native templates are addressable by name in the container's own registry, and the name
+ * is derived from the template class - {@code org.xvm.runtime.template.numbers.xFloat64} is the
+ * template for {@code numbers.Float64}. Those are resolved lazily, on first use, through
+ * {@link Container#getTemplate(String, Class)}; nothing is published while a template is still
+ * being constructed.
+ *
+ *
A minority of templates have no name of their own, because they implement a composite type
+ * declared by some other template - the bit/byte/nibble arrays, the array delegates and the array
+ * views, and {@code Identity}. Those are handed to {@link #register} by the template that declares
+ * them, from {@link ClassTemplate#registerNativeTemplates()}, which runs after construction has
+ * finished.
+ *
+ *
{@link Proxy} has neither a name nor a declaring template: it borrows {@code Object}'s
+ * structure and exists only to back proxied service handles. It is created on demand, once per
+ * container.
+ */
+public final class NativeTemplates {
+ /**
+ * The owning container. Always a {@link NativeContainer}; nested containers share their
+ * native container's templates, exactly as {@link Container#getTemplate(String)} does.
+ */
+ private final Container f_container;
+
+ /**
+ * The resolved templates, keyed by template class.
+ */
+ private final ConcurrentMap, ClassTemplate> f_mapByClass = new ConcurrentHashMap<>();
+
+ /**
+ * The package prefix shared by every native template class.
+ */
+ private static final String TEMPLATE_PACKAGE = "org.xvm.runtime.template.";
+
+ NativeTemplates(Container container) {
+ f_container = requireNonNull(container, "container");
+ }
+
+
+ // ----- resolving the table -------------------------------------------------------------------
+
+ /**
+ * @return the native template table for the specified container
+ */
+ public static NativeTemplates of(Container container) {
+ return requireNonNull(container, "container").getNativeContainer().nativeTemplates();
+ }
+
+ /**
+ * @return the native template table for the container the specified frame runs in
+ */
+ public static NativeTemplates of(Frame frame) {
+ return of(requireNonNull(frame, "frame").f_context.f_container);
+ }
+
+ /**
+ * @return the native template table for the specified template's container
+ */
+ public static NativeTemplates of(ClassTemplate template) {
+ return of(requireNonNull(template, "template").f_container);
+ }
+
+ /**
+ * @return the native template table for the container the specified composition belongs to
+ */
+ public static NativeTemplates of(TypeComposition composition) {
+ return of(requireNonNull(composition, "composition").getContainer());
+ }
+
+
+ // ----- looking a template up -----------------------------------------------------------------
+
+ /**
+ * Obtain this container's native template of the specified class.
+ *
+ *
This is the container-scoped replacement for the old {@code Xxx.INSTANCE} static: the
+ * answer is always owned by this table's container, never by whichever container happened to
+ * be constructed most recently.
+ *
+ * @param clzTemplate the native template class
+ *
+ * @return the template of that class belonging to this container
+ */
+ public T get(Class clzTemplate) {
+ ClassTemplate template = f_mapByClass.get(requireNonNull(clzTemplate, "clzTemplate"));
+ if (template == null) {
+ // Resolve outside of the map's update path: a lookup can recurse during bootstrap, and
+ // computeIfAbsent() forbids recursive updates to the same map.
+ template = clzTemplate == Proxy.class
+ ? new Proxy(f_container)
+ : f_container.getTemplate(componentNameOf(clzTemplate), clzTemplate);
+
+ ClassTemplate templateExisting = f_mapByClass.putIfAbsent(clzTemplate, template);
+ if (templateExisting != null) {
+ template = templateExisting;
+ }
+ }
+ return clzTemplate.cast(template);
+ }
+
+ /**
+ * @return true iff the specified template is this container's native template for its class,
+ * as opposed to one of the per-structure templates that the same Java class also backs
+ * (a {@code xEnum} exists for every enumeration, an {@code xObject} for every class)
+ */
+ public boolean isNativeInstance(ClassTemplate template) {
+ return template != null && template == get(template.getClass());
+ }
+
+ /**
+ * Add a template that cannot be found by name because it implements a composite type declared
+ * by another template.
+ *
+ *
Called from {@link ClassTemplate#registerNativeTemplates()}, after the template has been
+ * fully constructed - the map write is what publishes it.
+ *
+ * @param template the fully constructed template to publish
+ */
+ void register(ClassTemplate template) {
+ requireNonNull(template, "template");
+
+ ClassTemplate templatePrev = f_mapByClass.putIfAbsent(template.getClass(), template);
+ assert templatePrev == null || templatePrev == template
+ : "duplicate native template for " + template.getClass().getName();
+ }
+
+
+ // ----- helpers -------------------------------------------------------------------------------
+
+ /**
+ * Derive the component name a native template is registered under from its class name, using
+ * the same rule {@link NativeContainer} uses when it scans for template classes:
+ * {@code org.xvm.runtime.template.numbers.xFloat64} backs {@code numbers.Float64}.
+ *
+ * @param clzTemplate the native template class
+ *
+ * @return the component name
+ */
+ static String componentNameOf(Class extends ClassTemplate> clzTemplate) {
+ String sClass = clzTemplate.getName();
+
+ assert sClass.startsWith(TEMPLATE_PACKAGE) : sClass + " is not a native template";
+
+ String sPath = sClass.substring(TEMPLATE_PACKAGE.length());
+ int ofDot = sPath.lastIndexOf('.');
+ String sSimple = sPath.substring(ofDot + 1);
+
+ assert sSimple.charAt(0) == 'x' : sClass + " has no derivable component name";
+
+ return sPath.substring(0, ofDot + 1) + sSimple.substring(1);
+ }
+}
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/reflect/xRTComponentTemplate.java b/javatools/src/main/java/org/xvm/runtime/template/_native/reflect/xRTComponentTemplate.java
index 5ac541c796..6d568b726a 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/reflect/xRTComponentTemplate.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/reflect/xRTComponentTemplate.java
@@ -51,7 +51,7 @@ public xRTComponentTemplate(Container container, ClassStructure structure, boole
public void registerNativeTemplates() {
if (this == INSTANCE) {
ClassStructure struct = f_container.getClassStructure("_native.reflect.RTMultiMethodTemplate");
- registerNativeTemplate(new xRTComponentTemplate(f_container, struct, false));
+ registerAuxiliaryTemplate(new xRTComponentTemplate(f_container, struct, false));
}
}
From f12dd5d6cda1b972575d47cce41a5e72000e2a3f Mon Sep 17 00:00:00 2001
From: Marcus Lagergren <1062473+lagergren@users.noreply.github.com>
Date: Tue, 1 Sep 2026 15:06:50 +0200
Subject: [PATCH 2/8] Resolve native templates per container instead of through
a static
Every native template published itself into a process-global mutable static
from inside its own constructor - 139 `INSTANCE = this` sites, none of the
fields volatile or final. Two things were wrong with that. The write is a
this-escape: a partially constructed template becomes reachable JVM-wide
before its constructor finishes. And the field is last-writer-wins across
containers: templates are built per container, a single JVM can build several
(the interpreter connector does), so the container built last silently took
the statics over from every container built before it.
That is broken in series, with no concurrency at all. Build container A, then
container B, and code acting for A reads B's template - and through it B's
container, pool and type system. ProxyComposition.getTemplate() returned
Proxy.INSTANCE, so a composition belonging to A handed out a template owned by
B; xRTFunction.makeAsyncNativeHandle pulled the container for an async call
straight out of the static.
All 139 assignments and all 143 declarations are gone. Lookups now go through
the container's NativeTemplates table, reached from whatever the call site
already has - a container, a frame, a template, or a composition. Where a
static factory had no owner to work from, it takes one: xInt64/xChar/xUInt8/
xNibble/xString.makeHandle, xRTFunction.makeAsyncNativeHandle and the
xRTSignature ensure* cluster all now take the container or frame that is
asking. FullyBoundHandle.NO_OP, which needed a container to construct but is
only ever compared by identity, becomes a lazily created singleton.
`this == INSTANCE` becomes isNativeInstance(X.class). The class has to be
named: the test that matters is whether this template is the native instance
of the class that *declares* the method, and xVar extends xRef, so keying on
getClass() would let a subclass pass a gate that was written for its base.
INCEPTION_CLASS in Identity/xRef/xVar/xTuple/xService was the same defect in
the same constructors - a NativeRebaseConstant over the container's own
ClassConstant, kept in a static. It is now a final instance field. For xRef
and xVar the getter asks the container for its own Ref/Var template rather
than reading `this`, because the templates that inherit it - xFuture, xLazy,
xAtomic, xInject - are not themselves rebased and never populate the field;
reading `this` there produced a null inception constant and broke handle
creation well outside the unit tests.
Behaviour is unchanged for a single container, including one oddity worth
naming: xRTDelegate registers a nibble delegate twice, and INSTANCE therefore
held the second instance while the type registry held the first. The table
keeps last-writer-wins so that stays true.
NativeTemplatePerContainerTest builds two containers in series and asserts
that a composition resolves the template of its own container. On master:
container A (built first) must resolve its own Proxy template, but got one
owned by a different container ==> expected: NativeContainer@57167ccb
but was: NativeContainer@37753b69
The same assertion passes for container B, which is the last-writer-wins
signature: whoever was built last is the only one the statics still serve.
---
.../org/xvm/api/InterpreterConnector.java | 4 +-
.../src/main/java/org/xvm/asm/OpVar.java | 3 +-
.../org/xvm/asm/constants/TypeConstant.java | 2 +-
.../src/main/java/org/xvm/asm/op/Assert.java | 2 +-
.../src/main/java/org/xvm/asm/op/MoveRef.java | 6 +-
.../src/main/java/org/xvm/asm/op/MoveVar.java | 6 +-
.../src/main/java/org/xvm/asm/op/Var_M.java | 5 +-
.../src/main/java/org/xvm/asm/op/Var_MN.java | 5 +-
.../org/xvm/runtime/ClassComposition.java | 2 +-
.../java/org/xvm/runtime/ClassTemplate.java | 21 +-
.../main/java/org/xvm/runtime/Container.java | 8 +-
.../src/main/java/org/xvm/runtime/Frame.java | 6 +-
.../java/org/xvm/runtime/MainContainer.java | 8 +-
.../java/org/xvm/runtime/NativeContainer.java | 42 ++--
.../java/org/xvm/runtime/NativeTemplates.java | 19 +-
.../java/org/xvm/runtime/ObjectHandle.java | 3 +-
.../org/xvm/runtime/ProxyComposition.java | 13 +-
.../java/org/xvm/runtime/ServiceContext.java | 2 +-
.../src/main/java/org/xvm/runtime/Utils.java | 28 ++-
.../org/xvm/runtime/template/Identity.java | 22 +-
.../xvm/runtime/template/IndexSupport.java | 10 +-
.../java/org/xvm/runtime/template/Proxy.java | 8 +-
.../collections/arrays/BitBasedDelegate.java | 2 +-
.../collections/arrays/ByteBasedBitView.java | 6 +-
.../collections/arrays/ByteBasedDelegate.java | 13 +-
.../collections/arrays/LongBasedBitView.java | 4 +-
.../collections/arrays/LongBasedDelegate.java | 21 +-
.../collections/arrays/LongDelegate.java | 2 -
.../collections/arrays/LongLongDelegate.java | 4 +-
.../collections/arrays/xRTBitDelegate.java | 6 -
.../arrays/xRTBooleanDelegate.java | 6 -
.../collections/arrays/xRTCharDelegate.java | 26 +-
.../collections/arrays/xRTDelegate.java | 58 +++--
.../arrays/xRTFloat64Delegate.java | 14 +-
.../collections/arrays/xRTInt128Delegate.java | 8 +-
.../collections/arrays/xRTInt16Delegate.java | 8 +-
.../collections/arrays/xRTInt32Delegate.java | 8 +-
.../collections/arrays/xRTInt64Delegate.java | 8 +-
.../collections/arrays/xRTInt8Delegate.java | 8 +-
.../collections/arrays/xRTNibbleDelegate.java | 8 +-
.../arrays/xRTSlicingDelegate.java | 6 -
.../collections/arrays/xRTStringDelegate.java | 10 +-
.../arrays/xRTUInt128Delegate.java | 8 +-
.../collections/arrays/xRTUInt16Delegate.java | 8 +-
.../collections/arrays/xRTUInt32Delegate.java | 8 +-
.../collections/arrays/xRTUInt64Delegate.java | 8 +-
.../collections/arrays/xRTUInt8Delegate.java | 12 +-
.../collections/arrays/xRTViewFromBit.java | 8 +-
.../arrays/xRTViewFromBitToBoolean.java | 8 +-
.../arrays/xRTViewFromBitToByte.java | 10 +-
.../arrays/xRTViewFromBitToNibble.java | 10 +-
.../collections/arrays/xRTViewFromByte.java | 8 +-
.../arrays/xRTViewFromByteToFloat64.java | 10 +-
.../arrays/xRTViewFromByteToInt16.java | 10 +-
.../arrays/xRTViewFromByteToInt64.java | 10 +-
.../arrays/xRTViewFromByteToInt8.java | 10 +-
.../collections/arrays/xRTViewToBit.java | 34 ++-
.../arrays/xRTViewToBitFromFloat64.java | 8 +-
.../arrays/xRTViewToBitFromInt128.java | 6 -
.../arrays/xRTViewToBitFromInt16.java | 6 -
.../arrays/xRTViewToBitFromInt32.java | 6 -
.../arrays/xRTViewToBitFromInt64.java | 6 -
.../arrays/xRTViewToBitFromInt8.java | 6 -
.../arrays/xRTViewToBitFromNibble.java | 6 -
.../arrays/xRTViewToBitFromUInt128.java | 6 -
.../arrays/xRTViewToBitFromUInt16.java | 6 -
.../arrays/xRTViewToBitFromUInt32.java | 6 -
.../arrays/xRTViewToBitFromUInt64.java | 6 -
.../arrays/xRTViewToBitFromUInt8.java | 6 -
.../collections/xBasicHashCollector.java | 8 +-
.../_native/crypto/xRTAlgorithms.java | 42 ++--
.../_native/crypto/xRTCertificateManager.java | 10 +-
.../template/_native/crypto/xRTDecryptor.java | 6 -
.../template/_native/crypto/xRTHasher.java | 6 -
.../_native/crypto/xRTKeyGenerator.java | 9 +-
.../template/_native/crypto/xRTKeyStore.java | 50 ++--
.../template/_native/crypto/xRTSigner.java | 6 -
.../template/_native/fs/xCPFileStore.java | 8 +-
.../template/_native/fs/xOSDirectory.java | 6 -
.../runtime/template/_native/fs/xOSFile.java | 8 +-
.../template/_native/fs/xOSFileNode.java | 18 +-
.../template/_native/fs/xOSFileStore.java | 6 +-
.../template/_native/fs/xOSStorage.java | 29 ++-
.../_native/fs/xRawOSFileChannel.java | 16 +-
.../template/_native/io/xRTBuffer.java | 6 -
.../template/_native/io/xTerminalConsole.java | 12 +-
.../_native/lang/src/xRTCompiler.java | 10 +-
.../_native/mgmt/xContainerControl.java | 6 -
.../_native/mgmt/xContainerLinker.java | 15 +-
.../_native/mgmt/xCoreRepository.java | 8 +-
.../template/_native/net/xRTNameService.java | 18 +-
.../template/_native/net/xRTNetwork.java | 14 +-
.../_native/net/xRTNetworkInterface.java | 9 +-
.../template/_native/net/xRTSocket.java | 24 +-
.../template/_native/numbers/xRTRandom.java | 39 +--
.../_native/reflect/xRTClassTemplate.java | 39 ++-
.../_native/reflect/xRTComponentTemplate.java | 28 +--
.../_native/reflect/xRTFileTemplate.java | 26 +-
.../template/_native/reflect/xRTFunction.java | 117 +++++----
.../template/_native/reflect/xRTMethod.java | 18 +-
.../_native/reflect/xRTMethodTemplate.java | 26 +-
.../_native/reflect/xRTModuleTemplate.java | 30 +--
.../_native/reflect/xRTPackageTemplate.java | 11 +-
.../template/_native/reflect/xRTProperty.java | 21 +-
.../reflect/xRTPropertyClassTemplate.java | 16 +-
.../_native/reflect/xRTPropertyTemplate.java | 25 +-
.../_native/reflect/xRTSignature.java | 96 ++++----
.../template/_native/reflect/xRTType.java | 66 ++---
.../_native/reflect/xRTTypeTemplate.java | 17 +-
.../_native/temporal/xLocalClock.java | 19 +-
.../_native/temporal/xNanosTimer.java | 17 +-
.../template/_native/web/xRTConnector.java | 16 +-
.../template/_native/web/xRTServer.java | 40 ++-
.../template/_native/xRTServiceControl.java | 12 +-
.../runtime/template/annotations/xAtomic.java | 32 +--
.../template/annotations/xAtomicInt128.java | 4 +-
.../annotations/xAtomicIntNumber.java | 9 +-
.../runtime/template/annotations/xFuture.java | 13 +-
.../runtime/template/annotations/xInject.java | 8 +-
.../template/collections/BitBasedArray.java | 2 -
.../runtime/template/collections/xArray.java | 43 ++--
.../template/collections/xBitArray.java | 16 +-
.../template/collections/xByteArray.java | 14 +-
.../template/collections/xNibbleArray.java | 14 +-
.../runtime/template/collections/xTuple.java | 21 +-
.../xvm/runtime/template/maps/xListMap.java | 6 -
.../template/numbers/BaseBinaryFP.java | 28 +--
.../runtime/template/numbers/BaseDecFP.java | 25 +-
.../runtime/template/numbers/BaseInt128.java | 12 +-
.../xvm/runtime/template/numbers/xBit.java | 2 +-
.../template/numbers/xCheckedInt16.java | 8 +-
.../template/numbers/xCheckedInt32.java | 8 +-
.../template/numbers/xCheckedInt64.java | 8 +-
.../template/numbers/xCheckedInt8.java | 8 +-
.../template/numbers/xCheckedUInt16.java | 8 +-
.../template/numbers/xCheckedUInt32.java | 8 +-
.../template/numbers/xCheckedUInt64.java | 8 +-
.../template/numbers/xCheckedUInt8.java | 8 +-
.../template/numbers/xConstrainedInteger.java | 16 +-
.../xvm/runtime/template/numbers/xDec128.java | 6 -
.../xvm/runtime/template/numbers/xDec32.java | 6 -
.../xvm/runtime/template/numbers/xDec64.java | 6 -
.../runtime/template/numbers/xFPLiteral.java | 17 +-
.../runtime/template/numbers/xFloat16.java | 6 -
.../runtime/template/numbers/xFloat32.java | 6 -
.../runtime/template/numbers/xFloat64.java | 6 -
.../xvm/runtime/template/numbers/xInt128.java | 8 +-
.../xvm/runtime/template/numbers/xInt16.java | 8 +-
.../xvm/runtime/template/numbers/xInt32.java | 8 +-
.../xvm/runtime/template/numbers/xInt64.java | 22 +-
.../xvm/runtime/template/numbers/xInt8.java | 8 +-
.../runtime/template/numbers/xIntLiteral.java | 11 +-
.../xvm/runtime/template/numbers/xIntN.java | 6 -
.../xvm/runtime/template/numbers/xNibble.java | 33 ++-
.../runtime/template/numbers/xUInt128.java | 6 -
.../xvm/runtime/template/numbers/xUInt16.java | 8 +-
.../xvm/runtime/template/numbers/xUInt32.java | 8 +-
.../xvm/runtime/template/numbers/xUInt64.java | 8 +-
.../xvm/runtime/template/numbers/xUInt8.java | 31 ++-
.../xvm/runtime/template/numbers/xUIntN.java | 6 -
.../numbers/xUnconstrainedInteger.java | 12 +-
.../xvm/runtime/template/reflect/xClass.java | 19 +-
.../template/reflect/xClassTemplate.java | 8 +-
.../runtime/template/reflect/xEnumValue.java | 6 -
.../template/reflect/xEnumeration.java | 10 +-
.../runtime/template/reflect/xInjector.java | 6 -
.../xvm/runtime/template/reflect/xModule.java | 46 ++--
.../runtime/template/reflect/xPackage.java | 12 +-
.../xvm/runtime/template/reflect/xRef.java | 25 +-
.../xvm/runtime/template/reflect/xVar.java | 19 +-
.../org/xvm/runtime/template/text/xChar.java | 39 +--
.../org/xvm/runtime/template/text/xRegEx.java | 16 +-
.../xvm/runtime/template/text/xString.java | 63 +++--
.../org/xvm/runtime/template/xBoolean.java | 2 +-
.../java/org/xvm/runtime/template/xConst.java | 20 +-
.../java/org/xvm/runtime/template/xEnum.java | 18 +-
.../org/xvm/runtime/template/xException.java | 22 +-
.../org/xvm/runtime/template/xObject.java | 7 +-
.../org/xvm/runtime/template/xOrdered.java | 6 +-
.../org/xvm/runtime/template/xService.java | 26 +-
.../NativeTemplatePerContainerTest.java | 229 ++++++++++++++++++
181 files changed, 1301 insertions(+), 1579 deletions(-)
create mode 100644 javatools/src/test/java/org/xvm/runtime/NativeTemplatePerContainerTest.java
diff --git a/javatools/src/main/java/org/xvm/api/InterpreterConnector.java b/javatools/src/main/java/org/xvm/api/InterpreterConnector.java
index f4cf687f69..04eed9ad06 100644
--- a/javatools/src/main/java/org/xvm/api/InterpreterConnector.java
+++ b/javatools/src/main/java/org/xvm/api/InterpreterConnector.java
@@ -95,7 +95,7 @@ public void invoke0(MethodStructure method, String... asArg) {
TypeConstant typeArg = method.getParam(0).getType();
assert typeStrings.isA(typeArg);
- ahArg = new ObjectHandle[]{xString.makeArrayHandle(asArg)};
+ ahArg = new ObjectHandle[]{xString.makeArrayHandle(m_containerMain, asArg)};
}
break;
@@ -103,7 +103,7 @@ public void invoke0(MethodStructure method, String... asArg) {
TypeConstant typeArg = method.getParam(0).getType();
assert typeStrings.isA(typeArg);
// the method requires an array that we can supply
- ahArg = new ObjectHandle[]{xString.makeArrayHandle(asArg)};
+ ahArg = new ObjectHandle[]{xString.makeArrayHandle(m_containerMain, asArg)};
break;
}
}
diff --git a/javatools/src/main/java/org/xvm/asm/OpVar.java b/javatools/src/main/java/org/xvm/asm/OpVar.java
index dd369a81a7..60f1b419ee 100644
--- a/javatools/src/main/java/org/xvm/asm/OpVar.java
+++ b/javatools/src/main/java/org/xvm/asm/OpVar.java
@@ -147,7 +147,8 @@ protected TypeComposition getArrayClass(Frame frame, TypeConstant typeList) {
if (clzArray == null || !typeList.equals(typePrev)) {
TypeConstant typeEl = typeList.resolveGenericType("Element");
- clzArray = xArray.INSTANCE.ensureParameterizedClass(context.f_container, typeEl);
+ clzArray = context.f_container.nativeTemplates().get(xArray.class).
+ ensureParameterizedClass(context.f_container, typeEl);
context.setOpInfo(this, Category.Composition, clzArray);
context.setOpInfo(this, Category.Type, typeList);
diff --git a/javatools/src/main/java/org/xvm/asm/constants/TypeConstant.java b/javatools/src/main/java/org/xvm/asm/constants/TypeConstant.java
index 803fb06eb2..373d06af85 100644
--- a/javatools/src/main/java/org/xvm/asm/constants/TypeConstant.java
+++ b/javatools/src/main/java/org/xvm/asm/constants/TypeConstant.java
@@ -7812,7 +7812,7 @@ public TypeHandle ensureTypeHandle(Container container) {
}
// don't cache a "foreign" handle
- return xRTType.makeForeignHandle(this);
+ return xRTType.makeForeignHandle(container, this);
}
/**
diff --git a/javatools/src/main/java/org/xvm/asm/op/Assert.java b/javatools/src/main/java/org/xvm/asm/op/Assert.java
index 5207c65389..cad34ddb69 100644
--- a/javatools/src/main/java/org/xvm/asm/op/Assert.java
+++ b/javatools/src/main/java/org/xvm/asm/op/Assert.java
@@ -126,7 +126,7 @@ protected int complete(Frame frame, int iPC, String sMsg) {
ClassConstant constClz = (ClassConstant) idConstruct.getNamespace();
ClassTemplate template = frame.ensureTemplate(constClz);
ClassComposition clzTarget = template.getCanonicalClass(frame.f_context.f_container);
- StringHandle hMsg = xString.makeHandle(sMsg);
+ StringHandle hMsg = xString.makeHandle(frame, sMsg);
ObjectHandle[] ahArg = new ObjectHandle[construct.getMaxVars()];
ahArg[0] = hMsg;
diff --git a/javatools/src/main/java/org/xvm/asm/op/MoveRef.java b/javatools/src/main/java/org/xvm/asm/op/MoveRef.java
index 61ed0d552e..2c30d1d53e 100644
--- a/javatools/src/main/java/org/xvm/asm/op/MoveRef.java
+++ b/javatools/src/main/java/org/xvm/asm/op/MoveRef.java
@@ -18,6 +18,7 @@
import org.xvm.javajit.registers.Ref;
+import org.xvm.runtime.Container;
import org.xvm.runtime.Frame;
import org.xvm.runtime.ObjectHandle;
import org.xvm.runtime.TypeComposition;
@@ -71,8 +72,9 @@ public int process(Frame frame, int iPC) {
typeReg = infoSrc.getType();
}
} else {
- TypeComposition clzRef = xRef.INSTANCE.ensureParameterizedClass(
- frame.f_context.f_container, infoSrc.getType());
+ Container container = frame.f_context.f_container;
+ TypeComposition clzRef = container.nativeTemplates().get(xRef.class).
+ ensureParameterizedClass(container, infoSrc.getType());
hRef = new RefHandle(clzRef, frame, m_nFromValue);
typeReg = hRef.getType();
}
diff --git a/javatools/src/main/java/org/xvm/asm/op/MoveVar.java b/javatools/src/main/java/org/xvm/asm/op/MoveVar.java
index 01d1e20981..9a2104fbae 100644
--- a/javatools/src/main/java/org/xvm/asm/op/MoveVar.java
+++ b/javatools/src/main/java/org/xvm/asm/op/MoveVar.java
@@ -18,6 +18,7 @@
import org.xvm.javajit.registers.Ref;
+import org.xvm.runtime.Container;
import org.xvm.runtime.Frame;
import org.xvm.runtime.ObjectHandle;
import org.xvm.runtime.ObjectHandle.ExceptionHandle;
@@ -103,8 +104,9 @@ protected int complete(Frame frame, ObjectHandle hReferent) {
? frame.poolContext().typeObject()
: frame.getVarInfo(nFrom).getType();
}
- TypeComposition clzRef = xVar.INSTANCE.
- ensureParameterizedClass(frame.f_context.f_container, typeReferent);
+ Container container = frame.f_context.f_container;
+ TypeComposition clzRef = container.nativeTemplates().get(xVar.class).
+ ensureParameterizedClass(container, typeReferent);
hRef = new RefHandle(clzRef, frame, nFrom);
if (fNextReg) {
frame.introduceResolvedVar(nTo, hRef.getType());
diff --git a/javatools/src/main/java/org/xvm/asm/op/Var_M.java b/javatools/src/main/java/org/xvm/asm/op/Var_M.java
index acbbbe867d..836f59b185 100644
--- a/javatools/src/main/java/org/xvm/asm/op/Var_M.java
+++ b/javatools/src/main/java/org/xvm/asm/op/Var_M.java
@@ -108,8 +108,9 @@ public int process(Frame frame, int iPC) {
frame.introduceResolvedVar(m_nVar, typeMap, null, Frame.VAR_STANDARD, null);
- return xListMap.INSTANCE.constructMap(frame, typeMap, ahKey, ahValue,
- anyDeferred(ahKey), anyDeferred(ahValue), m_nVar);
+ return frame.f_context.f_container.nativeTemplates().get(xListMap.class).
+ constructMap(frame, typeMap, ahKey, ahValue,
+ anyDeferred(ahKey), anyDeferred(ahValue), m_nVar);
} catch (ExceptionHandle.WrapperException e) {
return frame.raiseException(e);
}
diff --git a/javatools/src/main/java/org/xvm/asm/op/Var_MN.java b/javatools/src/main/java/org/xvm/asm/op/Var_MN.java
index b60ad53367..b7b7d4c829 100644
--- a/javatools/src/main/java/org/xvm/asm/op/Var_MN.java
+++ b/javatools/src/main/java/org/xvm/asm/op/Var_MN.java
@@ -117,8 +117,9 @@ public int process(Frame frame, int iPC) {
frame.introduceResolvedVar(m_nVar, typeMap,
frame.getString(m_nNameId), Frame.VAR_STANDARD, null);
- return xListMap.INSTANCE.constructMap(frame, typeMap, ahKey, ahValue,
- anyDeferred(ahKey), anyDeferred(ahValue), m_nVar);
+ return frame.f_context.f_container.nativeTemplates().get(xListMap.class).
+ constructMap(frame, typeMap, ahKey, ahValue,
+ anyDeferred(ahKey), anyDeferred(ahValue), m_nVar);
} catch (ExceptionHandle.WrapperException e) {
return frame.raiseException(e);
}
diff --git a/javatools/src/main/java/org/xvm/runtime/ClassComposition.java b/javatools/src/main/java/org/xvm/runtime/ClassComposition.java
index 6026f3ecc7..4b4d88b7be 100644
--- a/javatools/src/main/java/org/xvm/runtime/ClassComposition.java
+++ b/javatools/src/main/java/org/xvm/runtime/ClassComposition.java
@@ -429,7 +429,7 @@ public StringHandle[] getFieldNameArray() {
FieldInfo field = entry.getValue();
if (!(enid instanceof NestedIdentity) && field.isRegular()) {
- ashNames[i++] = xString.makeHandle(field.getName());
+ ashNames[i++] = xString.makeHandle(f_container, field.getName());
}
}
assert i == m_cRegularFields;
diff --git a/javatools/src/main/java/org/xvm/runtime/ClassTemplate.java b/javatools/src/main/java/org/xvm/runtime/ClassTemplate.java
index 067330644b..399ee2e71f 100644
--- a/javatools/src/main/java/org/xvm/runtime/ClassTemplate.java
+++ b/javatools/src/main/java/org/xvm/runtime/ClassTemplate.java
@@ -154,11 +154,18 @@ protected NativeTemplates nativeTemplates() {
}
/**
- * @return true iff this is the container's native template for its class, rather than one of
- * the per-structure templates that the same class also backs
+ * Note: the class has to be named explicitly, because it is the class that declares the
+ * calling method that matters, not this template's own class. A template that inherits such a
+ * method - {@code xVar} extends {@code xRef} - is the native instance of its own class while
+ * still not being the one the inherited method is asking about.
+ *
+ * @param clzTemplate the native template class being asked about
+ *
+ * @return true iff this is the container's native template for the specified class, rather
+ * than one of the per-structure templates that the same class also backs
*/
- protected boolean isNativeInstance() {
- return nativeTemplates().isNativeInstance(this);
+ protected boolean isNativeInstance(Class extends ClassTemplate> clzTemplate) {
+ return this == nativeTemplates().get(clzTemplate);
}
/**
@@ -211,7 +218,7 @@ public ClassTemplate getSuper() {
if ("Object".equals(f_sName)) {
return null;
}
- templateSuper = m_templateSuper = xObject.INSTANCE;
+ templateSuper = m_templateSuper = nativeTemplates().get(xObject.class);
} else {
templateSuper = m_templateSuper =
f_container.getTemplate(f_structSuper.getIdentityConstant());
@@ -2001,7 +2008,7 @@ public int overflow(Frame frame) {
* @return one of the {@link Op#R_NEXT}, {@link Op#R_CALL} or {@link Op#R_EXCEPTION} values
*/
protected int buildStringValue(Frame frame, ObjectHandle hTarget, int iReturn) {
- return frame.assignValue(iReturn, xString.makeHandle(hTarget.toString()));
+ return frame.assignValue(iReturn, xString.makeHandle(frame, hTarget.toString()));
}
@@ -2458,7 +2465,7 @@ private void prepareFinalizer(Frame frame, MethodStructure ctor, ObjectHandle[]
if (hfn == null) {
// in case super constructors have their own finalizers, we need a non-null anchor
// that may be replaced by Frame.chainFinalizers()
- hfn = FullyBoundHandle.NO_OP;
+ hfn = FullyBoundHandle.ensureNoOp(frame.f_context.f_container);
}
frame.m_hfnFinally = hfn;
diff --git a/javatools/src/main/java/org/xvm/runtime/Container.java b/javatools/src/main/java/org/xvm/runtime/Container.java
index ca7bf9201b..16ba6c14e9 100644
--- a/javatools/src/main/java/org/xvm/runtime/Container.java
+++ b/javatools/src/main/java/org/xvm/runtime/Container.java
@@ -99,10 +99,12 @@ public ServiceContext ensureServiceContext() {
ServiceContext ctx = m_contextMain;
if (ctx == null) {
try (var ignore = ConstantPool.withPool(getConstantPool())) {
+ xService templateService = nativeTemplates().get(xService.class);
+
m_contextMain = ctx = createServiceContext(getModule().getName());
- xService.INSTANCE.createServiceHandle(ctx,
- xService.INSTANCE.getCanonicalClass(),
- xService.INSTANCE.getCanonicalType());
+ templateService.createServiceHandle(ctx,
+ templateService.getCanonicalClass(),
+ templateService.getCanonicalType());
}
}
return ctx;
diff --git a/javatools/src/main/java/org/xvm/runtime/Frame.java b/javatools/src/main/java/org/xvm/runtime/Frame.java
index 6ee6a8d119..17eb784ff7 100644
--- a/javatools/src/main/java/org/xvm/runtime/Frame.java
+++ b/javatools/src/main/java/org/xvm/runtime/Frame.java
@@ -236,7 +236,7 @@ public Frame createNativeFrame(Op[] aop, ObjectHandle[] ahVar, int iReturn, int[
* @return a new frame
*/
public Frame createWaitFrame(CompletableFuture cfResult, int iReturn) {
- return createWaitFrame(xFuture.makeHandle(cfResult), iReturn);
+ return createWaitFrame(xFuture.makeHandle(f_context.f_container, cfResult), iReturn);
}
/**
@@ -280,7 +280,7 @@ public Frame createWaitFrame(CompletableFuture cfResult, int[] a
CompletableFuture cfReturn =
cfResult.thenApply(ahResult -> ahResult[iResult]);
- ahFuture[i] = xFuture.makeHandle(cfReturn);
+ ahFuture[i] = xFuture.makeHandle(f_context.f_container, cfReturn);
frameNext.f_aInfo[i] = new VarInfo(xFuture.TYPE, VAR_DYNAMIC_REF);
}
@@ -1047,7 +1047,7 @@ public int assignFutureResult(int iReturn, CompletableFuture cfRes
}
if (isFuture(iReturn)) {
- return assignValue(iReturn, xFuture.makeHandle(cfResult));
+ return assignValue(iReturn, xFuture.makeHandle(f_context.f_container, cfResult));
}
// the wait frame will deal with exceptions
diff --git a/javatools/src/main/java/org/xvm/runtime/MainContainer.java b/javatools/src/main/java/org/xvm/runtime/MainContainer.java
index 5126787a9b..6d83cd45ce 100644
--- a/javatools/src/main/java/org/xvm/runtime/MainContainer.java
+++ b/javatools/src/main/java/org/xvm/runtime/MainContainer.java
@@ -62,12 +62,12 @@ public ObjectHandle getInjectable(Frame frame, String sName, TypeConstant type,
if (!listValue.isEmpty()) {
if (typeRequired.equals(typeString)) {
// require String, return the last element
- return xString.makeHandle(listValue.getLast());
+ return xString.makeHandle(frame, listValue.getLast());
}
if (typeRequired.equals(typeStrings)) {
// require String[], return the whole List as an array
String[] asValue = listValue.toArray(String[]::new);
- return xString.makeArrayHandle(asValue);
+ return xString.makeArrayHandle(frame.f_context.f_container, asValue);
}
if (typeRequired.isEnum()) {
TypeComposition clz = typeRequired.ensureClass(frame);
@@ -108,7 +108,7 @@ private ObjectHandle toDestringable(Frame frame, TypeConstant type, String sValu
TypeComposition clz = type.ensureClass(frame);
ClassTemplate template = clz.getTemplate();
MethodStructure ctor = template.getStructure().findMethod("construct", 1, pool.typeString());
- ObjectHandle[] ahArgs = new ObjectHandle[]{xString.makeHandle(sValue)};
+ ObjectHandle[] ahArgs = new ObjectHandle[]{xString.makeHandle(frame, sValue)};
int iResult = template.construct(frame, ctor, clz, null, ahArgs, Op.A_STACK);
return frame.popResult(iResult);
}
@@ -203,7 +203,7 @@ public void invoke0(String sMethodName, ObjectHandle... ahArg) {
CallChain chain = clzModule.getMethodCallChain(sigMethod);
boolean fReturn = sigMethod.getReturnCount() > 0;
- FunctionHandle hInstantiateModuleAndRun = new NativeFunctionHandle((frame, ah, iRet) -> {
+ FunctionHandle hInstantiateModuleAndRun = new NativeFunctionHandle(this, (frame, ah, iRet) -> {
SingletonConstant idModule = frame.poolContext().ensureSingletonConstConstant(f_idModule);
ObjectHandle hModule = frame.getConstHandle(idModule);
int iReturn = fReturn ? Op.A_STACK : Op.A_IGNORE;
diff --git a/javatools/src/main/java/org/xvm/runtime/NativeContainer.java b/javatools/src/main/java/org/xvm/runtime/NativeContainer.java
index 6b203254d7..355f5d686e 100644
--- a/javatools/src/main/java/org/xvm/runtime/NativeContainer.java
+++ b/javatools/src/main/java/org/xvm/runtime/NativeContainer.java
@@ -167,8 +167,8 @@ private ConstantPool loadNativeTemplates() {
scanNativeDirectory(dirTemplates, "", mapTemplateClasses);
}
- // we need a number of INSTANCE static variables to be set up right away
- // (they are used by the ClassTemplate constructor)
+ // these have to be registered before anything else: the templates constructed below look
+ // them up through the container's native template table while they are being built
storeNativeTemplate(new xObject (this, getClassStructure("Object"), true));
storeNativeTemplate(new xEnum (this, getClassStructure("Enum"), true));
storeNativeTemplate(new xConst (this, getClassStructure("Const"), true));
@@ -202,8 +202,8 @@ private ConstantPool loadNativeTemplates() {
}
// add run-time templates
- f_mapTemplatesByType.put(pool.typeFunction(), xRTFunction.INSTANCE);
- f_mapTemplatesByType.put(pool.typeType() , xRTType.INSTANCE);
+ f_mapTemplatesByType.put(pool.typeFunction(), f_templates.get(xRTFunction.class));
+ f_mapTemplatesByType.put(pool.typeType() , f_templates.get(xRTType.class));
// clone the map since the loop below can add to it
Set setTemplates = new HashSet<>(f_mapTemplatesByType.values());
@@ -301,24 +301,24 @@ private void storeNativeTemplate(ClassTemplate template) {
private void initResources(ConstantPool pool) {
// +++ temporal.LocalClock
- xLocalClock templateClock = xLocalClock.INSTANCE;
+ xLocalClock templateClock = f_templates.get(xLocalClock.class);
TypeConstant typeClock = templateClock.getCanonicalType();
addResourceSupplier(new InjectionKey("clock" , typeClock), templateClock::ensureDefaultClock);
addResourceSupplier(new InjectionKey("localClock", typeClock), templateClock::ensureLocalClock);
addResourceSupplier(new InjectionKey("utcClock" , typeClock), templateClock::ensureUTCClock);
// +++ temporal.NanosTimer
- xNanosTimer templateTimer = xNanosTimer.INSTANCE;
+ xNanosTimer templateTimer = f_templates.get(xNanosTimer.class);
TypeConstant typeTimer = templateTimer.getCanonicalType();
addResourceSupplier(new InjectionKey("timer", typeTimer), templateTimer::ensureTimer);
// +++ io.Console
- xTerminalConsole templateConsole = xTerminalConsole.INSTANCE;
+ xTerminalConsole templateConsole = f_templates.get(xTerminalConsole.class);
TypeConstant typeConsole = templateConsole.getCanonicalType();
addResourceSupplier(new InjectionKey("console", typeConsole), templateConsole::ensureConsole);
// +++ numbers.Random
- xRTRandom templateRandom = xRTRandom.INSTANCE;
+ xRTRandom templateRandom = f_templates.get(xRTRandom.class);
TypeConstant typeRandom = templateRandom.getCanonicalType();
addResourceSupplier(new InjectionKey("rnd" , typeRandom), templateRandom::ensureDefaultRandom);
addResourceSupplier(new InjectionKey("random", typeRandom), templateRandom::ensureDefaultRandom);
@@ -333,55 +333,55 @@ private void initResources(ConstantPool pool) {
addResourceSupplier(new InjectionKey("tmpDir" , typeDirectory), this::ensureTmpDir);
// +++ net:Network
- xRTNetwork templateNetwork = xRTNetwork.INSTANCE;
+ xRTNetwork templateNetwork = f_templates.get(xRTNetwork.class);
TypeConstant typeNetwork = templateNetwork.getCanonicalType();
addResourceSupplier(new InjectionKey("network" , typeNetwork), this::ensureInsecureNetwork);
addResourceSupplier(new InjectionKey("insecureNetwork", typeNetwork), this::ensureInsecureNetwork);
addResourceSupplier(new InjectionKey("secureNetwork" , typeNetwork), this::ensureSecureNetwork);
// +++ crypto:KeyStore
- xRTKeyStore templateKeyStore = xRTKeyStore.INSTANCE;
+ xRTKeyStore templateKeyStore = f_templates.get(xRTKeyStore.class);
TypeConstant typeKeyStore = templateKeyStore.getCanonicalType();
addResourceSupplier(new InjectionKey("keystore", typeKeyStore), templateKeyStore::ensureKeyStore);
// +++ crypto:CertificateManager
- xRTCertificateManager templateCertManager = xRTCertificateManager.INSTANCE;
+ xRTCertificateManager templateCertManager = f_templates.get(xRTCertificateManager.class);
TypeConstant typeCertManager = templateCertManager.getCanonicalType();
addResourceSupplier(new InjectionKey("manager", typeCertManager), templateCertManager::ensureManager);
// +++ crypto:Algorithms
- xRTAlgorithms templateAlgorithms = xRTAlgorithms.INSTANCE;
+ xRTAlgorithms templateAlgorithms = f_templates.get(xRTAlgorithms.class);
TypeConstant typeAlgorithms = pool.ensureTerminalTypeConstant(
pool.ensureClassConstant(pool.ensureModuleConstant("crypto.xtclang.org"), "Algorithms"));
addResourceSupplier(new InjectionKey("algorithms", typeAlgorithms), templateAlgorithms::ensureAlgorithms);
// +++ web:Client.Connector
- xRTConnector templateConnector = xRTConnector.INSTANCE;
+ xRTConnector templateConnector = f_templates.get(xRTConnector.class);
TypeConstant typeConnector = templateConnector.getCanonicalType();
addResourceSupplier(new InjectionKey("connector", typeConnector), templateConnector::ensureConnector);
// +++ web:WebServer
- xRTServer templateServer = xRTServer.INSTANCE;
+ xRTServer templateServer = f_templates.get(xRTServer.class);
TypeConstant typeServer = templateServer.getCanonicalType();
addResourceSupplier(new InjectionKey("server", typeServer), templateServer::ensureServer);
// +++ mgmt.Linker
- xContainerLinker templateLinker = xContainerLinker.INSTANCE;
+ xContainerLinker templateLinker = f_templates.get(xContainerLinker.class);
TypeConstant typeLinker = templateLinker.getCanonicalType();
addResourceSupplier(new InjectionKey("linker", typeLinker), templateLinker::ensureLinker);
// +++ mgmt.ModuleRepository
- xCoreRepository templateRepo = xCoreRepository.INSTANCE;
+ xCoreRepository templateRepo = f_templates.get(xCoreRepository.class);
TypeConstant typeRepo = templateRepo.getCanonicalType();
addResourceSupplier(new InjectionKey("repository", typeRepo), templateRepo::ensureModuleRepository);
// +++ lang.src.Compiler
- xRTCompiler templateCompiler = xRTCompiler.INSTANCE;
+ xRTCompiler templateCompiler = f_templates.get(xRTCompiler.class);
TypeConstant typeCompiler = templateCompiler.getCanonicalType();
addResourceSupplier(new InjectionKey("compiler", typeCompiler), templateCompiler::ensureCompiler);
// +++ reflect.Injector
- xInjector templateInjector = xInjector.INSTANCE;
+ xInjector templateInjector = f_templates.get(xInjector.class);
TypeConstant typeInjector = templateInjector.getCanonicalType();
addResourceSupplier(new InjectionKey("injector", typeInjector), templateInjector::ensureInjector);
@@ -390,7 +390,7 @@ private void initResources(ConstantPool pool) {
addResourceSupplier(new InjectionKey("properties", typeProps), this::ensureProperties);
// +++ collections.HashCollector
- xBasicHashCollector templateHashCollector = xBasicHashCollector.INSTANCE;
+ xBasicHashCollector templateHashCollector = f_templates.get(xBasicHashCollector.class);
TypeConstant typeHashCollector = templateHashCollector.getCanonicalType();
addResourceSupplier(new InjectionKey("hash", typeHashCollector), templateHashCollector::ensureCollector);
}
@@ -522,8 +522,8 @@ private ObjectHandle ensureProperties(Frame frame, ObjectHandle hOpts) {
if (sKey.startsWith("xvm.")) {
String sVal = System.getProperty(sKey);
if (sVal != null) {
- listKeys.add(xString.makeHandle(sKey.substring(4)));
- listVals.add(xString.makeHandle(sVal));
+ listKeys.add(xString.makeHandle(frame, sKey.substring(4)));
+ listVals.add(xString.makeHandle(frame, sVal));
}
}
}
diff --git a/javatools/src/main/java/org/xvm/runtime/NativeTemplates.java b/javatools/src/main/java/org/xvm/runtime/NativeTemplates.java
index 6ed9ada8cb..3da3e198f9 100644
--- a/javatools/src/main/java/org/xvm/runtime/NativeTemplates.java
+++ b/javatools/src/main/java/org/xvm/runtime/NativeTemplates.java
@@ -123,15 +123,6 @@ public T get(Class clzTemplate) {
return clzTemplate.cast(template);
}
- /**
- * @return true iff the specified template is this container's native template for its class,
- * as opposed to one of the per-structure templates that the same Java class also backs
- * (a {@code xEnum} exists for every enumeration, an {@code xObject} for every class)
- */
- public boolean isNativeInstance(ClassTemplate template) {
- return template != null && template == get(template.getClass());
- }
-
/**
* Add a template that cannot be found by name because it implements a composite type declared
* by another template.
@@ -139,14 +130,14 @@ public boolean isNativeInstance(ClassTemplate template) {
*
Called from {@link ClassTemplate#registerNativeTemplates()}, after the template has been
* fully constructed - the map write is what publishes it.
*
+ *
The last registration for a class wins, which is what the {@code INSTANCE} assignment in
+ * the constructor did. It matters: {@code xRTDelegate} registers a nibble delegate twice, and
+ * the second one is the template the runtime used to hand out.
+ *
* @param template the fully constructed template to publish
*/
void register(ClassTemplate template) {
- requireNonNull(template, "template");
-
- ClassTemplate templatePrev = f_mapByClass.putIfAbsent(template.getClass(), template);
- assert templatePrev == null || templatePrev == template
- : "duplicate native template for " + template.getClass().getName();
+ f_mapByClass.put(requireNonNull(template, "template").getClass(), template);
}
diff --git a/javatools/src/main/java/org/xvm/runtime/ObjectHandle.java b/javatools/src/main/java/org/xvm/runtime/ObjectHandle.java
index f1b88858a6..dc04240c1a 100644
--- a/javatools/src/main/java/org/xvm/runtime/ObjectHandle.java
+++ b/javatools/src/main/java/org/xvm/runtime/ObjectHandle.java
@@ -731,7 +731,8 @@ public boolean equals(Object obj) {
@Override
public String toString() {
- return super.toString() + (m_clazz.getTemplate() == xChar.INSTANCE
+ return super.toString()
+ + (m_clazz.getTemplate() == NativeTemplates.of(m_clazz).get(xChar.class)
? Handy.quotedChar((char) m_lValue)
: String.valueOf(m_lValue));
}
diff --git a/javatools/src/main/java/org/xvm/runtime/ProxyComposition.java b/javatools/src/main/java/org/xvm/runtime/ProxyComposition.java
index b90360b4a8..52b2adaeaf 100644
--- a/javatools/src/main/java/org/xvm/runtime/ProxyComposition.java
+++ b/javatools/src/main/java/org/xvm/runtime/ProxyComposition.java
@@ -20,7 +20,8 @@ public class ProxyComposition
public ProxyComposition(TypeComposition clzOrigin, TypeConstant typeProxy) {
super(clzOrigin);
- f_typeProxy = typeProxy;
+ f_typeProxy = typeProxy;
+ f_templateProxy = NativeTemplates.of(clzOrigin.getContainer()).get(Proxy.class);
}
/**
@@ -32,12 +33,12 @@ public TypeComposition getOrigin() {
@Override
public OpSupport getSupport() {
- return Proxy.INSTANCE;
+ return getTemplate();
}
@Override
public ClassTemplate getTemplate() {
- return Proxy.INSTANCE;
+ return f_templateProxy;
}
@Override
@@ -117,4 +118,10 @@ public String toString() {
* The revealed (proxying) type.
*/
private final TypeConstant f_typeProxy;
+
+ /**
+ * The Proxy template of the container this composition belongs to; resolved once, since
+ * getSupport()/getTemplate() sit on the op-dispatch path.
+ */
+ private final ClassTemplate f_templateProxy;
}
diff --git a/javatools/src/main/java/org/xvm/runtime/ServiceContext.java b/javatools/src/main/java/org/xvm/runtime/ServiceContext.java
index 91b88d5c09..f4a71fab02 100644
--- a/javatools/src/main/java/org/xvm/runtime/ServiceContext.java
+++ b/javatools/src/main/java/org/xvm/runtime/ServiceContext.java
@@ -1515,7 +1515,7 @@ public String toString() {
protected void callUnhandledExceptionHandler(ExceptionHandle hException) {
FunctionHandle hFunction = m_hExceptionHandler;
if (hFunction == null) {
- hFunction = new NativeFunctionHandle((frame, ahArg, iReturn) -> {
+ hFunction = new NativeFunctionHandle(f_container, (frame, ahArg, iReturn) -> {
switch (Utils.callToString(frame, ahArg[0])) {
case Op.R_NEXT -> {
Utils.log(frame, "\nUnhandled exception: " +
diff --git a/javatools/src/main/java/org/xvm/runtime/Utils.java b/javatools/src/main/java/org/xvm/runtime/Utils.java
index ed428dbc68..6731ca8dea 100644
--- a/javatools/src/main/java/org/xvm/runtime/Utils.java
+++ b/javatools/src/main/java/org/xvm/runtime/Utils.java
@@ -91,7 +91,8 @@ public static void initNative(NativeContainer container) {
ANNOTATION_TEMPLATE_CONSTRUCT = ANNOTATION_TEMPLATE_TEMPLATE.getStructure().findMethod("construct", 2);
ARGUMENT_CONSTRUCT = ARGUMENT_TEMPLATE.getStructure().findMethod("construct", 2);
RT_PARAMETER_CONSTRUCT = RT_PARAMETER_TEMPLATE.getStructure().findMethod("construct", 5);
- LIST_MAP_CONSTRUCT = xListMap.INSTANCE.ensureConstructor();
+ LIST_MAP_CONSTRUCT = container.nativeTemplates().
+ get(xListMap.class).ensureConstructor();
ANNOTATION_ARRAY_TYPE = pool.ensureArrayType(pool.ensureEcstasyTypeConstant("reflect.Annotation"));
ARGUMENT_ARRAY_TYPE = pool.ensureArrayType(pool.ensureEcstasyTypeConstant("reflect.Argument"));
CONST_HELPER = container.getClassStructure("_native.ConstHelper");
@@ -137,7 +138,8 @@ public static FullyBoundHandle makeFinalizer(Frame frame, MethodStructure constr
return methodFinally == null
? null
- : xRTFunction.makeInternalHandle(frame, methodFinally).bindArguments(ahArg);
+ : xRTFunction.makeInternalHandle(frame.f_context.f_container, methodFinally).
+ bindArguments(ahArg);
}
/**
@@ -286,7 +288,7 @@ public static ObjectHandle callGetResource(Frame frame, ObjectHandle hInjector,
ObjectHandle[] ahArg = new ObjectHandle[chain.getMaxVars()];
ahArg[0] = type.ensureTypeHandle(frame.f_context.f_container);
- ahArg[1] = xString.makeHandle(sName);
+ ahArg[1] = xString.makeHandle(frame, sName);
iResult = chain.invoke(frame, hInjector, ahArg, Op.A_STACK);
}
@@ -332,7 +334,7 @@ public static ObjectHandle callInject(Frame frame,
ObjectHandle[] ahArg = new ObjectHandle[chain.getMaxVars()];
ahArg[0] = type.ensureTypeHandle(frame.f_context.f_container);
ahArg[1] = ahArg[0];
- ahArg[2] = xString.makeHandle(sName);
+ ahArg[2] = xString.makeHandle(frame, sName);
ahArg[3] = hOpts;
iResult = chain.invoke(frame, hInjector, ahArg, Op.A_STACK);
@@ -874,10 +876,12 @@ private static int constructSingletonHandle(Frame frame, SingletonConstant const
switch (constValue.getFormat()) {
case Module:
- return xModule.INSTANCE.createConstHandle(frame, constValue);
+ return frame.f_context.f_container.nativeTemplates().
+ get(xModule.class).createConstHandle(frame, constValue);
case Package:
- return xPackage.INSTANCE.createConstHandle(frame, constValue);
+ return frame.f_context.f_container.nativeTemplates().
+ get(xPackage.class).createConstHandle(frame, constValue);
case Property:
return callPropertyInitializer(frame, (PropertyConstant) constValue);
@@ -1543,7 +1547,8 @@ enum Stage {Class, ArgumentArray, ArgumentValue, Argument, Annotation}
*/
public static ArrayHandle makeAnnoArrayHandle(Container container, ObjectHandle[] ahAnno) {
return xArray.makeArrayHandle(
- container.ensureClassComposition(ANNOTATION_ARRAY_TYPE, xArray.INSTANCE),
+ container.ensureClassComposition(ANNOTATION_ARRAY_TYPE,
+ container.nativeTemplates().get(xArray.class)),
ahAnno.length, ahAnno, Mutability.Constant);
}
@@ -1552,7 +1557,8 @@ public static ArrayHandle makeAnnoArrayHandle(Container container, ObjectHandle[
*/
public static ArrayHandle makeArgumentArrayHandle(Container container, ObjectHandle[] ahArg) {
return xArray.makeArrayHandle(
- container.ensureClassComposition(ARGUMENT_ARRAY_TYPE, xArray.INSTANCE),
+ container.ensureClassComposition(ARGUMENT_ARRAY_TYPE,
+ container.nativeTemplates().get(xArray.class)),
ahArg.length, ahArg, Mutability.Constant);
}
@@ -1596,8 +1602,8 @@ public int doNext(Frame frameCaller) {
MethodStructure construct = RT_PARAMETER_CONSTRUCT;
ObjectHandle[] ahArg = new ObjectHandle[construct.getMaxVars()];
- ahArg[0] = xInt64.makeHandle(index); // ordinal
- ahArg[1] = sName == null ? xNullable.NULL : xString.makeHandle(sName);
+ ahArg[0] = xInt64.makeHandle(frameCaller, index); // ordinal
+ ahArg[1] = sName == null ? xNullable.NULL : xString.makeHandle(frameCaller, sName);
ahArg[2] = xBoolean.makeHandle(fFormal);
if (constDefault == null) {
ahArg[3] = xBoolean.FALSE;
@@ -1661,7 +1667,7 @@ public static int constructArgument(Frame frame, TypeConstant typeReferent,
MethodStructure constructor = ARGUMENT_CONSTRUCT;
ObjectHandle[] ahArg = new ObjectHandle[constructor.getMaxVars()];
ahArg[0] = hValue;
- ahArg[1] = sName == null ? xNullable.NULL : xString.makeHandle(sName);
+ ahArg[1] = sName == null ? xNullable.NULL : xString.makeHandle(frame, sName);
TypeComposition clzArg = ARGUMENT_TEMPLATE.
ensureParameterizedClass(frame.f_context.f_container, typeReferent);
diff --git a/javatools/src/main/java/org/xvm/runtime/template/Identity.java b/javatools/src/main/java/org/xvm/runtime/template/Identity.java
index c34786466e..f1d189c97e 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/Identity.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/Identity.java
@@ -11,6 +11,7 @@
import org.xvm.runtime.ClassTemplate;
import org.xvm.runtime.Container;
import org.xvm.runtime.Frame;
+import org.xvm.runtime.NativeTemplates;
import org.xvm.runtime.ObjectHandle;
import org.xvm.runtime.TypeComposition;
@@ -22,17 +23,17 @@
*/
public class Identity
extends ClassTemplate {
- public static Identity INSTANCE;
- public static ClassConstant INCEPTION_CLASS;
+ /**
+ * The rebased inception class for this container's Identity template.
+ */
+ private final ClassConstant f_idInception;
public Identity(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure);
- if (fInstance) {
- INSTANCE = this;
- INCEPTION_CLASS = new NativeRebaseConstant(
- (ClassConstant) structure.getIdentityConstant());
- }
+ f_idInception = fInstance
+ ? new NativeRebaseConstant((ClassConstant) structure.getIdentityConstant())
+ : null;
}
@Override
@@ -45,7 +46,7 @@ public void initNative() {
@Override
protected ClassConstant getInceptionClassConstant() {
- return INCEPTION_CLASS;
+ return f_idInception;
}
@Override
@@ -60,7 +61,7 @@ public int invokeNativeN(Frame frame, MethodStructure method, ObjectHandle hTarg
case "hashCode": {
IdentityHandle hId = (IdentityHandle) ahArg[1];
- return frame.assignValue(iReturn, xInt64.makeHandle(hId.hashCode()));
+ return frame.assignValue(iReturn, xInt64.makeHandle(frame, hId.hashCode()));
}
}
@@ -80,7 +81,8 @@ public int callEquals(Frame frame, TypeComposition clazz,
* Create an identity handle for a mutable or non-hashable object.
*/
public static IdentityHandle ensureIdentity(ObjectHandle h) {
- return new IdentityHandle(INSTANCE.getCanonicalClass(), h);
+ return new IdentityHandle(NativeTemplates.of(h.getComposition()).
+ get(Identity.class).getCanonicalClass(), h);
}
diff --git a/javatools/src/main/java/org/xvm/runtime/template/IndexSupport.java b/javatools/src/main/java/org/xvm/runtime/template/IndexSupport.java
index 4b52a55f50..691259b8d8 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/IndexSupport.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/IndexSupport.java
@@ -7,6 +7,7 @@
import org.xvm.asm.constants.TypeConstant;
+import org.xvm.runtime.Container;
import org.xvm.runtime.Frame;
import org.xvm.runtime.ObjectHandle;
import org.xvm.runtime.ObjectHandle.ExceptionHandle;
@@ -88,9 +89,12 @@ default int makeRef(Frame frame, ObjectHandle hTarget, long lIndex, boolean fRea
try {
TypeConstant typeEl = getElementType(frame, hTarget, lIndex);
- TypeComposition clzRef = fReadOnly
- ? xRef.INSTANCE.ensureParameterizedClass(frame.f_context.f_container, typeEl)
- : xVar.INSTANCE.ensureParameterizedClass(frame.f_context.f_container, typeEl);
+ Container container = frame.f_context.f_container;
+ TypeComposition clzRef = fReadOnly
+ ? container.nativeTemplates().get(xRef.class).
+ ensureParameterizedClass(container, typeEl)
+ : container.nativeTemplates().get(xVar.class).
+ ensureParameterizedClass(container, typeEl);
IndexedRefHandle hRef = new IndexedRefHandle(clzRef, hTarget, lIndex);
diff --git a/javatools/src/main/java/org/xvm/runtime/template/Proxy.java b/javatools/src/main/java/org/xvm/runtime/template/Proxy.java
index a936d94af5..8a2f7bb83f 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/Proxy.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/Proxy.java
@@ -32,12 +32,8 @@
*/
public class Proxy
extends xService {
- public static Proxy INSTANCE;
-
public Proxy(Container container) {
- super(container, xObject.INSTANCE.getStructure(), false);
-
- INSTANCE = this;
+ super(container, container.nativeTemplates().get(xObject.class).getStructure(), false);
}
@Override
@@ -211,7 +207,7 @@ public static ProxyHandle makeHandle(ProxyComposition clzProxy, ServiceContext c
* service boundaries.
*/
private FunctionHandle makeAsyncNativeHandle(ObjectHandle hTarget, MethodStructure method) {
- return new AsyncHandle(INSTANCE.f_container, method) {
+ return new AsyncHandle(f_container, method) {
@Override
protected ObjectHandle getContextTarget(Frame frame, ObjectHandle hService) {
return hTarget;
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/BitBasedDelegate.java b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/BitBasedDelegate.java
index 162d0cd44e..83a46a2243 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/BitBasedDelegate.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/BitBasedDelegate.java
@@ -135,7 +135,7 @@ public DelegateHandle fill(DelegateHandle hTarget, int cSize, ObjectHandle hValu
public int getPropertyCapacity(Frame frame, ObjectHandle hTarget, int iReturn) {
BitArrayHandle hDelegate = (BitArrayHandle) hTarget;
- return frame.assignValue(iReturn, xInt64.makeHandle((long) hDelegate.m_abValue.length << 3));
+ return frame.assignValue(iReturn, xInt64.makeHandle(frame, (long) hDelegate.m_abValue.length << 3));
}
@Override
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/ByteBasedBitView.java b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/ByteBasedBitView.java
index af2104d8bd..f691c694be 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/ByteBasedBitView.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/ByteBasedBitView.java
@@ -42,7 +42,7 @@ public DelegateHandle createBitViewDelegate(DelegateHandle hSource, Mutability m
DelegateHandle hView = hSource instanceof ByteArrayHandle hBytes
? new ViewHandle(clzView, hBytes, hBytes.getBitCount(), mutability)
- : xRTViewToBit.INSTANCE.createBitViewDelegate(hSource, mutability);
+ : nativeTemplates().get(xRTViewToBit.class).createBitViewDelegate(hSource, mutability);
return slice(hView, hSlice.f_ofStart*8, hSlice.m_cSize*8, false);
}
@@ -53,7 +53,7 @@ public DelegateHandle createBitViewDelegate(DelegateHandle hSource, Mutability m
return hSource instanceof ByteArrayHandle hBytes
? new ViewHandle(clzView, hBytes, hBytes.getBitCount(), mutability)
- : xRTViewToBit.INSTANCE.createBitViewDelegate(hSource, mutability);
+ : nativeTemplates().get(xRTViewToBit.class).createBitViewDelegate(hSource, mutability);
}
@@ -66,7 +66,7 @@ protected DelegateHandle createCopyImpl(DelegateHandle hTarget, Mutability mutab
byte[] abBits = getBits(hView, ofStart, cSize, fReverse);
- return xRTBitDelegate.INSTANCE.makeHandle(abBits, cSize, mutability);
+ return nativeTemplates().get(xRTBitDelegate.class).makeHandle(abBits, cSize, mutability);
}
@Override
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/ByteBasedDelegate.java b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/ByteBasedDelegate.java
index e2e313a4c4..965337b5ee 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/ByteBasedDelegate.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/ByteBasedDelegate.java
@@ -13,6 +13,7 @@
import org.xvm.runtime.ClassTemplate;
import org.xvm.runtime.Container;
import org.xvm.runtime.Frame;
+import org.xvm.runtime.NativeTemplates;
import org.xvm.runtime.ObjectHandle;
import org.xvm.runtime.ObjectHandle.JavaLong;
import org.xvm.runtime.TypeComposition;
@@ -70,7 +71,7 @@ public DelegateHandle fill(DelegateHandle hTarget, int cSize, ObjectHandle hValu
public int getPropertyCapacity(Frame frame, ObjectHandle hTarget, int iReturn) {
ByteArrayHandle hDelegate = (ByteArrayHandle) hTarget;
- return frame.assignValue(iReturn, xInt64.makeHandle(hDelegate.m_abValue.length));
+ return frame.assignValue(iReturn, xInt64.makeHandle(frame, hDelegate.m_abValue.length));
}
@Override
@@ -198,7 +199,7 @@ public int invokeIndexOf(Frame frame, DelegateHandle hTarget, DelegateHandle hTh
if (cbThat == 0) {
return ofStart > cbThis
? frame.assignValue(aiReturn[0], xBoolean.FALSE)
- : frame.assignValues(aiReturn, xBoolean.TRUE, xInt64.makeHandle(ofStart));
+ : frame.assignValues(aiReturn, xBoolean.TRUE, xInt64.makeHandle(frame, ofStart));
}
if (ofStart > cbThis - cbThat) {
return frame.assignValue(aiReturn[0], xBoolean.FALSE);
@@ -213,7 +214,7 @@ public int invokeIndexOf(Frame frame, DelegateHandle hTarget, DelegateHandle hTh
continue Next;
}
}
- return frame.assignValues(aiReturn, xBoolean.TRUE, xInt64.makeHandle(of));
+ return frame.assignValues(aiReturn, xBoolean.TRUE, xInt64.makeHandle(frame, of));
}
}
return frame.assignValue(aiReturn[0], xBoolean.FALSE);
@@ -435,8 +436,10 @@ public boolean checkAssign(ObjectHandle hValue) {
return switch (getTemplate()) {
case xRTBitDelegate _ -> templateValue == xBit.ZERO.getTemplate();
case xRTBooleanDelegate _ -> templateValue == xBoolean.TRUE.getTemplate();
- case xRTInt8Delegate _ -> templateValue == xInt8.INSTANCE;
- case xRTUInt8Delegate _ -> templateValue == xUInt8.INSTANCE;
+ case xRTInt8Delegate _ ->
+ templateValue == NativeTemplates.of(getComposition()).get(xInt8.class);
+ case xRTUInt8Delegate _ ->
+ templateValue == NativeTemplates.of(getComposition()).get(xUInt8.class);
default -> super.checkAssign(hValue);
};
}
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/LongBasedBitView.java b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/LongBasedBitView.java
index 79bae355ec..6779576718 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/LongBasedBitView.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/LongBasedBitView.java
@@ -25,8 +25,6 @@
public abstract class LongBasedBitView
extends xRTViewToBit
implements BitView {
- public static LongBasedBitView INSTANCE;
-
public LongBasedBitView(Container container, ClassStructure structure, int nBitsPerValue) {
super(container, structure, false);
@@ -66,7 +64,7 @@ protected DelegateHandle createCopyImpl(DelegateHandle hTarget, Mutability mutab
byte[] abBits = getBits(hView, ofStart, cSize, fReverse);
- return xRTBitDelegate.INSTANCE.makeHandle(abBits, cSize, mutability);
+ return nativeTemplates().get(xRTBitDelegate.class).makeHandle(abBits, cSize, mutability);
}
@Override
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/LongBasedDelegate.java b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/LongBasedDelegate.java
index aa9fbb5ecf..e1faa0b373 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/LongBasedDelegate.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/LongBasedDelegate.java
@@ -11,6 +11,7 @@
import org.xvm.runtime.ClassTemplate;
import org.xvm.runtime.Container;
import org.xvm.runtime.Frame;
+import org.xvm.runtime.NativeTemplates;
import org.xvm.runtime.ObjectHandle;
import org.xvm.runtime.ObjectHandle.JavaLong;
import org.xvm.runtime.TypeComposition;
@@ -101,7 +102,7 @@ public int getPropertyCapacity(Frame frame, ObjectHandle hTarget, int iReturn) {
LongArrayHandle hDelegate = (LongArrayHandle) hTarget;
return frame.assignValue(iReturn,
- xInt64.makeHandle((long) hDelegate.m_alValue.length * f_nValuesPerLong));
+ xInt64.makeHandle(frame, (long) hDelegate.m_alValue.length * f_nValuesPerLong));
}
@Override
@@ -577,15 +578,15 @@ protected void purgeUnusedSpace() {
public boolean checkAssign(ObjectHandle hValue) {
ClassTemplate templateValue = hValue.getTemplate();
return switch (getTemplate()) {
- case xRTInt16Delegate _ -> templateValue == xInt16.INSTANCE;
- case xRTUInt16Delegate _ -> templateValue == xUInt16.INSTANCE;
- case xRTInt32Delegate _ -> templateValue == xInt32.INSTANCE;
- case xRTUInt32Delegate _ -> templateValue == xUInt32.INSTANCE;
- case xRTInt64Delegate _ -> templateValue == xInt64.INSTANCE;
- case xRTUInt64Delegate _ -> templateValue == xUInt64.INSTANCE;
- case xRTInt128Delegate _ -> templateValue == xInt128.INSTANCE;
- case xRTUInt128Delegate _ -> templateValue == xUInt128.INSTANCE;
- case xRTNibbleDelegate _ -> templateValue == xNibble.INSTANCE;
+ case xRTInt16Delegate _ -> templateValue == NativeTemplates.of(getComposition()).get(xInt16.class);
+ case xRTUInt16Delegate _ -> templateValue == NativeTemplates.of(getComposition()).get(xUInt16.class);
+ case xRTInt32Delegate _ -> templateValue == NativeTemplates.of(getComposition()).get(xInt32.class);
+ case xRTUInt32Delegate _ -> templateValue == NativeTemplates.of(getComposition()).get(xUInt32.class);
+ case xRTInt64Delegate _ -> templateValue == NativeTemplates.of(getComposition()).get(xInt64.class);
+ case xRTUInt64Delegate _ -> templateValue == NativeTemplates.of(getComposition()).get(xUInt64.class);
+ case xRTInt128Delegate _ -> templateValue == NativeTemplates.of(getComposition()).get(xInt128.class);
+ case xRTUInt128Delegate _ -> templateValue == NativeTemplates.of(getComposition()).get(xUInt128.class);
+ case xRTNibbleDelegate _ -> templateValue == NativeTemplates.of(getComposition()).get(xNibble.class);
default -> hValue.getType().isA(getElementType());
};
}
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/LongDelegate.java b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/LongDelegate.java
index 709470a062..30e52974ef 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/LongDelegate.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/LongDelegate.java
@@ -17,8 +17,6 @@
*/
public abstract class LongDelegate
extends LongBasedDelegate {
- public static LongDelegate INSTANCE;
-
public LongDelegate(Container container, ClassStructure structure, boolean fSigned) {
super(container, structure, 64, fSigned);
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/LongLongDelegate.java b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/LongLongDelegate.java
index d726c2923c..5732a349c7 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/LongLongDelegate.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/LongLongDelegate.java
@@ -30,8 +30,6 @@
*/
public abstract class LongLongDelegate
extends xRTDelegate {
- public static LongLongDelegate INSTANCE;
-
public LongLongDelegate(Container container, ClassStructure structure, boolean fSigned) {
super(container, structure, false);
@@ -78,7 +76,7 @@ public int getPropertyCapacity(Frame frame, ObjectHandle hTarget, int iReturn) {
LongArrayHandle hDelegate = (LongArrayHandle) hTarget;
return frame.assignValue(iReturn,
- xInt64.makeHandle((long) hDelegate.m_alValue.length / 2));
+ xInt64.makeHandle(frame, (long) hDelegate.m_alValue.length / 2));
}
@Override
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTBitDelegate.java b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTBitDelegate.java
index 33082f42dd..8e756a3c99 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTBitDelegate.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTBitDelegate.java
@@ -20,14 +20,8 @@
*/
public class xRTBitDelegate
extends BitBasedDelegate {
- public static xRTBitDelegate INSTANCE;
-
public xRTBitDelegate(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTBooleanDelegate.java b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTBooleanDelegate.java
index d8395726d7..2074a74b6f 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTBooleanDelegate.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTBooleanDelegate.java
@@ -20,14 +20,8 @@
*/
public class xRTBooleanDelegate
extends BitBasedDelegate {
- public static xRTBooleanDelegate INSTANCE;
-
public xRTBooleanDelegate(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTCharDelegate.java b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTCharDelegate.java
index 2476d732db..897e1bbb87 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTCharDelegate.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTCharDelegate.java
@@ -11,6 +11,7 @@
import org.xvm.runtime.Container;
import org.xvm.runtime.Frame;
+import org.xvm.runtime.NativeTemplates;
import org.xvm.runtime.ObjectHandle;
import org.xvm.runtime.ObjectHandle.JavaLong;
import org.xvm.runtime.TypeComposition;
@@ -30,14 +31,8 @@
*/
public class xRTCharDelegate
extends xRTDelegate {
- public static xRTCharDelegate INSTANCE;
-
public xRTCharDelegate(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure, false);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
@@ -81,7 +76,7 @@ public int invokePreInc(Frame frame, ObjectHandle hTarget, long lIndex, int iRet
--hDelegate.m_achValue[(int) lIndex];
return overflow(frame);
}
- return frame.assignValue(iReturn, xChar.makeHandle(chValue+1));
+ return frame.assignValue(iReturn, xChar.makeHandle(frame, chValue+1));
}
@Override
@@ -98,7 +93,7 @@ public int invokePreDec(Frame frame, ObjectHandle hTarget, long lIndex, int iRet
++hDelegate.m_achValue[(int) lIndex];
return overflow(frame);
}
- return frame.assignValue(iReturn, xChar.makeHandle(chValue-1));
+ return frame.assignValue(iReturn, xChar.makeHandle(frame, chValue-1));
}
@Override
@@ -114,7 +109,7 @@ public int invokePostInc(Frame frame, ObjectHandle hTarget, long lIndex, int iRe
--hDelegate.m_achValue[(int) lIndex];
return overflow(frame);
}
- return frame.assignValue(iReturn, xChar.makeHandle(chValue));
+ return frame.assignValue(iReturn, xChar.makeHandle(frame, chValue));
}
@Override
@@ -130,7 +125,7 @@ public int invokePostDec(Frame frame, ObjectHandle hTarget, long lIndex, int iRe
++hDelegate.m_achValue[(int) lIndex];
return overflow(frame);
}
- return frame.assignValue(iReturn, xChar.makeHandle(chValue));
+ return frame.assignValue(iReturn, xChar.makeHandle(frame, chValue));
}
@Override
@@ -146,7 +141,7 @@ public DelegateHandle fill(DelegateHandle hTarget, int cSize, ObjectHandle hValu
public int getPropertyCapacity(Frame frame, ObjectHandle hTarget, int iReturn) {
CharArrayHandle hDelegate = (CharArrayHandle) hTarget;
- return frame.assignValue(iReturn, xInt64.makeHandle(hDelegate.m_achValue.length));
+ return frame.assignValue(iReturn, xInt64.makeHandle(frame, hDelegate.m_achValue.length));
}
@Override
@@ -214,7 +209,7 @@ protected DelegateHandle createCopyImpl(DelegateHandle hTarget, Mutability mutab
protected int extractArrayValueImpl(Frame frame, DelegateHandle hTarget, long lIndex, int iReturn) {
CharArrayHandle hDelegate = (CharArrayHandle) hTarget;
- return frame.assignValue(iReturn, xChar.makeHandle(hDelegate.m_achValue[(int) lIndex]));
+ return frame.assignValue(iReturn, xChar.makeHandle(frame, hDelegate.m_achValue[(int) lIndex]));
}
@Override
@@ -300,7 +295,7 @@ public int invokeIndexOf(Frame frame, DelegateHandle hTarget, DelegateHandle hTh
if (cchThat == 0) {
return ofStart > cchThis
? frame.assignValue(aiReturn[0], xBoolean.FALSE)
- : frame.assignValues(aiReturn, xBoolean.TRUE, xInt64.makeHandle(ofStart));
+ : frame.assignValues(aiReturn, xBoolean.TRUE, xInt64.makeHandle(frame, ofStart));
}
if (ofStart > cchThis - cchThat) {
return frame.assignValue(aiReturn[0], xBoolean.FALSE);
@@ -315,7 +310,7 @@ public int invokeIndexOf(Frame frame, DelegateHandle hTarget, DelegateHandle hTh
continue Next;
}
}
- return frame.assignValues(aiReturn, xBoolean.TRUE, xInt64.makeHandle(of));
+ return frame.assignValues(aiReturn, xBoolean.TRUE, xInt64.makeHandle(frame, of));
}
}
return frame.assignValue(aiReturn[0], xBoolean.FALSE);
@@ -384,7 +379,8 @@ protected void purgeUnusedSpace() {
@Override
public boolean checkAssign(ObjectHandle hValue) {
- return hValue.getTemplate() == xChar.INSTANCE;
+ return hValue.getTemplate()
+ == NativeTemplates.of(getComposition()).get(xChar.class);
}
@Override
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTDelegate.java b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTDelegate.java
index 3e26496331..816fea3a99 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTDelegate.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTDelegate.java
@@ -42,19 +42,13 @@
public class xRTDelegate
extends ClassTemplate
implements IndexSupport {
- public static xRTDelegate INSTANCE;
-
public xRTDelegate(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
public void registerNativeTemplates() {
- if (this == INSTANCE) {
+ if (isNativeInstance(xRTDelegate.class)) {
registerNativeTemplate(new xRTNibbleDelegate (f_container, f_struct, true));
registerNativeTemplate(new xRTBooleanDelegate (f_container, f_struct, true));
@@ -82,33 +76,33 @@ public void registerNativeTemplates() {
@Override
public void initNative() {
- if (this == INSTANCE) {
+ if (isNativeInstance(xRTDelegate.class)) {
// register native delegations
ConstantPool pool = pool();
Map mapDelegates = new HashMap<>();
- mapDelegates.put(pool.typeNibble(), xRTNibbleDelegate .INSTANCE);
+ mapDelegates.put(pool.typeNibble(), nativeTemplates().get(xRTNibbleDelegate.class));
- mapDelegates.put(pool.typeBoolean(), xRTBooleanDelegate.INSTANCE);
- mapDelegates.put(pool.typeBit(), xRTBitDelegate .INSTANCE);
- mapDelegates.put(pool.typeChar(), xRTCharDelegate .INSTANCE);
+ mapDelegates.put(pool.typeBoolean(), nativeTemplates().get(xRTBooleanDelegate.class));
+ mapDelegates.put(pool.typeBit(), nativeTemplates().get(xRTBitDelegate.class));
+ mapDelegates.put(pool.typeChar(), nativeTemplates().get(xRTCharDelegate.class));
- mapDelegates.put(pool.typeInt8(), xRTInt8Delegate .INSTANCE);
- mapDelegates.put(pool.typeInt16(), xRTInt16Delegate .INSTANCE);
- mapDelegates.put(pool.typeInt32(), xRTInt32Delegate .INSTANCE);
- mapDelegates.put(pool.typeInt64(), xRTInt64Delegate .INSTANCE);
- mapDelegates.put(pool.typeInt128(), xRTInt128Delegate .INSTANCE);
+ mapDelegates.put(pool.typeInt8(), nativeTemplates().get(xRTInt8Delegate.class));
+ mapDelegates.put(pool.typeInt16(), nativeTemplates().get(xRTInt16Delegate.class));
+ mapDelegates.put(pool.typeInt32(), nativeTemplates().get(xRTInt32Delegate.class));
+ mapDelegates.put(pool.typeInt64(), nativeTemplates().get(xRTInt64Delegate.class));
+ mapDelegates.put(pool.typeInt128(), nativeTemplates().get(xRTInt128Delegate.class));
- mapDelegates.put(pool.typeNibble(), xRTNibbleDelegate .INSTANCE);
- mapDelegates.put(pool.typeUInt8(), xRTUInt8Delegate .INSTANCE);
- mapDelegates.put(pool.typeUInt16(), xRTUInt16Delegate .INSTANCE);
- mapDelegates.put(pool.typeUInt32(), xRTUInt32Delegate .INSTANCE);
- mapDelegates.put(pool.typeUInt64(), xRTUInt64Delegate .INSTANCE);
- mapDelegates.put(pool.typeUInt128(), xRTUInt128Delegate.INSTANCE);
+ mapDelegates.put(pool.typeNibble(), nativeTemplates().get(xRTNibbleDelegate.class));
+ mapDelegates.put(pool.typeUInt8(), nativeTemplates().get(xRTUInt8Delegate.class));
+ mapDelegates.put(pool.typeUInt16(), nativeTemplates().get(xRTUInt16Delegate.class));
+ mapDelegates.put(pool.typeUInt32(), nativeTemplates().get(xRTUInt32Delegate.class));
+ mapDelegates.put(pool.typeUInt64(), nativeTemplates().get(xRTUInt64Delegate.class));
+ mapDelegates.put(pool.typeUInt128(), nativeTemplates().get(xRTUInt128Delegate.class));
- mapDelegates.put(pool.typeFloat64(), xRTFloat64Delegate.INSTANCE);
+ mapDelegates.put(pool.typeFloat64(), nativeTemplates().get(xRTFloat64Delegate.class));
- mapDelegates.put(pool.typeString(), xRTStringDelegate .INSTANCE);
+ mapDelegates.put(pool.typeString(), nativeTemplates().get(xRTStringDelegate.class));
DELEGATES = mapDelegates;
@@ -146,7 +140,7 @@ public TypeComposition ensureParameterizedClass(Container container, TypeConstan
@Override
public ClassTemplate getTemplate(TypeConstant type) {
- return getArrayTemplate(type.getParamType(0));
+ return getArrayTemplate(f_container, type.getParamType(0));
}
/**
@@ -319,7 +313,7 @@ public boolean compareIdentity(ObjectHandle hValue1, ObjectHandle hValue2) {
protected int getPropertyCapacity(Frame frame, ObjectHandle hTarget, int iReturn) {
GenericArrayDelegate hDelegate = (GenericArrayDelegate) hTarget;
- return frame.assignValue(iReturn, xInt64.makeHandle(hDelegate.m_ahValue.length));
+ return frame.assignValue(iReturn, xInt64.makeHandle(frame, hDelegate.m_ahValue.length));
}
/**
@@ -352,7 +346,7 @@ protected int setPropertyCapacity(Frame frame, ObjectHandle hTarget, long nCapac
protected int getPropertySize(Frame frame, ObjectHandle hTarget, int iReturn) {
DelegateHandle hDelegate = (DelegateHandle) hTarget;
- return frame.assignValue(iReturn, xInt64.makeHandle(hDelegate.m_cSize));
+ return frame.assignValue(iReturn, xInt64.makeHandle(frame, hDelegate.m_cSize));
}
/**
@@ -437,7 +431,7 @@ public int invokeIndexOf(Frame frame, DelegateHandle hTarget, DelegateHandle hTh
public DelegateHandle slice(DelegateHandle hTarget, long ofStart, long cSize, boolean fReverse) {
return ofStart == 0 && cSize == hTarget.m_cSize && !fReverse
? hTarget
- : xRTSlicingDelegate.INSTANCE.makeHandle(hTarget, ofStart, cSize, fReverse);
+ : nativeTemplates().get(xRTSlicingDelegate.class).makeHandle(hTarget, ofStart, cSize, fReverse);
}
/**
@@ -716,9 +710,11 @@ protected void deleteRangeImpl(DelegateHandle hTarget, long lIndex, long cDelete
// ----- helper methods ------------------------------------------------------------------------
- public static xRTDelegate getArrayTemplate(TypeConstant typeParam) {
+ public static xRTDelegate getArrayTemplate(Container container, TypeConstant typeParam) {
xRTDelegate template = DELEGATES.get(typeParam);
- return template == null ? INSTANCE : template;
+ return template == null
+ ? container.nativeTemplates().get(xRTDelegate.class)
+ : template;
}
private static ObjectHandle[] reverse(ObjectHandle[] ahValue, int cSize) {
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTFloat64Delegate.java b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTFloat64Delegate.java
index 51ca6181a2..eb97eebc0f 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTFloat64Delegate.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTFloat64Delegate.java
@@ -10,6 +10,7 @@
import org.xvm.runtime.Container;
import org.xvm.runtime.Frame;
+import org.xvm.runtime.NativeTemplates;
import org.xvm.runtime.ObjectHandle;
import org.xvm.runtime.TypeComposition;
@@ -28,14 +29,8 @@
*/
public class xRTFloat64Delegate
extends xRTDelegate {
- public static xRTFloat64Delegate INSTANCE;
-
public xRTFloat64Delegate(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure, false);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
@@ -78,7 +73,7 @@ public DelegateHandle fill(DelegateHandle hTarget, int cSize, ObjectHandle hValu
public int getPropertyCapacity(Frame frame, ObjectHandle hTarget, int iReturn) {
DoubleArrayHandle hDelegate = (DoubleArrayHandle) hTarget;
- return frame.assignValue(iReturn, xInt64.makeHandle(hDelegate.m_adValue.length));
+ return frame.assignValue(iReturn, xInt64.makeHandle(frame, hDelegate.m_adValue.length));
}
@Override
@@ -127,7 +122,7 @@ protected int extractArrayValueImpl(Frame frame, DelegateHandle hTarget, long lI
DoubleArrayHandle hDelegate = (DoubleArrayHandle) hTarget;
return frame.assignValue(iReturn,
- xFloat64.INSTANCE.makeHandle(hDelegate.m_adValue[(int) lIndex]));
+ nativeTemplates().get(xFloat64.class).makeHandle(hDelegate.m_adValue[(int) lIndex]));
}
@Override
@@ -304,7 +299,8 @@ protected void purgeUnusedSpace() {
@Override
public boolean checkAssign(ObjectHandle hValue) {
- return hValue.getTemplate() == xFloat64.INSTANCE;
+ return hValue.getTemplate()
+ == NativeTemplates.of(getComposition()).get(xFloat64.class);
}
@Override
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTInt128Delegate.java b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTInt128Delegate.java
index 2477e44d40..94fd85d82f 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTInt128Delegate.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTInt128Delegate.java
@@ -18,14 +18,8 @@
*/
public class xRTInt128Delegate
extends LongLongDelegate {
- public static xRTInt128Delegate INSTANCE;
-
public xRTInt128Delegate(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure, true);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
@@ -42,6 +36,6 @@ public TypeConstant getCanonicalType() {
@Override
protected ObjectHandle makeElementHandle(LongLong ll) {
- return xInt128.INSTANCE.makeHandle(ll);
+ return nativeTemplates().get(xInt128.class).makeHandle(ll);
}
}
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTInt16Delegate.java b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTInt16Delegate.java
index 7a4b35c532..0641f379c5 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTInt16Delegate.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTInt16Delegate.java
@@ -20,14 +20,8 @@
public class xRTInt16Delegate
extends LongBasedDelegate
implements ByteView {
- public static xRTInt16Delegate INSTANCE;
-
public xRTInt16Delegate(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure, 16, true);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
@@ -44,7 +38,7 @@ public TypeConstant getCanonicalType() {
@Override
protected ObjectHandle makeElementHandle(long lValue) {
- return xInt16.INSTANCE.makeJavaLong(lValue);
+ return nativeTemplates().get(xInt16.class).makeJavaLong(lValue);
}
/**
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTInt32Delegate.java b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTInt32Delegate.java
index b2522cfd48..ced37eb8ba 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTInt32Delegate.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTInt32Delegate.java
@@ -20,14 +20,8 @@
public class xRTInt32Delegate
extends LongBasedDelegate
implements ByteView {
- public static xRTInt32Delegate INSTANCE;
-
public xRTInt32Delegate(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure, 32, true);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
@@ -44,7 +38,7 @@ public TypeConstant getCanonicalType() {
@Override
protected ObjectHandle makeElementHandle(long lValue) {
- return xInt32.INSTANCE.makeJavaLong(lValue);
+ return nativeTemplates().get(xInt32.class).makeJavaLong(lValue);
}
/**
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTInt64Delegate.java b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTInt64Delegate.java
index b494e6b1d0..417cb63125 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTInt64Delegate.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTInt64Delegate.java
@@ -17,14 +17,8 @@
*/
public class xRTInt64Delegate
extends LongDelegate {
- public static xRTInt64Delegate INSTANCE;
-
public xRTInt64Delegate(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure, true);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
@@ -41,6 +35,6 @@ public TypeConstant getCanonicalType() {
@Override
protected ObjectHandle makeElementHandle(long lValue) {
- return xInt64.INSTANCE.makeJavaLong(lValue);
+ return nativeTemplates().get(xInt64.class).makeJavaLong(lValue);
}
}
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTInt8Delegate.java b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTInt8Delegate.java
index bbd387d755..4ad05913eb 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTInt8Delegate.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTInt8Delegate.java
@@ -18,14 +18,8 @@
public class xRTInt8Delegate
extends ByteBasedDelegate
implements ByteView {
- public static xRTInt8Delegate INSTANCE;
-
public xRTInt8Delegate(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure, Byte.MIN_VALUE, Byte.MAX_VALUE);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
@@ -42,6 +36,6 @@ public TypeConstant getCanonicalType() {
@Override
protected ObjectHandle makeElementHandle(long lValue) {
- return xInt8.INSTANCE.makeJavaLong(lValue);
+ return nativeTemplates().get(xInt8.class).makeJavaLong(lValue);
}
}
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTNibbleDelegate.java b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTNibbleDelegate.java
index b08464f111..4de4914913 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTNibbleDelegate.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTNibbleDelegate.java
@@ -19,14 +19,8 @@
public class xRTNibbleDelegate
extends LongBasedDelegate
implements ByteView {
- public static xRTNibbleDelegate INSTANCE;
-
public xRTNibbleDelegate(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure, 4, false);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
@@ -43,7 +37,7 @@ public TypeConstant getCanonicalType() {
@Override
protected ObjectHandle makeElementHandle(long lValue) {
- return xNibble.INSTANCE.makeJavaLong(lValue);
+ return nativeTemplates().get(xNibble.class).makeJavaLong(lValue);
}
/**
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTSlicingDelegate.java b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTSlicingDelegate.java
index 00553e9a37..2bd2a4b2cc 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTSlicingDelegate.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTSlicingDelegate.java
@@ -22,14 +22,8 @@
*/
public class xRTSlicingDelegate
extends xRTDelegate {
- public static xRTSlicingDelegate INSTANCE;
-
public xRTSlicingDelegate(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure, false);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTStringDelegate.java b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTStringDelegate.java
index c959bc7c30..79e2b56b37 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTStringDelegate.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTStringDelegate.java
@@ -31,14 +31,8 @@
*/
public class xRTStringDelegate
extends xRTDelegate {
- public static xRTStringDelegate INSTANCE;
-
public xRTStringDelegate(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure, false);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
// ----- RTDelegate API ------------------------------------------------------------------------
@@ -80,7 +74,7 @@ public DelegateHandle fill(DelegateHandle hTarget, int cSize, ObjectHandle hValu
public int getPropertyCapacity(Frame frame, ObjectHandle hTarget, int iReturn) {
StringArrayHandle hDelegate = (StringArrayHandle) hTarget;
- return frame.assignValue(iReturn, xInt64.makeHandle(hDelegate.m_asValue.length));
+ return frame.assignValue(iReturn, xInt64.makeHandle(frame, hDelegate.m_asValue.length));
}
@Override
@@ -123,7 +117,7 @@ protected int extractArrayValueImpl(Frame frame, DelegateHandle hTarget, long lI
StringArrayHandle hDelegate = (StringArrayHandle) hTarget;
String s = hDelegate.m_asValue[(int) lIndex];
- return frame.assignValue(iReturn, xString.makeHandle(s));
+ return frame.assignValue(iReturn, xString.makeHandle(frame, s));
}
@Override
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTUInt128Delegate.java b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTUInt128Delegate.java
index c24e487897..c4984c7b0f 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTUInt128Delegate.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTUInt128Delegate.java
@@ -18,14 +18,8 @@
*/
public class xRTUInt128Delegate
extends LongLongDelegate {
- public static xRTUInt128Delegate INSTANCE;
-
public xRTUInt128Delegate(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure, false);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
@@ -42,6 +36,6 @@ public TypeConstant getCanonicalType() {
@Override
protected ObjectHandle makeElementHandle(LongLong ll) {
- return xUInt128.INSTANCE.makeHandle(ll);
+ return nativeTemplates().get(xUInt128.class).makeHandle(ll);
}
}
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTUInt16Delegate.java b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTUInt16Delegate.java
index 70eee34c95..7121e72ea6 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTUInt16Delegate.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTUInt16Delegate.java
@@ -18,14 +18,8 @@
public class xRTUInt16Delegate
extends LongBasedDelegate
implements ByteView {
- public static xRTUInt16Delegate INSTANCE;
-
public xRTUInt16Delegate(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure, 16, false);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
@@ -42,6 +36,6 @@ public TypeConstant getCanonicalType() {
@Override
protected ObjectHandle makeElementHandle(long lValue) {
- return xUInt16.INSTANCE.makeJavaLong(lValue);
+ return nativeTemplates().get(xUInt16.class).makeJavaLong(lValue);
}
}
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTUInt32Delegate.java b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTUInt32Delegate.java
index c8c3ee2eb3..5581c662ef 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTUInt32Delegate.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTUInt32Delegate.java
@@ -18,14 +18,8 @@
public class xRTUInt32Delegate
extends LongBasedDelegate
implements ByteView {
- public static xRTUInt32Delegate INSTANCE;
-
public xRTUInt32Delegate(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure, 32, false);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
@@ -42,6 +36,6 @@ public TypeConstant getCanonicalType() {
@Override
protected ObjectHandle makeElementHandle(long lValue) {
- return xUInt32.INSTANCE.makeJavaLong(lValue);
+ return nativeTemplates().get(xUInt32.class).makeJavaLong(lValue);
}
}
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTUInt64Delegate.java b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTUInt64Delegate.java
index 48d6c446b9..e0c11f0cf2 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTUInt64Delegate.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTUInt64Delegate.java
@@ -17,14 +17,8 @@
*/
public class xRTUInt64Delegate
extends LongDelegate {
- public static xRTUInt64Delegate INSTANCE;
-
public xRTUInt64Delegate(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure, false);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
@@ -41,6 +35,6 @@ public TypeConstant getCanonicalType() {
@Override
protected ObjectHandle makeElementHandle(long lValue) {
- return xUInt64.INSTANCE.makeJavaLong(lValue);
+ return nativeTemplates().get(xUInt64.class).makeJavaLong(lValue);
}
}
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTUInt8Delegate.java b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTUInt8Delegate.java
index be799a169a..af37cb6b0d 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTUInt8Delegate.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTUInt8Delegate.java
@@ -7,6 +7,7 @@
import org.xvm.asm.constants.TypeConstant;
import org.xvm.runtime.Container;
+import org.xvm.runtime.NativeTemplates;
import org.xvm.runtime.ObjectHandle;
import org.xvm.runtime.template.numbers.xUInt8;
@@ -18,14 +19,8 @@
public class xRTUInt8Delegate
extends ByteBasedDelegate
implements ByteView {
- public static xRTUInt8Delegate INSTANCE;
-
public xRTUInt8Delegate(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure, (byte) 0, (byte) 0xFF);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
@@ -42,13 +37,14 @@ public TypeConstant getCanonicalType() {
@Override
protected ObjectHandle makeElementHandle(long lValue) {
- return xUInt8.INSTANCE.makeJavaLong(lValue);
+ return nativeTemplates().get(xUInt8.class).makeJavaLong(lValue);
}
/**
* Obtain an array of bytes from the specified ByteArrayHandle.
*/
public static byte[] getBytes(ByteArrayHandle hDelegate) {
- return INSTANCE.getBytes(hDelegate, 0, hDelegate.m_cSize, false);
+ return NativeTemplates.of(hDelegate.getComposition()).get(xRTUInt8Delegate.class).
+ getBytes(hDelegate, 0, hDelegate.m_cSize, false);
}
}
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewFromBit.java b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewFromBit.java
index 6017d17351..22ca515fa1 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewFromBit.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewFromBit.java
@@ -16,19 +16,13 @@
public class xRTViewFromBit
extends xRTView
implements ByteView {
- public static xRTViewFromBit INSTANCE;
-
public xRTViewFromBit(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
public void registerNativeTemplates() {
- if (this == INSTANCE) {
+ if (isNativeInstance(xRTViewFromBit.class)) {
registerNativeTemplate(new xRTViewFromBitToBoolean (f_container, f_struct, true));
registerNativeTemplate(new xRTViewFromBitToByte (f_container, f_struct, true));
registerNativeTemplate(new xRTViewFromBitToNibble (f_container, f_struct, true));
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewFromBitToBoolean.java b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewFromBitToBoolean.java
index 7478935596..c490d33b7b 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewFromBitToBoolean.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewFromBitToBoolean.java
@@ -25,14 +25,8 @@
*/
public class xRTViewFromBitToBoolean
extends xRTViewFromBit {
- public static xRTViewFromBitToBoolean INSTANCE;
-
public xRTViewFromBitToBoolean(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure, false);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
@@ -73,7 +67,7 @@ protected DelegateHandle createCopyImpl(DelegateHandle hTarget, Mutability mutab
if (tSource instanceof BitView tView) {
byte[] abBits = tView.getBytes(hSource, ofStart, cSize, fReverse);
- return xRTBooleanDelegate.INSTANCE.makeHandle(abBits, cSize, mutability);
+ return nativeTemplates().get(xRTBooleanDelegate.class).makeHandle(abBits, cSize, mutability);
}
throw new UnsupportedOperationException();
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewFromBitToByte.java b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewFromBitToByte.java
index 7539056484..1bd6ec3356 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewFromBitToByte.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewFromBitToByte.java
@@ -26,14 +26,8 @@
*/
public class xRTViewFromBitToByte
extends xRTViewFromBit {
- public static xRTViewFromBitToByte INSTANCE;
-
public xRTViewFromBitToByte(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure, false);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
@@ -86,7 +80,7 @@ protected DelegateHandle createCopyImpl(DelegateHandle hTarget, Mutability mutab
if (tSource instanceof ByteView tView) {
byte[] abBits = tView.getBytes(hSource, ofStart, cSize, fReverse);
- return xRTUInt8Delegate.INSTANCE.makeHandle(abBits, cSize, mutability);
+ return nativeTemplates().get(xRTUInt8Delegate.class).makeHandle(abBits, cSize, mutability);
}
throw new UnsupportedOperationException();
@@ -101,7 +95,7 @@ protected int extractArrayValueImpl(Frame frame, DelegateHandle hTarget, long lI
if (tSource instanceof ByteView tView) {
// the underlying delegate is a BitView, which is a ByteView
return frame.assignValue(iReturn,
- xUInt8.INSTANCE.makeJavaLong(tView.extractByte(hSource, lIndex)));
+ nativeTemplates().get(xUInt8.class).makeJavaLong(tView.extractByte(hSource, lIndex)));
}
throw new UnsupportedOperationException();
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewFromBitToNibble.java b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewFromBitToNibble.java
index ea9e35db3f..f0581bf6fd 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewFromBitToNibble.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewFromBitToNibble.java
@@ -26,14 +26,8 @@
*/
public class xRTViewFromBitToNibble
extends xRTViewFromBit {
- public static xRTViewFromBitToNibble INSTANCE;
-
public xRTViewFromBitToNibble(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure, false);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
@@ -70,7 +64,7 @@ protected DelegateHandle createCopyImpl(DelegateHandle hTarget, Mutability mutab
if (tSource instanceof BitView tView) {
byte[] abBits = tView.getBytes(hSource, ofStart/2, cSize/2, fReverse);
- return xRTNibbleDelegate.INSTANCE.packHandle(abBits, mutability);
+ return nativeTemplates().get(xRTNibbleDelegate.class).packHandle(abBits, mutability);
}
throw new UnsupportedOperationException();
@@ -90,7 +84,7 @@ protected int extractArrayValueImpl(Frame frame, DelegateHandle hTarget, long lI
} else {
nNibble = nNibble & 0x0F;
}
- return frame.assignValue(iReturn, xNibble.INSTANCE.makeJavaLong(nNibble));
+ return frame.assignValue(iReturn, nativeTemplates().get(xNibble.class).makeJavaLong(nNibble));
}
throw new UnsupportedOperationException();
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewFromByte.java b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewFromByte.java
index 741e4eb5f5..bc4ce9c495 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewFromByte.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewFromByte.java
@@ -17,19 +17,13 @@
*/
public class xRTViewFromByte
extends xRTView {
- public static xRTViewFromByte INSTANCE;
-
public xRTViewFromByte(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
public void registerNativeTemplates() {
- if (this == INSTANCE) {
+ if (isNativeInstance(xRTViewFromByte.class)) {
registerNativeTemplate(new xRTViewFromByteToInt8 (f_container, f_struct, true));
registerNativeTemplate(new xRTViewFromByteToInt16 (f_container, f_struct, true));
registerNativeTemplate(new xRTViewFromByteToInt64 (f_container, f_struct, true));
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewFromByteToFloat64.java b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewFromByteToFloat64.java
index 90edbbc1c6..250e79bd63 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewFromByteToFloat64.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewFromByteToFloat64.java
@@ -24,14 +24,8 @@
*/
public class xRTViewFromByteToFloat64
extends xRTViewFromByte {
- public static xRTViewFromByteToFloat64 INSTANCE;
-
public xRTViewFromByteToFloat64(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure, false);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
@@ -59,7 +53,7 @@ protected DelegateHandle createCopyImpl(DelegateHandle hTarget, Mutability mutab
adValue[i] = Double.longBitsToDouble(Handy.byteArrayToLong(ab, 0));
}
- return xRTFloat64Delegate.INSTANCE.makeHandle(adValue, adValue.length, mutability);
+ return nativeTemplates().get(xRTFloat64Delegate.class).makeHandle(adValue, adValue.length, mutability);
}
throw new UnsupportedOperationException();
@@ -75,7 +69,7 @@ protected int extractArrayValueImpl(Frame frame, DelegateHandle hTarget, long lI
byte[] ab = tView.getBytes(hSource, lIndex*8, 8, false);
double d = Double.longBitsToDouble(Handy.byteArrayToLong(ab, 0));
- return frame.assignValue(iReturn, xFloat64.INSTANCE.makeHandle(d));
+ return frame.assignValue(iReturn, nativeTemplates().get(xFloat64.class).makeHandle(d));
}
throw new UnsupportedOperationException();
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewFromByteToInt16.java b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewFromByteToInt16.java
index 37216f5485..6a4c81ac75 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewFromByteToInt16.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewFromByteToInt16.java
@@ -23,14 +23,8 @@
*/
public class xRTViewFromByteToInt16
extends xRTViewFromByte {
- public static xRTViewFromByteToInt16 INSTANCE;
-
public xRTViewFromByteToInt16(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure, false);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
@@ -61,7 +55,7 @@ protected DelegateHandle createCopyImpl(DelegateHandle hTarget, Mutability mutab
anValue[i] = (short) (((short) bValue0) << 8 | (bValue1 & 0xFF));
}
- return xRTInt16Delegate.INSTANCE.packHandle(anValue, mutability);
+ return nativeTemplates().get(xRTInt16Delegate.class).packHandle(anValue, mutability);
}
throw new UnsupportedOperationException();
@@ -79,7 +73,7 @@ protected int extractArrayValueImpl(Frame frame, DelegateHandle hTarget, long lI
// using a "short" intermediary takes care of the sign handling
short nValue = (short) (((short) bValue0) << 8 | (bValue1 & 0xFF));
- return frame.assignValue(iReturn, xInt16.INSTANCE.makeJavaLong(nValue));
+ return frame.assignValue(iReturn, nativeTemplates().get(xInt16.class).makeJavaLong(nValue));
}
throw new UnsupportedOperationException();
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewFromByteToInt64.java b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewFromByteToInt64.java
index 4b4ae73984..170cc675ea 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewFromByteToInt64.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewFromByteToInt64.java
@@ -25,14 +25,8 @@
*/
public class xRTViewFromByteToInt64
extends xRTViewFromByte {
- public static xRTViewFromByteToInt64 INSTANCE;
-
public xRTViewFromByteToInt64(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure, false);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
@@ -60,7 +54,7 @@ protected DelegateHandle createCopyImpl(DelegateHandle hTarget, Mutability mutab
alValue[i] = Handy.byteArrayToLong(ab, 0);
}
- return xRTInt64Delegate.INSTANCE.makeHandle(alValue, alValue.length, mutability);
+ return nativeTemplates().get(xRTInt64Delegate.class).makeHandle(alValue, alValue.length, mutability);
}
throw new UnsupportedOperationException();
@@ -76,7 +70,7 @@ protected int extractArrayValueImpl(Frame frame, DelegateHandle hTarget, long lI
byte[] ab = tView.getBytes(hSource, lIndex*8, 8, false);
long l = Handy.byteArrayToLong(ab, 0);
- return frame.assignValue(iReturn, xInt64.makeHandle(l));
+ return frame.assignValue(iReturn, xInt64.makeHandle(frame, l));
}
throw new UnsupportedOperationException();
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewFromByteToInt8.java b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewFromByteToInt8.java
index 8a14d1d8b4..ab9ddc21ec 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewFromByteToInt8.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewFromByteToInt8.java
@@ -23,14 +23,8 @@
*/
public class xRTViewFromByteToInt8
extends xRTViewFromByte {
- public static xRTViewFromByteToInt8 INSTANCE;
-
public xRTViewFromByteToInt8(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure, false);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
@@ -54,7 +48,7 @@ protected DelegateHandle createCopyImpl(DelegateHandle hTarget, Mutability mutab
if (tSource instanceof ByteView tView) {
byte[] abValue = tView.getBytes(hSource, ofStart, cSize, fReverse);
- return xRTInt8Delegate.INSTANCE.makeHandle(abValue, cSize, mutability);
+ return nativeTemplates().get(xRTInt8Delegate.class).makeHandle(abValue, cSize, mutability);
}
throw new UnsupportedOperationException();
@@ -69,7 +63,7 @@ protected int extractArrayValueImpl(Frame frame, DelegateHandle hTarget, long lI
if (tSource instanceof ByteView tView) {
byte bValue = tView.extractByte(hSource, lIndex);
- return frame.assignValue(iReturn, xInt8.INSTANCE.makeJavaLong(bValue));
+ return frame.assignValue(iReturn, nativeTemplates().get(xInt8.class).makeJavaLong(bValue));
}
throw new UnsupportedOperationException();
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewToBit.java b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewToBit.java
index dd570610f8..3a91cb5257 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewToBit.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewToBit.java
@@ -20,19 +20,13 @@
*/
public class xRTViewToBit
extends xRTView {
- public static xRTViewToBit INSTANCE;
-
public xRTViewToBit(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
public void registerNativeTemplates() {
- if (this == INSTANCE) {
+ if (isNativeInstance(xRTViewToBit.class)) {
registerNativeTemplate(new xRTViewToBitFromNibble(f_container, f_struct, true));
registerNativeTemplate(new xRTViewToBitFromInt8 (f_container, f_struct, true));
@@ -52,26 +46,26 @@ public void registerNativeTemplates() {
}
@Override
public void initNative() {
- if (this == INSTANCE) {
+ if (isNativeInstance(xRTViewToBit.class)) {
// register native views
ConstantPool pool = pool();
Map mapViews = new HashMap<>();
- mapViews.put(pool.typeNibble(), xRTViewToBitFromNibble.INSTANCE);
+ mapViews.put(pool.typeNibble(), nativeTemplates().get(xRTViewToBitFromNibble.class));
- mapViews.put(pool.typeInt8() , xRTViewToBitFromInt8 .INSTANCE);
- mapViews.put(pool.typeInt16() , xRTViewToBitFromInt16 .INSTANCE);
- mapViews.put(pool.typeInt32() , xRTViewToBitFromInt32 .INSTANCE);
- mapViews.put(pool.typeInt64() , xRTViewToBitFromInt64 .INSTANCE);
- mapViews.put(pool.typeInt128() , xRTViewToBitFromInt128 .INSTANCE);
+ mapViews.put(pool.typeInt8() , nativeTemplates().get(xRTViewToBitFromInt8.class));
+ mapViews.put(pool.typeInt16() , nativeTemplates().get(xRTViewToBitFromInt16.class));
+ mapViews.put(pool.typeInt32() , nativeTemplates().get(xRTViewToBitFromInt32.class));
+ mapViews.put(pool.typeInt64() , nativeTemplates().get(xRTViewToBitFromInt64.class));
+ mapViews.put(pool.typeInt128() , nativeTemplates().get(xRTViewToBitFromInt128.class));
- mapViews.put(pool.typeUInt8() , xRTViewToBitFromUInt8 .INSTANCE);
- mapViews.put(pool.typeUInt16() , xRTViewToBitFromUInt16 .INSTANCE);
- mapViews.put(pool.typeUInt32() , xRTViewToBitFromUInt32 .INSTANCE);
- mapViews.put(pool.typeUInt64() , xRTViewToBitFromUInt64 .INSTANCE);
- mapViews.put(pool.typeUInt128(), xRTViewToBitFromUInt128.INSTANCE);
+ mapViews.put(pool.typeUInt8() , nativeTemplates().get(xRTViewToBitFromUInt8.class));
+ mapViews.put(pool.typeUInt16() , nativeTemplates().get(xRTViewToBitFromUInt16.class));
+ mapViews.put(pool.typeUInt32() , nativeTemplates().get(xRTViewToBitFromUInt32.class));
+ mapViews.put(pool.typeUInt64() , nativeTemplates().get(xRTViewToBitFromUInt64.class));
+ mapViews.put(pool.typeUInt128(), nativeTemplates().get(xRTViewToBitFromUInt128.class));
- mapViews.put(pool.typeFloat64(), xRTViewToBitFromFloat64.INSTANCE);
+ mapViews.put(pool.typeFloat64(), nativeTemplates().get(xRTViewToBitFromFloat64.class));
VIEWS = mapViews;
}
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewToBitFromFloat64.java b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewToBitFromFloat64.java
index aa5317caef..f8245e3d7d 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewToBitFromFloat64.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewToBitFromFloat64.java
@@ -34,14 +34,8 @@
public class xRTViewToBitFromFloat64
extends xRTViewToBit
implements BitView {
- public static xRTViewToBitFromFloat64 INSTANCE;
-
public xRTViewToBitFromFloat64(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure, false);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
@@ -82,7 +76,7 @@ protected DelegateHandle createCopyImpl(DelegateHandle hTarget, Mutability mutab
byte[] abBits = getBits(hView, ofStart, cSize, fReverse);
- return xRTBitDelegate.INSTANCE.makeHandle(abBits, cSize, mutability);
+ return nativeTemplates().get(xRTBitDelegate.class).makeHandle(abBits, cSize, mutability);
}
@Override
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewToBitFromInt128.java b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewToBitFromInt128.java
index ccf3f18e6b..3b0a1ba47f 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewToBitFromInt128.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewToBitFromInt128.java
@@ -14,14 +14,8 @@
*/
public class xRTViewToBitFromInt128
extends LongBasedBitView {
- public static xRTViewToBitFromInt128 INSTANCE;
-
public xRTViewToBitFromInt128(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure, 128);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewToBitFromInt16.java b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewToBitFromInt16.java
index 9449af5454..01fbe5a2ed 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewToBitFromInt16.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewToBitFromInt16.java
@@ -14,14 +14,8 @@
*/
public class xRTViewToBitFromInt16
extends LongBasedBitView {
- public static xRTViewToBitFromInt16 INSTANCE;
-
public xRTViewToBitFromInt16(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure, 16);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewToBitFromInt32.java b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewToBitFromInt32.java
index 1e9e3e8ee1..18d3ddf1b8 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewToBitFromInt32.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewToBitFromInt32.java
@@ -14,14 +14,8 @@
*/
public class xRTViewToBitFromInt32
extends LongBasedBitView {
- public static xRTViewToBitFromInt32 INSTANCE;
-
public xRTViewToBitFromInt32(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure, 32);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewToBitFromInt64.java b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewToBitFromInt64.java
index 88877d7731..2b77c6e33c 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewToBitFromInt64.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewToBitFromInt64.java
@@ -14,14 +14,8 @@
*/
public class xRTViewToBitFromInt64
extends LongBasedBitView {
- public static xRTViewToBitFromInt64 INSTANCE;
-
public xRTViewToBitFromInt64(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure, 64);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewToBitFromInt8.java b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewToBitFromInt8.java
index 0f23141079..0cfb1cacb3 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewToBitFromInt8.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewToBitFromInt8.java
@@ -14,14 +14,8 @@
*/
public class xRTViewToBitFromInt8
extends ByteBasedBitView {
- public static xRTViewToBitFromInt8 INSTANCE;
-
public xRTViewToBitFromInt8(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewToBitFromNibble.java b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewToBitFromNibble.java
index 69c3aa6f52..33bec34a58 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewToBitFromNibble.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewToBitFromNibble.java
@@ -14,14 +14,8 @@
*/
public class xRTViewToBitFromNibble
extends LongBasedBitView {
- public static xRTViewToBitFromNibble INSTANCE;
-
public xRTViewToBitFromNibble(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure, 4);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewToBitFromUInt128.java b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewToBitFromUInt128.java
index ec3c5cab72..4daa816eaa 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewToBitFromUInt128.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewToBitFromUInt128.java
@@ -14,14 +14,8 @@
*/
public class xRTViewToBitFromUInt128
extends LongBasedBitView {
- public static xRTViewToBitFromUInt128 INSTANCE;
-
public xRTViewToBitFromUInt128(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure, 128);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewToBitFromUInt16.java b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewToBitFromUInt16.java
index b0d648526a..f02ea0bbb8 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewToBitFromUInt16.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewToBitFromUInt16.java
@@ -14,14 +14,8 @@
*/
public class xRTViewToBitFromUInt16
extends LongBasedBitView {
- public static xRTViewToBitFromUInt16 INSTANCE;
-
public xRTViewToBitFromUInt16(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure, 16);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewToBitFromUInt32.java b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewToBitFromUInt32.java
index f940f85337..2a550741f6 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewToBitFromUInt32.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewToBitFromUInt32.java
@@ -14,14 +14,8 @@
*/
public class xRTViewToBitFromUInt32
extends LongBasedBitView {
- public static xRTViewToBitFromUInt32 INSTANCE;
-
public xRTViewToBitFromUInt32(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure, 32);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewToBitFromUInt64.java b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewToBitFromUInt64.java
index 38b770bc16..70f2c29329 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewToBitFromUInt64.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewToBitFromUInt64.java
@@ -14,14 +14,8 @@
*/
public class xRTViewToBitFromUInt64
extends LongBasedBitView {
- public static xRTViewToBitFromUInt64 INSTANCE;
-
public xRTViewToBitFromUInt64(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure, 64);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewToBitFromUInt8.java b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewToBitFromUInt8.java
index 2b0213ea15..8de9d4f598 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewToBitFromUInt8.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/arrays/xRTViewToBitFromUInt8.java
@@ -14,14 +14,8 @@
*/
public class xRTViewToBitFromUInt8
extends ByteBasedBitView {
- public static xRTViewToBitFromUInt8 INSTANCE;
-
public xRTViewToBitFromUInt8(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/xBasicHashCollector.java b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/xBasicHashCollector.java
index eaed5ecc7d..08745564fc 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/collections/xBasicHashCollector.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/collections/xBasicHashCollector.java
@@ -23,16 +23,10 @@
public class xBasicHashCollector
extends ClassTemplate {
- public static xBasicHashCollector INSTANCE;
-
private static final String[] TYPE_HASH_COLLECTOR = { "collections.HashCollector" };
public xBasicHashCollector(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
@@ -60,7 +54,7 @@ public int invokeNativeN(Frame frame, MethodStructure method, ObjectHandle hTarg
return frame.assignValue(iReturn, hTarget);
}
case "compute": {
- JavaLong hHash = xInt64.makeHandle(hCollector.collector.compute());
+ JavaLong hHash = xInt64.makeHandle(frame, hCollector.collector.compute());
return frame.assignValue(iReturn, hHash);
}
}
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/crypto/xRTAlgorithms.java b/javatools/src/main/java/org/xvm/runtime/template/_native/crypto/xRTAlgorithms.java
index c0c0d13dbc..d884ce3d0b 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/crypto/xRTAlgorithms.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/crypto/xRTAlgorithms.java
@@ -54,14 +54,8 @@
*/
public class xRTAlgorithms
extends xService {
- public static xRTAlgorithms INSTANCE;
-
public xRTAlgorithms(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure, false);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
@@ -143,7 +137,7 @@ private int invokeGetAlgorithmInfo(Frame frame, StringHandle hName, EnumHandle h
MessageDigest digest = MessageDigest.getInstance(sName);
nBlockSize = 0;
- hImpl = new DigestHandle(digest);
+ hImpl = new DigestHandle(frame.f_context.f_container, digest);
break;
}
@@ -152,7 +146,7 @@ private int invokeGetAlgorithmInfo(Frame frame, StringHandle hName, EnumHandle h
Cipher cipher = Cipher.getInstance(sName);
nBlockSize = cipher.getBlockSize();
- hImpl = new CipherHandle(cipher);
+ hImpl = new CipherHandle(frame.f_context.f_container, cipher);
break;
}
@@ -160,7 +154,7 @@ private int invokeGetAlgorithmInfo(Frame frame, StringHandle hName, EnumHandle h
Mac mac = Mac.getInstance(sName);
nBlockSize = 0;
- hImpl = new MacHandle(mac);
+ hImpl = new MacHandle(frame.f_context.f_container, mac);
break;
}
@@ -168,7 +162,7 @@ private int invokeGetAlgorithmInfo(Frame frame, StringHandle hName, EnumHandle h
Signature sig = Signature.getInstance(sName);
nBlockSize = 0;
- hImpl = new SignatureHandle(sig);
+ hImpl = new SignatureHandle(frame.f_context.f_container, sig);
break;
}
@@ -176,7 +170,7 @@ private int invokeGetAlgorithmInfo(Frame frame, StringHandle hName, EnumHandle h
KeyGenerator generator = KeyGenerator.getInstance(sName);
nBlockSize = 0;
- hImpl = new KeyGenHandle(generator);
+ hImpl = new KeyGenHandle(frame.f_context.f_container, generator);
break;
}
@@ -185,7 +179,7 @@ private int invokeGetAlgorithmInfo(Frame frame, StringHandle hName, EnumHandle h
}
List list = new ArrayList<>(9);
- list.add(xInt64.makeHandle(nBlockSize));
+ list.add(xInt64.makeHandle(frame, nBlockSize));
list.add(hImpl);
return frame.assignValues(aiReturn, list.toArray(Utils.OBJECTS_NONE));
@@ -288,8 +282,8 @@ public enum KeyForm {Public, Private, PublicOrSecret, PrivateOrSecret}
*/
public static class DigestHandle
extends ObjectHandle {
- protected DigestHandle(MessageDigest digest) {
- super(xObject.INSTANCE.getCanonicalClass());
+ protected DigestHandle(Container container, MessageDigest digest) {
+ super(container.nativeTemplates().get(xObject.class).getCanonicalClass());
f_digest = digest;
}
@@ -305,8 +299,8 @@ protected DigestHandle(MessageDigest digest) {
*/
public static class CipherHandle
extends ObjectHandle {
- protected CipherHandle(Cipher cipher) {
- super(xObject.INSTANCE.getCanonicalClass());
+ protected CipherHandle(Container container, Cipher cipher) {
+ super(container.nativeTemplates().get(xObject.class).getCanonicalClass());
f_cipher = cipher;
}
@@ -322,8 +316,8 @@ protected CipherHandle(Cipher cipher) {
*/
public static class SignatureHandle
extends ObjectHandle {
- protected SignatureHandle(Signature signature) {
- super(xObject.INSTANCE.getCanonicalClass());
+ protected SignatureHandle(Container container, Signature signature) {
+ super(container.nativeTemplates().get(xObject.class).getCanonicalClass());
f_signature = signature;
}
@@ -339,8 +333,8 @@ protected SignatureHandle(Signature signature) {
*/
public static class MacHandle
extends ObjectHandle {
- protected MacHandle(Mac mac) {
- super(xObject.INSTANCE.getCanonicalClass());
+ protected MacHandle(Container container, Mac mac) {
+ super(container.nativeTemplates().get(xObject.class).getCanonicalClass());
f_mac = mac;
}
@@ -356,8 +350,8 @@ protected MacHandle(Mac mac) {
*/
public static class SecretHandle
extends ObjectHandle {
- protected SecretHandle(Key key) {
- super(xObject.INSTANCE.getCanonicalClass());
+ protected SecretHandle(Container container, Key key) {
+ super(container.nativeTemplates().get(xObject.class).getCanonicalClass());
f_key = key;
}
@@ -378,8 +372,8 @@ public static class KeyGenHandle
*/
public final KeyGenerator f_generator;
- protected KeyGenHandle(KeyGenerator generator) {
- super(xObject.INSTANCE.getCanonicalClass());
+ protected KeyGenHandle(Container container, KeyGenerator generator) {
+ super(container.nativeTemplates().get(xObject.class).getCanonicalClass());
f_generator = generator;
}
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/crypto/xRTCertificateManager.java b/javatools/src/main/java/org/xvm/runtime/template/_native/crypto/xRTCertificateManager.java
index 3414355cde..835c655cbd 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/crypto/xRTCertificateManager.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/crypto/xRTCertificateManager.java
@@ -74,14 +74,8 @@
public class xRTCertificateManager
extends xService {
- public static xRTCertificateManager INSTANCE;
-
public xRTCertificateManager(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure, false);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
@@ -113,7 +107,7 @@ public TypeConstant getCanonicalType() {
* Injection support method.
*/
public ObjectHandle ensureManager(Frame frame, ObjectHandle hOpts) {
- StringHandle hProvider = hOpts instanceof StringHandle hS ? hS : xString.makeHandle("self");
+ StringHandle hProvider = hOpts instanceof StringHandle hS ? hS : xString.makeHandle(frame, "self");
ClassComposition clz = getCanonicalClass();
ServiceHandle hMgr = createServiceHandle(
f_container.createServiceContext("CertificateManager"), clz, getCanonicalType());
@@ -533,7 +527,7 @@ private Key loadKey(ObjectHandle hPathOrStore, StringHandle hPwd, StringHandle h
private int invokeKeystoreFor(Frame frame, ObjectHandle[] ahArg, int iReturn) {
ArrayHandle hContent = (ArrayHandle) ahArg[0];
StringHandle hPwd = xRTKeyStore.getPassword(frame, ahArg[1]);
- ObjectHandle hKeyStore = xRTKeyStore.INSTANCE.ensureKeyStore(frame, hContent, hPwd);
+ ObjectHandle hKeyStore = nativeTemplates().get(xRTKeyStore.class).ensureKeyStore(frame, hContent, hPwd);
return frame.assignDeferredValue(iReturn, hKeyStore);
}
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/crypto/xRTDecryptor.java b/javatools/src/main/java/org/xvm/runtime/template/_native/crypto/xRTDecryptor.java
index dba7ce8269..a8f028a54d 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/crypto/xRTDecryptor.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/crypto/xRTDecryptor.java
@@ -32,14 +32,8 @@
*/
public class xRTDecryptor
extends xService {
- public static xRTDecryptor INSTANCE;
-
public xRTDecryptor(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure, false);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/crypto/xRTHasher.java b/javatools/src/main/java/org/xvm/runtime/template/_native/crypto/xRTHasher.java
index 4fc8582436..fe177a31ce 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/crypto/xRTHasher.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/crypto/xRTHasher.java
@@ -27,14 +27,8 @@
*/
public class xRTHasher
extends xService {
- public static xRTHasher INSTANCE;
-
public xRTHasher(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure, false);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/crypto/xRTKeyGenerator.java b/javatools/src/main/java/org/xvm/runtime/template/_native/crypto/xRTKeyGenerator.java
index 48222bcd08..5d87fc22ee 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/crypto/xRTKeyGenerator.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/crypto/xRTKeyGenerator.java
@@ -23,14 +23,8 @@
*/
public class xRTKeyGenerator
extends xService {
- public static xRTKeyGenerator INSTANCE;
-
public xRTKeyGenerator(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure, false);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
@@ -59,6 +53,7 @@ private int invokeGenerateSecret(Frame frame, KeyGenHandle hKeyGen, int[] aiRetu
SecretKey key = hKeyGen.f_generator.generateKey();
int nSize = key.getEncoded().length;
- return frame.assignValues(aiReturn, xInt64.makeHandle(nSize), new SecretHandle(key));
+ return frame.assignValues(aiReturn, xInt64.makeHandle(frame, nSize),
+ new SecretHandle(frame.f_context.f_container, key));
}
}
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/crypto/xRTKeyStore.java b/javatools/src/main/java/org/xvm/runtime/template/_native/crypto/xRTKeyStore.java
index 8ab3f99ad6..5416719763 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/crypto/xRTKeyStore.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/crypto/xRTKeyStore.java
@@ -82,14 +82,8 @@
*/
public class xRTKeyStore
extends xService {
- public static xRTKeyStore INSTANCE;
-
public xRTKeyStore(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure, false);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
@@ -214,7 +208,7 @@ public int invokeNativeGet(Frame frame, String sPropName, ObjectHandle hTarget,
try {
ArrayList listNames = Collections.list(hStore.f_keyStore.aliases());
return frame.assignValue(iReturn,
- xString.makeArrayHandle(listNames.toArray(Utils.NO_NAMES)));
+ xString.makeArrayHandle(frame.f_context.f_container, listNames.toArray(Utils.NO_NAMES)));
} catch (KeyStoreException e) {
return frame.raiseException(xException.makeObscure(frame, e.getMessage()));
}
@@ -337,18 +331,18 @@ private int invokeGetCertificateInfo(Frame frame, KeyStoreHandle hStore, StringH
// create the arguments
List list = new ArrayList<>(9);
list.add(xBoolean.TRUE);
- list.add(xString.makeHandle(sIssuer));
- list.add(xString.makeHandle(sSubject));
- list.add(xInt64.makeHandle(nVersion));
- addDate(dateNotBefore, list);
- addDate(dateNotAfter, list);
+ list.add(xString.makeHandle(frame, sIssuer));
+ list.add(xString.makeHandle(frame, sSubject));
+ list.add(xInt64.makeHandle(frame, nVersion));
+ addDate(frame, dateNotBefore, list);
+ addDate(frame, dateNotAfter, list);
list.add(xArray.makeBooleanArrayHandle(abUsage, cUsage, Mutability.Constant));
- list.add(xString.makeHandle(sSigAlgName));
+ list.add(xString.makeHandle(frame, sSigAlgName));
list.add(xByteArray.makeByteArrayHandle(abSignature, Mutability.Constant));
- list.add(xString.makeHandle(sAlgorithm));
- list.add(xInt64.makeHandle(cKeyBits >>> 3));
+ list.add(xString.makeHandle(frame, sAlgorithm));
+ list.add(xInt64.makeHandle(frame, cKeyBits >>> 3));
list.add(xByteArray.makeByteArrayHandle(abPublic, Mutability.Constant));
- list.add(new SecretHandle(publicKey));
+ list.add(new SecretHandle(frame.f_context.f_container, publicKey));
list.add(xByteArray.makeByteArrayHandle(abDer, Mutability.Constant));
return frame.assignValues(aiReturn, list.toArray(Utils.OBJECTS_NONE));
@@ -357,13 +351,13 @@ private int invokeGetCertificateInfo(Frame frame, KeyStoreHandle hStore, StringH
}
}
- private static void addDate(Date date, List list) {
+ private static void addDate(Frame frame, Date date, List list) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
- list.add(xInt64.makeHandle(cal.get(Calendar.YEAR)));
- list.add(xInt64.makeHandle(cal.get(Calendar.MONTH) + 1));
- list.add(xInt64.makeHandle(cal.get(Calendar.DAY_OF_MONTH)));
+ list.add(xInt64.makeHandle(frame, cal.get(Calendar.YEAR)));
+ list.add(xInt64.makeHandle(frame, cal.get(Calendar.MONTH) + 1));
+ list.add(xInt64.makeHandle(frame, cal.get(Calendar.DAY_OF_MONTH)));
}
private static int getPublicKeyLength(PublicKey puk)
@@ -409,10 +403,10 @@ private int invokeEntryType(Frame frame, KeyStoreHandle hStore, StringHandle hNa
} else {
nType = 1; // Pair
}
- return frame.assignValues(aiReturn, xBoolean.TRUE, xInt64.makeHandle(nType));
+ return frame.assignValues(aiReturn, xBoolean.TRUE, xInt64.makeHandle(frame, nType));
}
if (keyStore.isCertificateEntry(sName)) {
- return frame.assignValues(aiReturn, xBoolean.TRUE, xInt64.makeHandle(1)); // Certificate
+ return frame.assignValues(aiReturn, xBoolean.TRUE, xInt64.makeHandle(frame, 1)); // Certificate
}
return frame.assignValue(aiReturn[0], xBoolean.FALSE);
} catch (GeneralSecurityException e) {
@@ -456,14 +450,14 @@ private int invokeGetKeyInfo(Frame frame, KeyStoreHandle hStore, StringHandle hN
List list = new ArrayList<>(9);
list.add(xBoolean.TRUE);
- list.add(xString.makeHandle(sAlgorithm));
- list.add(xInt64.makeHandle(cKeyBits >>> 3));
- list.add(new SecretHandle(key));
+ list.add(xString.makeHandle(frame, sAlgorithm));
+ list.add(xInt64.makeHandle(frame, cKeyBits >>> 3));
+ list.add(new SecretHandle(frame.f_context.f_container, key));
if (publicKey == null) {
list.add(xNullable.NULL);
list.add(xArray.ensureEmptyByteArray());
} else {
- list.add(new SecretHandle(publicKey));
+ list.add(new SecretHandle(frame.f_context.f_container, publicKey));
list.add(xArray.makeByteArrayHandle(abPublic, Mutability.Constant));
}
return frame.assignValues(aiReturn, list.toArray(Utils.OBJECTS_NONE));
@@ -485,13 +479,13 @@ private int invokeGetPasswordInfo(Frame frame, KeyStoreHandle hStore, StringHand
Key key = hStore.getKey(sName);
if (key instanceof PBEKey keyPwd) {
return frame.assignValues(aiReturn,
- xBoolean.TRUE, xString.makeHandle(keyPwd.getPassword()));
+ xBoolean.TRUE, xString.makeHandle(frame, keyPwd.getPassword()));
}
// unfortunately com.sun.crypto.provider.PBEKey is not public
if ("PBEKey".equals(key.getClass().getSimpleName())) {
return frame.assignValues(aiReturn, xBoolean.TRUE,
- xString.makeHandle(new String(key.getEncoded(), StandardCharsets.UTF_8)));
+ xString.makeHandle(frame, new String(key.getEncoded(), StandardCharsets.UTF_8)));
}
return frame.assignValue(aiReturn[0], xBoolean.FALSE);
} catch (GeneralSecurityException e) {
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/crypto/xRTSigner.java b/javatools/src/main/java/org/xvm/runtime/template/_native/crypto/xRTSigner.java
index af585413cf..3b23b76502 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/crypto/xRTSigner.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/crypto/xRTSigner.java
@@ -38,14 +38,8 @@
*/
public class xRTSigner
extends xService {
- public static xRTSigner INSTANCE;
-
public xRTSigner(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure, false);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/fs/xCPFileStore.java b/javatools/src/main/java/org/xvm/runtime/template/_native/fs/xCPFileStore.java
index d8a2255c63..8217e3331b 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/fs/xCPFileStore.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/fs/xCPFileStore.java
@@ -62,7 +62,7 @@ public int createConstHandle(Frame frame, Constant constant) {
GenericHandle hStruct = new GenericHandle(clz.ensureAccess(Access.STRUCT));
ObjectHandle[] ahVar = Utils.ensureSize(Utils.OBJECTS_NONE, s_constructor.getMaxVars());
- ahVar[0] = xString.makeHandle(constStore.getPath());
+ ahVar[0] = xString.makeHandle(frame, constStore.getPath());
ahVar[1] = new ConstantHandle(constStore.getValue());
return proceedConstruction(frame, s_constructor, true, hStruct, ahVar, Op.A_STACK);
@@ -99,10 +99,10 @@ public int invokeNativeNN(Frame frame, MethodStructure method, ObjectHandle hTar
ObjectHandle[] ahValue = new ObjectHandle[5];
ahValue[0] = xBoolean.makeHandle(constNode.getFormat() == Format.FSDir);
- ahValue[1] = xString.makeHandle(constNode.getName());
+ ahValue[1] = xString.makeHandle(frame, constNode.getName());
ahValue[2] = frame.getConstHandle(constNode.getCreatedConstant());
ahValue[3] = frame.getConstHandle(constNode.getModifiedConstant());
- ahValue[4] = xInt64.makeHandle(calcSize(constNode));
+ ahValue[4] = xInt64.makeHandle(frame, calcSize(constNode));
return new Utils.AssignValues(aiReturn, ahValue).proceed(frame);
}
@@ -117,7 +117,7 @@ public int invokeNativeNN(Frame frame, MethodStructure method, ObjectHandle hTar
ObjectHandle[] ahCookies = new ObjectHandle[cNodes];
for (int i = 0; i < cNodes; ++i) {
FSNodeConstant constEach = aNodes[i];
- ahNames [i] = xString.makeHandle(constEach.getName());
+ ahNames [i] = xString.makeHandle(frame, constEach.getName());
ahCookies[i] = new ConstantHandle(constEach);
}
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/fs/xOSDirectory.java b/javatools/src/main/java/org/xvm/runtime/template/_native/fs/xOSDirectory.java
index 3eb30f0d97..ba1d08045f 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/fs/xOSDirectory.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/fs/xOSDirectory.java
@@ -30,14 +30,8 @@
*/
public class xOSDirectory
extends xOSFileNode {
- public static xOSDirectory INSTANCE;
-
public xOSDirectory(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure, false);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/fs/xOSFile.java b/javatools/src/main/java/org/xvm/runtime/template/_native/fs/xOSFile.java
index 3630a0866f..62daa25c9c 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/fs/xOSFile.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/fs/xOSFile.java
@@ -53,14 +53,8 @@
*/
public class xOSFile
extends xOSFileNode {
- public static xOSFile INSTANCE;
-
public xOSFile(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure, false);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
@@ -487,7 +481,7 @@ private int invokeOpen(Frame frame, NodeHandle hFile, ObjectHandle[] ahArg, int
Path path = hFile.f_path;
try {
FileChannel channel = FileChannel.open(path, aOpenOpt);
- return xRawOSFileChannel.INSTANCE.createHandle(frame, channel, path, iReturn);
+ return nativeTemplates().get(xRawOSFileChannel.class).createHandle(frame, channel, path, iReturn);
} catch (IOException e) {
return raisePathException(frame, e, path);
}
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/fs/xOSFileNode.java b/javatools/src/main/java/org/xvm/runtime/template/_native/fs/xOSFileNode.java
index ad274e2fa9..f2b35bb716 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/fs/xOSFileNode.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/fs/xOSFileNode.java
@@ -56,7 +56,7 @@ public int invokeNativeGet(Frame frame, String sPropName, ObjectHandle hTarget,
NodeHandle hNode = (NodeHandle) hTarget;
switch (sPropName) {
case "pathString":
- return frame.assignValue(iReturn, xString.makeHandle(hNode.f_path.toString()));
+ return frame.assignValue(iReturn, xString.makeHandle(frame, hNode.f_path.toString()));
case "exists":
return frame.assignValue(iReturn, xBoolean.makeHandle(hNode.f_path.toFile().exists()));
@@ -70,7 +70,7 @@ public int invokeNativeGet(Frame frame, String sPropName, ObjectHandle hTarget,
case "createdMillis":
try {
BasicFileAttributes attr = Files.readAttributes(hNode.f_path, BasicFileAttributes.class);
- return frame.assignValue(iReturn, xInt64.makeHandle(attr.creationTime().toMillis()));
+ return frame.assignValue(iReturn, xInt64.makeHandle(frame, attr.creationTime().toMillis()));
} catch (IOException e) {
return raisePathException(frame, e, hNode.f_path);
}
@@ -78,7 +78,7 @@ public int invokeNativeGet(Frame frame, String sPropName, ObjectHandle hTarget,
case "accessedMillis":
try {
BasicFileAttributes attr = Files.readAttributes(hNode.f_path, BasicFileAttributes.class);
- return frame.assignValue(iReturn, xInt64.makeHandle(attr.lastAccessTime().toMillis()));
+ return frame.assignValue(iReturn, xInt64.makeHandle(frame, attr.lastAccessTime().toMillis()));
} catch (IOException e) {
return raisePathException(frame, e, hNode.f_path);
}
@@ -86,7 +86,7 @@ public int invokeNativeGet(Frame frame, String sPropName, ObjectHandle hTarget,
case "modifiedMillis":
try {
BasicFileAttributes attr = Files.readAttributes(hNode.f_path, BasicFileAttributes.class);
- return frame.assignValue(iReturn, xInt64.makeHandle(attr.lastModifiedTime().toMillis()));
+ return frame.assignValue(iReturn, xInt64.makeHandle(frame, attr.lastModifiedTime().toMillis()));
} catch (IOException e) {
return raisePathException(frame, e, hNode.f_path);
}
@@ -96,9 +96,9 @@ public int invokeNativeGet(Frame frame, String sPropName, ObjectHandle hTarget,
Path path = hNode.f_path;
if (Files.exists(path)) {
BasicFileAttributes attr = Files.readAttributes(path, BasicFileAttributes.class);
- return frame.assignValue(iReturn, xInt64.makeHandle(attr.size()));
+ return frame.assignValue(iReturn, xInt64.makeHandle(frame, attr.size()));
} else {
- return frame.assignValue(iReturn, xInt64.makeHandle(0));
+ return frame.assignValue(iReturn, xInt64.makeHandle(frame, 0));
}
} catch (IOException e) {
return raisePathException(frame, e, hNode.f_path);
@@ -121,8 +121,10 @@ public int invokeNativeGet(Frame frame, String sPropName, ObjectHandle hTarget,
*/
static int createHandle(Frame frame, ObjectHandle hOSStore, Path path, boolean fDir, int iReturn) {
return fDir
- ? xOSDirectory.INSTANCE.createHandle(frame, hOSStore, path, iReturn)
- : xOSFile .INSTANCE.createHandle(frame, hOSStore, path, iReturn);
+ ? frame.f_context.f_container.nativeTemplates().get(xOSDirectory.class).
+ createHandle(frame, hOSStore, path, iReturn)
+ : frame.f_context.f_container.nativeTemplates().get(xOSFile.class).
+ createHandle(frame, hOSStore, path, iReturn);
}
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/fs/xOSFileStore.java b/javatools/src/main/java/org/xvm/runtime/template/_native/fs/xOSFileStore.java
index d2e1046164..a0116ddb55 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/fs/xOSFileStore.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/fs/xOSFileStore.java
@@ -69,13 +69,13 @@ protected int postValidate(Frame frame, ObjectHandle hStruct) {
public int invokeNativeGet(Frame frame, String sPropName, ObjectHandle hTarget, int iReturn) {
switch (sPropName) {
case "capacity":
- return frame.assignValue(iReturn, xInt64.makeHandle(ROOT.getTotalSpace()));
+ return frame.assignValue(iReturn, xInt64.makeHandle(frame, ROOT.getTotalSpace()));
case "bytesFree":
- return frame.assignValue(iReturn, xInt64.makeHandle(ROOT.getFreeSpace()));
+ return frame.assignValue(iReturn, xInt64.makeHandle(frame, ROOT.getFreeSpace()));
case "bytesUsed":
- return frame.assignValue(iReturn, xInt64.makeHandle(ROOT.getTotalSpace() - ROOT.getFreeSpace()));
+ return frame.assignValue(iReturn, xInt64.makeHandle(frame, ROOT.getTotalSpace() - ROOT.getFreeSpace()));
}
return super.invokeNativeGet(frame, sPropName, hTarget, iReturn);
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/fs/xOSStorage.java b/javatools/src/main/java/org/xvm/runtime/template/_native/fs/xOSStorage.java
index c5b1e70878..ded10b9039 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/fs/xOSStorage.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/fs/xOSStorage.java
@@ -89,15 +89,15 @@ public int invokeNativeGet(Frame frame, String sPropName, ObjectHandle hTarget,
// the handles below are cached by the Container.initResources()
switch (sPropName) {
case "homeDir":
- return xOSDirectory.INSTANCE.createHandle(frame, hStore,
+ return nativeTemplates().get(xOSDirectory.class).createHandle(frame, hStore,
Paths.get(System.getProperty("user.home")), iReturn);
case "curDir":
- return xOSDirectory.INSTANCE.createHandle(frame, hStore,
+ return nativeTemplates().get(xOSDirectory.class).createHandle(frame, hStore,
Paths.get(System.getProperty("user.dir")), iReturn);
case "tmpDir":
- return xOSDirectory.INSTANCE.createHandle(frame, hStore,
+ return nativeTemplates().get(xOSDirectory.class).createHandle(frame, hStore,
Paths.get(System.getProperty("java.io.tmpdir")), iReturn);
}
return super.invokeNativeGet(frame, sPropName, hTarget, iReturn);
@@ -109,7 +109,7 @@ public int invokeNative1(Frame frame, MethodStructure method, ObjectHandle hTarg
ServiceHandle hStorage = (ServiceHandle) hTarget;
if (frame.f_context != hStorage.f_context) {
- return xRTFunction.makeAsyncNativeHandle(method).
+ return xRTFunction.makeAsyncNativeHandle(frame.f_context.f_container, method).
call1(frame, hTarget, new ObjectHandle[] {hArg}, iReturn);
}
@@ -124,7 +124,7 @@ public int invokeNative1(Frame frame, MethodStructure method, ObjectHandle hTarg
return cNames == 0
? frame.assignValue(iReturn, xString.ensureEmptyArray())
- : frame.assignValue(iReturn, xString.makeArrayHandle(asName));
+ : frame.assignValue(iReturn, xString.makeArrayHandle(frame.f_context.f_container, asName));
} catch (InvalidPathException e) {
return frame.raiseException(xException.ioException(frame, e.getMessage()));
}
@@ -205,7 +205,8 @@ public int invokeNativeN(Frame frame, MethodStructure method, ObjectHandle hTarg
if (hStorage != null && frame.f_context != hStorage.f_context) {
// for now let's make sure all the calls are processed on the service fibers
- return xRTFunction.makeAsyncNativeHandle(method).call1(frame, hTarget, ahArg, iReturn);
+ return xRTFunction.makeAsyncNativeHandle(frame.f_context.f_container, method).
+ call1(frame, hTarget, ahArg, iReturn);
}
switch (method.getName()) {
@@ -223,7 +224,8 @@ public int invokeNativeNN(Frame frame, MethodStructure method, ObjectHandle hTar
if (frame.f_context != hStorage.f_context) {
// for now let's make sure all the calls are processed on the service fibers
- return xRTFunction.makeAsyncNativeHandle(method).callN(frame, hTarget, ahArg, aiReturn);
+ return xRTFunction.makeAsyncNativeHandle(frame.f_context.f_container, method).
+ callN(frame, hTarget, ahArg, aiReturn);
}
switch (method.getName()) {
@@ -318,14 +320,17 @@ protected void processKey(WatchKey key) {
Path pathRelative = (Path) event.context();
Path pathAbsolute = pathDir.resolve(pathRelative);
- FunctionHandle hfnOnEvent =
- xRTFunction.makeInternalHandle(null, s_methodOnEvent).bindTarget(null, context.hStorage);
+ FunctionHandle hfnOnEvent = xRTFunction.makeInternalHandle(
+ context.hStorage.f_context.f_container, s_methodOnEvent).
+ bindTarget(null, context.hStorage);
- StringHandle hPathDir = xString.makeHandle(pathDir.toString());
- StringHandle hPathNode = xString.makeHandle(pathAbsolute.toString());
+ Container container = context.hStorage.f_context.f_container;
+ StringHandle hPathDir = xString.makeHandle(container, pathDir.toString());
+ StringHandle hPathNode = xString.makeHandle(container, pathAbsolute.toString());
ObjectHandle[] ahArg = new ObjectHandle[] {
- hPathDir, hPathNode, xBoolean.TRUE, xInt64.makeHandle(iKind)
+ hPathDir, hPathNode, xBoolean.TRUE,
+ xInt64.makeHandle(context.hStorage.f_context.f_container, iKind)
};
context.hStorage.f_context.callLater(hfnOnEvent, ahArg);
}
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/fs/xRawOSFileChannel.java b/javatools/src/main/java/org/xvm/runtime/template/_native/fs/xRawOSFileChannel.java
index 7940ff94e2..46d1fe97a4 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/fs/xRawOSFileChannel.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/fs/xRawOSFileChannel.java
@@ -47,14 +47,8 @@
*/
public class xRawOSFileChannel
extends xRawChannel {
- public static xRawOSFileChannel INSTANCE;
-
public xRawOSFileChannel(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
@@ -84,14 +78,14 @@ public int invokeNativeGet(Frame frame, String sPropName, ObjectHandle hTarget,
switch (sPropName) {
case "size":
try {
- return frame.assignValue(iReturn, xInt64.makeHandle(hChannel.f_channel.size()));
+ return frame.assignValue(iReturn, xInt64.makeHandle(frame, hChannel.f_channel.size()));
} catch (IOException e) {
return xOSFileNode.raisePathException(frame, e, hChannel.f_path);
}
case "position":
try {
- return frame.assignValue(iReturn, xInt64.makeHandle(hChannel.f_channel.position()));
+ return frame.assignValue(iReturn, xInt64.makeHandle(frame, hChannel.f_channel.position()));
} catch (IOException e) {
return xOSFileNode.raisePathException(frame, e, hChannel.f_path);
}
@@ -198,7 +192,7 @@ protected int invokeTake(Frame frame, ChannelHandle hChannel, int iReturn) {
try {
int cbRead = cfRead.get().intValue();
return frameCaller.assignValue(iReturn, cbRead < 0
- ? xInt64.makeHandle(-1)
+ ? xInt64.makeHandle(frame, -1)
: xArray.makeByteArrayHandle(buffer.array(), cbRead, Mutability.Constant));
} catch (InterruptedException | ExecutionException e) {
return xOSFileNode.raisePathException(frameCaller, e, hChannel.f_path);
@@ -213,7 +207,7 @@ protected int invokeTake(Frame frame, ChannelHandle hChannel, int iReturn) {
*/
protected int invokeSubmit(Frame frame, ChannelHandle hChannel, ObjectHandle[] ahArg, int iReturn) {
if (!hChannel.f_channel.isOpen()) {
- return frame.assignValue(iReturn, xInt64.makeHandle(-1)); // closed
+ return frame.assignValue(iReturn, xInt64.makeHandle(frame, -1)); // closed
}
ArrayHandle hArray = (ArrayHandle) ahArg[0];
@@ -232,7 +226,7 @@ protected int invokeSubmit(Frame frame, ChannelHandle hChannel, ObjectHandle[] a
frame.f_context.f_container.scheduleIO(task); // don't wait
- return frame.assignValue(iReturn, xInt64.makeHandle(0)); // OK
+ return frame.assignValue(iReturn, xInt64.makeHandle(frame, 0)); // OK
}
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/io/xRTBuffer.java b/javatools/src/main/java/org/xvm/runtime/template/_native/io/xRTBuffer.java
index ba948f8e77..1fe59795e1 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/io/xRTBuffer.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/io/xRTBuffer.java
@@ -23,14 +23,8 @@
*/
public class xRTBuffer
extends ClassTemplate {
- public static xRTBuffer INSTANCE;
-
public xRTBuffer(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/io/xTerminalConsole.java b/javatools/src/main/java/org/xvm/runtime/template/_native/io/xTerminalConsole.java
index dff0274a4e..6c4006eda7 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/io/xTerminalConsole.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/io/xTerminalConsole.java
@@ -46,14 +46,8 @@
*/
public class xTerminalConsole
extends xService {
- public static xTerminalConsole INSTANCE;
-
public xTerminalConsole(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure, false);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
@@ -139,19 +133,19 @@ protected int invokeReadLine(Frame frame, ObjectHandle[] ahArg, int iReturn) {
String sLine = CONSOLE_IN.readLine();
hLine = sLine == null
? xString.EMPTY_STRING
- : xString.makeHandle(sLine);
+ : xString.makeHandle(frame, sLine);
} else {
char[] achLine = CONSOLE.readPassword();
hLine = achLine == null
? xString.EMPTY_STRING
- : xString.makeHandle(achLine);
+ : xString.makeHandle(frame, achLine);
}
} catch (IOException e) {
return frame.raiseException(xException.obscureIoException(frame, e.getMessage()));
}
} else {
try {
- hLine = xString.makeHandle(READER.readLine(sPrompt, fEcho ? null : '\0'));
+ hLine = xString.makeHandle(frame, READER.readLine(sPrompt, fEcho ? null : '\0'));
} catch (UserInterruptException e) {
System.exit(0);
return 0; // not reachable
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/lang/src/xRTCompiler.java b/javatools/src/main/java/org/xvm/runtime/template/_native/lang/src/xRTCompiler.java
index 3566e0bc0b..92050f28d5 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/lang/src/xRTCompiler.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/lang/src/xRTCompiler.java
@@ -64,14 +64,8 @@
*/
public class xRTCompiler
extends xService {
- public static xRTCompiler INSTANCE;
-
public xRTCompiler(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure, false);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
@@ -164,7 +158,7 @@ private int doCompile(Frame frame, CompilerAdapter compiler,
return completeWithError(frame, compiler, sMissing, aiReturn);
}
CallChain chain = computeGetModuleChain(frame, hRepo);
- switch (chain.invoke(frame, hRepo, xString.makeHandle(sMissing), STACK_2)) {
+ switch (chain.invoke(frame, hRepo, xString.makeHandle(frame, sMissing), STACK_2)) {
case Op.R_NEXT:
return popModuleStructure(frame, compiler)
? doCompile(frame, compiler, hRepo, sMissing, aiReturn)
@@ -265,7 +259,7 @@ private int completeCompilation(Frame frame, CompilerAdapter compiler,
haErrors = xString.ensureEmptyArray();
} else {
haTemplates = xArray.makeArrayHandle(clzArray, 0, Utils.OBJECTS_NONE, Mutability.Constant);
- haErrors = xString.makeArrayHandle(listErrors.toArray(Utils.NO_NAMES));
+ haErrors = xString.makeArrayHandle(frame.f_context.f_container, listErrors.toArray(Utils.NO_NAMES));
}
compiler.reset();
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/mgmt/xContainerControl.java b/javatools/src/main/java/org/xvm/runtime/template/_native/mgmt/xContainerControl.java
index 25bf7ec28f..71cad4273a 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/mgmt/xContainerControl.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/mgmt/xContainerControl.java
@@ -38,14 +38,8 @@
*/
public class xContainerControl
extends xRTServiceControl {
- public static xContainerControl INSTANCE;
-
public xContainerControl(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure, false);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/mgmt/xContainerLinker.java b/javatools/src/main/java/org/xvm/runtime/template/_native/mgmt/xContainerLinker.java
index ded5e12c3d..222b2f4d86 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/mgmt/xContainerLinker.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/mgmt/xContainerLinker.java
@@ -50,14 +50,8 @@
*/
public class xContainerLinker
extends xService {
- public static xContainerLinker INSTANCE;
-
public xContainerLinker(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure, false);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
@@ -159,7 +153,7 @@ private int invokeCollectInjections(Frame frame, ObjectHandle[] ahArg, int[] aiR
TypeHandle[] ahType = new TypeHandle[cInjects];
int ix = 0;
for (InjectionKey key : setInjections) {
- ahName[ix ] = xString.makeHandle(key.f_sName);
+ ahName[ix ] = xString.makeHandle(frame, key.f_sName);
ahType[ix++] = key.f_type.ensureTypeHandle(container);
}
ArrayHandle haNames = xArray.makeStringArrayHandle(ahName);
@@ -214,7 +208,7 @@ private int invokeResolveAndLink(Frame frame, ObjectHandle[] ahArg, int iReturn)
return frame.raiseException(e);
}
- switch (xRTFileTemplate.INSTANCE.invokeResolve(frame, file, hRepo,
+ switch (nativeTemplates().get(xRTFileTemplate.class).invokeResolve(frame, file, hRepo,
ahShared, ahAdditional, Op.A_STACK)) {
case Op.R_NEXT:
return completeResolveAndLink(frame, container, popModule(frame),
@@ -278,7 +272,7 @@ public int doNext(Frame frameCaller) {
while (++index < aKeys.length) {
InjectionKey key = aKeys[index];
TypeHandle hType = key.f_type.ensureTypeHandle(container);
- StringHandle hName = xString.makeHandle(key.f_sName);
+ StringHandle hName = xString.makeHandle(frameCaller, key.f_sName);
CallChain chain = hProvider.getComposition().getMethodCallChain(GET_RESOURCE);
ObjectHandle[] ahArg = new ObjectHandle[chain.getMaxVars()];
@@ -304,7 +298,8 @@ public int doNext(Frame frameCaller) {
}
return frameCaller.assignValue(iReturn,
- xContainerControl.INSTANCE.makeHandle(container));
+ frameCaller.f_context.f_container.nativeTemplates().
+ get(xContainerControl.class).makeHandle(container));
}
private final NestedContainer container;
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/mgmt/xCoreRepository.java b/javatools/src/main/java/org/xvm/runtime/template/_native/mgmt/xCoreRepository.java
index 3be07be591..d9641d68ec 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/mgmt/xCoreRepository.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/mgmt/xCoreRepository.java
@@ -33,14 +33,8 @@
*/
public class xCoreRepository
extends ClassTemplate {
- public static xCoreRepository INSTANCE;
-
public xCoreRepository(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
@@ -68,7 +62,7 @@ public int invokeNativeGet(Frame frame, String sPropName, ObjectHandle hTarget,
ModuleRepository repo = f_container.getModuleRepository();
Set setNames = repo.getModuleNames();
- ArrayHandle hArray = xString.makeArrayHandle(setNames.toArray(Utils.NO_NAMES));
+ ArrayHandle hArray = xString.makeArrayHandle(frame.f_context.f_container, setNames.toArray(Utils.NO_NAMES));
return xArray.createListSet(frame, hArray, iReturn);
}
}
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/net/xRTNameService.java b/javatools/src/main/java/org/xvm/runtime/template/_native/net/xRTNameService.java
index e76637353b..cc1b145964 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/net/xRTNameService.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/net/xRTNameService.java
@@ -50,14 +50,8 @@
*/
public class xRTNameService
extends xService {
- public static xRTNameService INSTANCE;
-
public xRTNameService(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure, false);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
@@ -92,7 +86,8 @@ public int invokeNative1(Frame frame, MethodStructure method, ObjectHandle hTarg
if (frame.f_context != hService.f_context) {
// for now let's make sure all the calls are processed on the service fibers
- return xRTFunction.makeAsyncNativeHandle(method).call1(frame, hTarget, ahArg, iReturn);
+ return xRTFunction.makeAsyncNativeHandle(frame.f_context.f_container, method).
+ call1(frame, hTarget, ahArg, iReturn);
}
switch (method.getName()) {
@@ -106,7 +101,7 @@ public int invokeNative1(Frame frame, MethodStructure method, ObjectHandle hTarg
Frame.Continuation continuation = frameCaller -> {
try {
return frameCaller.assignValue(iReturn,
- xString.makeArrayHandle(cfRecords.get()));
+ xString.makeArrayHandle(frame.f_context.f_container, cfRecords.get()));
} catch (Throwable e) {
return frameCaller.raiseException(
xException.obscureIoException(frameCaller, exceptionMessage(e)));
@@ -126,7 +121,8 @@ public int invokeNativeNN(Frame frame, MethodStructure method, ObjectHandle hTar
if (frame.f_context != hService.f_context) {
// for now let's make sure all the calls are processed on the service fibers
- return xRTFunction.makeAsyncNativeHandle(method).callN(frame, hTarget, ahArg, aiReturn);
+ return xRTFunction.makeAsyncNativeHandle(frame.f_context.f_container, method).
+ callN(frame, hTarget, ahArg, aiReturn);
}
switch (method.getName()) {
@@ -176,7 +172,7 @@ public int invokeNativeNN(Frame frame, MethodStructure method, ObjectHandle hTar
String sNotName = addr.getHostAddress();
if (sName != null && !sName.isEmpty() && !sName.equals(sNotName)) {
return frameCaller.assignValues(aiReturn,
- xBoolean.TRUE, xString.makeHandle(sName));
+ xBoolean.TRUE, xString.makeHandle(frame, sName));
}
} catch (Exception ignore) {
// REVIEW CP: do we want to report the reason somehow?
@@ -196,7 +192,7 @@ public int invokeNativeNN(Frame frame, MethodStructure method, ObjectHandle hTar
// ----- helpers ------------------------------------------------------------------------------
static TypeComposition ensureByteArrayArrayComposition(Container container) {
- return container.ensureClassComposition(BYTE_ARRAY_ARRAY_TYPE, xArray.INSTANCE);
+ return container.ensureClassComposition(BYTE_ARRAY_ARRAY_TYPE, container.nativeTemplates().get(xArray.class));
}
static String[] getAllRecords(String sName)
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/net/xRTNetwork.java b/javatools/src/main/java/org/xvm/runtime/template/_native/net/xRTNetwork.java
index bea71e09c0..d386f4c8ba 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/net/xRTNetwork.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/net/xRTNetwork.java
@@ -36,14 +36,8 @@
*/
public class xRTNetwork
extends xService {
- public static xRTNetwork INSTANCE;
-
public xRTNetwork(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure, false);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
@@ -91,7 +85,8 @@ public int invokeNativeN(Frame frame, MethodStructure method,
if (frame.f_context != hService.f_context) {
// for now let's make sure all the calls are processed on the service fibers
- return xRTFunction.makeAsyncNativeHandle(method).call1(frame, hTarget, ahArg, iReturn);
+ return xRTFunction.makeAsyncNativeHandle(frame.f_context.f_container, method).
+ call1(frame, hTarget, ahArg, iReturn);
}
switch (method.getName()) {
@@ -109,7 +104,8 @@ public int invokeNativeNN(Frame frame, MethodStructure method, ObjectHandle hTar
if (frame.f_context != hService.f_context) {
// for now let's make sure all the calls are processed on the service fibers
- return xRTFunction.makeAsyncNativeHandle(method).callN(frame, hTarget, ahArg, aiReturn);
+ return xRTFunction.makeAsyncNativeHandle(frame.f_context.f_container, method).
+ callN(frame, hTarget, ahArg, aiReturn);
}
switch (method.getName()) {
@@ -199,7 +195,7 @@ public boolean isSecure(Frame frame, ServiceHandle hNetwork) {
* @return one of Op.R_NEXT, Op.R_CALL or Op.R_EXCEPTION values
*/
protected int instantiateNameService(Frame frame, ServiceHandle hNetwork, int iReturn) {
- ClassTemplate templateSvc = xRTNameService.INSTANCE;
+ ClassTemplate templateSvc = nativeTemplates().get(xRTNameService.class);
ClassComposition clz = templateSvc.getCanonicalClass();
MethodStructure constructor = templateSvc.getStructure().findConstructor(getCanonicalType());
ObjectHandle[] ahParams = new ObjectHandle[constructor.getMaxVars()];
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/net/xRTNetworkInterface.java b/javatools/src/main/java/org/xvm/runtime/template/_native/net/xRTNetworkInterface.java
index 5451188df6..0fd8714070 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/net/xRTNetworkInterface.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/net/xRTNetworkInterface.java
@@ -28,14 +28,8 @@
*/
public class xRTNetworkInterface
extends xService {
- public static xRTNetworkInterface INSTANCE;
-
public xRTNetworkInterface(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure, false);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
@@ -78,7 +72,8 @@ public int invokeNativeNN(Frame frame, MethodStructure method, ObjectHandle hTar
if (frame.f_context != hService.f_context) {
// for now let's make sure all the calls are processed on the service fibers
- return xRTFunction.makeAsyncNativeHandle(method).callN(frame, hTarget, ahArg, aiReturn);
+ return xRTFunction.makeAsyncNativeHandle(frame.f_context.f_container, method).
+ callN(frame, hTarget, ahArg, aiReturn);
}
switch (method.getName()) {
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/net/xRTSocket.java b/javatools/src/main/java/org/xvm/runtime/template/_native/net/xRTSocket.java
index f23e81a151..3ad989f8d5 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/net/xRTSocket.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/net/xRTSocket.java
@@ -51,16 +51,10 @@
*/
public class xRTSocket
extends xService {
- public static xRTSocket INSTANCE;
-
public static final int CONNECT_TIMEOUT_MS = 15_000;
public xRTSocket(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure, false);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
@@ -108,7 +102,7 @@ public int invokeNative1(Frame frame, MethodStructure method, ObjectHandle hTarg
}
if (frame.f_context != hSocket.f_context) {
- return xRTFunction.makeAsyncNativeHandle(method).
+ return xRTFunction.makeAsyncNativeHandle(frame.f_context.f_container, method).
call1(frame, hTarget, new ObjectHandle[] {hArg}, iReturn);
}
@@ -129,7 +123,8 @@ public int invokeNativeN(Frame frame, MethodStructure method,
}
if (frame.f_context != hSocket.f_context) {
- return xRTFunction.makeAsyncNativeHandle(method).call1(frame, hTarget, ahArg, iReturn);
+ return xRTFunction.makeAsyncNativeHandle(frame.f_context.f_container, method).
+ call1(frame, hTarget, ahArg, iReturn);
}
switch (method.getName()) {
@@ -175,7 +170,8 @@ public static int connect(Frame frame, byte[] abRemoteIP, int nRemotePort,
InetAddress local = socket.getLocalAddress();
byte[] abLocal = local == null ? new byte[0] : local.getAddress();
int nLocal = socket.getLocalPort();
- return INSTANCE.constructSocket(frameCaller, socket, abLocal, nLocal,
+ return frame.f_context.f_container.nativeTemplates().get(xRTSocket.class).
+ constructSocket(frameCaller, socket, abLocal, nLocal,
abRemoteIP, nRemotePort, aiReturn);
} catch (Throwable e) {
Throwable cause = unwrap(e);
@@ -228,9 +224,9 @@ protected int constructSocket(Frame frame, Socket socket, byte[] abLocal, int nL
pool.typeByteArray(), pool.typeUInt16());
ObjectHandle[] ahParams = new ObjectHandle[constructor.getMaxVars()];
ahParams[0] = xArray.makeByteArrayHandle(abLocal, Mutability.Constant);
- ahParams[1] = xUInt16.INSTANCE.makeJavaLong(nLocalPort);
+ ahParams[1] = nativeTemplates().get(xUInt16.class).makeJavaLong(nLocalPort);
ahParams[2] = xArray.makeByteArrayHandle(abRemote, Mutability.Constant);
- ahParams[3] = xUInt16.INSTANCE.makeJavaLong(nRemotePort);
+ ahParams[3] = nativeTemplates().get(xUInt16.class).makeJavaLong(nRemotePort);
switch (template.construct(frame, constructor, clz, null, ahParams, Op.A_STACK)) {
case Op.R_NEXT:
@@ -358,13 +354,13 @@ private static int invokeWriteBytesImpl(Frame frame, SocketHandle hSocket, Objec
private static int invokeAvailableImpl(Frame frame, SocketHandle hSocket, int iReturn) {
Socket socket = hSocket.socket;
if (socket == null || socket.isClosed()) {
- return frame.assignValue(iReturn, xInt64.INSTANCE.makeJavaLong(0));
+ return frame.assignValue(iReturn, xInt64.makeHandle(frame, 0));
}
try {
int n = socket.getInputStream().available();
- return frame.assignValue(iReturn, xInt64.INSTANCE.makeJavaLong(Math.max(n, 0)));
+ return frame.assignValue(iReturn, xInt64.makeHandle(frame, Math.max(n, 0)));
} catch (IOException e) {
- return frame.assignValue(iReturn, xInt64.INSTANCE.makeJavaLong(0));
+ return frame.assignValue(iReturn, xInt64.makeHandle(frame, 0));
}
}
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/numbers/xRTRandom.java b/javatools/src/main/java/org/xvm/runtime/template/_native/numbers/xRTRandom.java
index 71c79ea3db..31041c49f9 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/numbers/xRTRandom.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/numbers/xRTRandom.java
@@ -48,14 +48,8 @@
*/
public class xRTRandom
extends xService {
- public static xRTRandom INSTANCE;
-
public xRTRandom(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure, false);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
@@ -151,42 +145,49 @@ public int invokeNativeN(Frame frame, MethodStructure method,
return frame.assignValue(iReturn, xBit.makeHandle(rnd(hTarget).nextBoolean()));
case "nibble":
- return frame.assignValue(iReturn, xNibble.makeHandle(rnd(hTarget).nextInt()));
+ return frame.assignValue(iReturn, xNibble.makeHandle(frame, rnd(hTarget).nextInt()));
case "int8":
- return frame.assignValue(iReturn, xInt8.INSTANCE.makeJavaLong(rnd(hTarget).nextInt()));
+ return frame.assignValue(iReturn, nativeTemplates().get(xInt8.class).makeJavaLong(rnd(hTarget).nextInt()));
case "int16":
- return frame.assignValue(iReturn, xInt16.INSTANCE.makeJavaLong(rnd(hTarget).nextInt()));
+ return frame.assignValue(iReturn, nativeTemplates().get(xInt16.class).makeJavaLong(rnd(hTarget).nextInt()));
case "int32":
- return frame.assignValue(iReturn, xInt32.INSTANCE.makeJavaLong(rnd(hTarget).nextInt()));
+ return frame.assignValue(iReturn, nativeTemplates().get(xInt32.class).makeJavaLong(rnd(hTarget).nextInt()));
case "int64":
- return frame.assignValue(iReturn, xInt64.INSTANCE.makeJavaLong(rnd(hTarget).nextLong()));
+ return frame.assignValue(iReturn,
+ nativeTemplates().get(xInt64.class).makeJavaLong(rnd(hTarget).nextLong()));
case "uint8":
- return frame.assignValue(iReturn, xUInt8.INSTANCE.makeJavaLong(rnd(hTarget).nextInt()));
+ return frame.assignValue(iReturn, nativeTemplates().get(xUInt8.class).makeJavaLong(rnd(hTarget).nextInt()));
case "uint16":
- return frame.assignValue(iReturn, xUInt16.INSTANCE.makeJavaLong(rnd(hTarget).nextInt()));
+ return frame.assignValue(iReturn,
+ nativeTemplates().get(xUInt16.class).makeJavaLong(rnd(hTarget).nextInt()));
case "uint32":
- return frame.assignValue(iReturn, xUInt32.INSTANCE.makeJavaLong(rnd(hTarget).nextInt()));
+ return frame.assignValue(iReturn,
+ nativeTemplates().get(xUInt32.class).makeJavaLong(rnd(hTarget).nextInt()));
case "uint64":
- return frame.assignValue(iReturn, xUInt64.INSTANCE.makeJavaLong(rnd(hTarget).nextLong()));
+ return frame.assignValue(iReturn,
+ nativeTemplates().get(xUInt64.class).makeJavaLong(rnd(hTarget).nextLong()));
case "dec64":
// Float64 has more precision than Dec64, so this should work fine, although there
// won't be as solid of a guarantee on a perfect distribution of random values
- return frame.assignValue(iReturn, xDec64.INSTANCE.makeHandle(rnd(hTarget).nextDouble()));
+ return frame.assignValue(iReturn,
+ nativeTemplates().get(xDec64.class).makeHandle(rnd(hTarget).nextDouble()));
case "float32":
- return frame.assignValue(iReturn, xFloat32.INSTANCE.makeHandle(rnd(hTarget).nextFloat()));
+ return frame.assignValue(iReturn,
+ nativeTemplates().get(xFloat32.class).makeHandle(rnd(hTarget).nextFloat()));
case "float64":
- return frame.assignValue(iReturn, xFloat64.INSTANCE.makeHandle(rnd(hTarget).nextDouble()));
+ return frame.assignValue(iReturn,
+ nativeTemplates().get(xFloat64.class).makeHandle(rnd(hTarget).nextDouble()));
}
return super.invokeNativeN(frame, method, hTarget, ahArg, iReturn);
@@ -242,7 +243,7 @@ protected int invokeInt(Frame frame, ObjectHandle hTarget, ObjectHandle hArg, in
"Illegal exclusive maximum (" + lMax +"); maximum must be > 0"));
}
- return frame.assignValue(iReturn, xInt64.makeHandle(computeRandom(rnd, lMax)));
+ return frame.assignValue(iReturn, xInt64.makeHandle(frame, computeRandom(rnd, lMax)));
}
/**
diff --git a/javatools/src/main/java/org/xvm/runtime/template/_native/reflect/xRTClassTemplate.java b/javatools/src/main/java/org/xvm/runtime/template/_native/reflect/xRTClassTemplate.java
index 50baaeff3f..83a19a210c 100644
--- a/javatools/src/main/java/org/xvm/runtime/template/_native/reflect/xRTClassTemplate.java
+++ b/javatools/src/main/java/org/xvm/runtime/template/_native/reflect/xRTClassTemplate.java
@@ -49,19 +49,13 @@
*/
public class xRTClassTemplate
extends xRTComponentTemplate {
- public static xRTClassTemplate INSTANCE;
-
public xRTClassTemplate(Container container, ClassStructure structure, boolean fInstance) {
super(container, structure, false);
-
- if (fInstance) {
- INSTANCE = this;
- }
}
@Override
public void initNative() {
- if (this == INSTANCE) {
+ if (isNativeInstance(xRTClassTemplate.class)) {
ConstantPool pool = f_container.getConstantPool();
ACTION_TEMPLATE = (xEnum) f_container.getTemplate("reflect.ClassTemplate.Composition.Action");
@@ -183,7 +177,7 @@ public int getPropertyImplicitName(Frame frame, ComponentTemplateHandle hCompone
if (id instanceof ClassConstant idClz) {
String sAlias = idClz.getImplicitImportName();
if (sAlias != null) {
- return frame.assignValue(iReturn, xString.makeHandle(sAlias));
+ return frame.assignValue(iReturn, xString.makeHandle(frame, sAlias));
}
}
return frame.assignValue(iReturn, xNullable.NULL);
@@ -277,7 +271,7 @@ public int getPropertyContribs(Frame frame, ComponentTemplateHandle hComponent,
for (int i = 0; i < cParams; i++) {
Parameter param = ctor.getParam(i);
- ahNames[i] = xString.makeHandle(param.getName());
+ ahNames[i] = xString.makeHandle(container, param.getName());
if (ahParam[i] == null) {
if (!param.hasDefaultValue()) {
return frameCaller.raiseException(
@@ -332,7 +326,7 @@ public int getPropertyContribs(Frame frame, ComponentTemplateHandle hComponent,
TypeConstant type = entry.getValue();
// use Type