Skip to content

Commit

Permalink
Better error reporting for invalid native objects in pre-initialized …
Browse files Browse the repository at this point in the history
…context.
  • Loading branch information
rschatz committed Feb 5, 2018
1 parent 7ad70ed commit 5d4b884
Show file tree
Hide file tree
Showing 10 changed files with 69 additions and 75 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
/*
* Copyright (c) 2018, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package com.oracle.svm.truffle.nfi;

import com.oracle.graal.pointsto.constraints.UnsupportedFeatureException;
import java.util.IdentityHashMap;
import java.util.function.Function;
import org.graalvm.nativeimage.Feature.DuringSetupAccess;

/**
* Fields that contain native pointers can not be part of the image heap, because the native
* pointers refer to allocations from the image builder, and are not valid anymore at runtime.
*/
public final class NativeObjectReplacer implements Function<Object, Object> {

private final IdentityHashMap<Class<?>, Object> disallowedClasses;

NativeObjectReplacer(DuringSetupAccess access) {
disallowedClasses = new IdentityHashMap<>(15);
disallowedClasses.put(access.findClassByName("com.oracle.truffle.nfi.impl.ClosureNativePointer"), Boolean.FALSE);
disallowedClasses.put(access.findClassByName("com.oracle.truffle.nfi.impl.ClosureNativePointer$NativeDestructor"), Boolean.FALSE);
disallowedClasses.put(access.findClassByName("com.oracle.truffle.nfi.impl.LibFFILibrary"), Boolean.FALSE);
disallowedClasses.put(access.findClassByName("com.oracle.truffle.nfi.impl.LibFFISignature"), Boolean.FALSE);
disallowedClasses.put(access.findClassByName("com.oracle.truffle.nfi.impl.LibFFISymbol"), Boolean.FALSE);
disallowedClasses.put(access.findClassByName("com.oracle.truffle.nfi.impl.LibFFIType$ArrayType"), Boolean.FALSE);
disallowedClasses.put(access.findClassByName("com.oracle.truffle.nfi.impl.LibFFIType$ClosureType"), Boolean.FALSE);
disallowedClasses.put(access.findClassByName("com.oracle.truffle.nfi.impl.LibFFIType$EnvType"), Boolean.FALSE);
disallowedClasses.put(access.findClassByName("com.oracle.truffle.nfi.impl.LibFFIType$ObjectType"), Boolean.FALSE);
disallowedClasses.put(access.findClassByName("com.oracle.truffle.nfi.impl.LibFFIType$SimpleType"), Boolean.FALSE);
disallowedClasses.put(access.findClassByName("com.oracle.truffle.nfi.impl.LibFFIType$StringType"), Boolean.FALSE);
disallowedClasses.put(access.findClassByName("com.oracle.truffle.nfi.impl.LibFFIType$VoidType"), Boolean.FALSE);
disallowedClasses.put(access.findClassByName("com.oracle.truffle.nfi.impl.NativeAllocation$FreeDestructor"), Boolean.FALSE);
disallowedClasses.put(access.findClassByName("com.oracle.truffle.nfi.impl.NativePointer"), Boolean.FALSE);
disallowedClasses.put(access.findClassByName("com.oracle.truffle.nfi.impl.NativeString"), Boolean.FALSE);
}

@Override
public Object apply(Object obj) {
if (disallowedClasses.containsKey(obj.getClass())) {
throw new UnsupportedFeatureException(String.format("Native object (%s) stored in pre-initialized context.", obj.getClass().getSimpleName()));
}
return obj;
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,6 @@
*/
package com.oracle.svm.truffle.nfi;

import com.oracle.svm.core.annotate.Alias;
import com.oracle.svm.core.annotate.RecomputeFieldValue;
import com.oracle.svm.core.annotate.RecomputeFieldValue.Kind;
import org.graalvm.nativeimage.ImageSingletons;
import org.graalvm.word.WordFactory;

Expand All @@ -35,18 +32,10 @@
@TargetClass(className = "com.oracle.truffle.nfi.impl.ClosureNativePointer", onlyWith = TruffleNFIFeature.IsEnabled.class)
final class Target_com_oracle_truffle_nfi_impl_ClosureNativePointer {

@Alias @RecomputeFieldValue(kind = Kind.Custom, declClass = NativeReferenceField.class) long codePointer;

@Substitute
private static void freeClosure(long closure) {
com.oracle.svm.truffle.nfi.LibFFI.ClosureData data = WordFactory.pointer(closure);
ImageSingletons.lookup(TruffleNFISupport.class).destroyClosureHandle(data.nativeClosureHandle());
LibFFI.ffi_closure_free(data);
}
}

@TargetClass(className = "com.oracle.truffle.nfi.impl.ClosureNativePointer", innerClass = "NativeDestructor", onlyWith = TruffleNFIFeature.IsEnabled.class)
final class Target_com_oracle_truffle_nfi_impl_ClosureNativePointer_NativeDestructor {

@Alias @RecomputeFieldValue(kind = Kind.Custom, declClass = NativeReferenceField.class) long nativeClosure;
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,10 @@
package com.oracle.svm.truffle.nfi;

import com.oracle.svm.core.annotate.Alias;
import com.oracle.svm.core.annotate.RecomputeFieldValue;
import com.oracle.svm.core.annotate.RecomputeFieldValue.Kind;
import com.oracle.svm.core.annotate.TargetClass;

@TargetClass(className = "com.oracle.truffle.nfi.impl.LibFFILibrary", onlyWith = TruffleNFIFeature.IsEnabled.class)
final class Target_com_oracle_truffle_nfi_impl_LibFFILibrary {

@Alias @RecomputeFieldValue(kind = Kind.Custom, declClass = NativeReferenceField.class) long handle;
@Alias long handle;
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,12 @@
package com.oracle.svm.truffle.nfi;

import com.oracle.svm.core.annotate.Alias;
import com.oracle.svm.core.annotate.RecomputeFieldValue;
import com.oracle.svm.core.annotate.RecomputeFieldValue.Kind;
import com.oracle.svm.core.annotate.TargetClass;

@TargetClass(className = "com.oracle.truffle.nfi.impl.LibFFISignature", onlyWith = TruffleNFIFeature.IsEnabled.class)
final class Target_com_oracle_truffle_nfi_impl_LibFFISignature {

@Alias @RecomputeFieldValue(kind = Kind.Custom, declClass = NativeReferenceField.class) long cif;
@Alias long cif;

@Alias
public native Target_com_oracle_truffle_nfi_impl_LibFFIType[] getArgTypes();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,6 @@
package com.oracle.svm.truffle.nfi;

import com.oracle.svm.core.annotate.Alias;
import com.oracle.svm.core.annotate.RecomputeFieldValue;
import com.oracle.svm.core.annotate.RecomputeFieldValue.Kind;
import com.oracle.svm.core.annotate.TargetClass;

@TargetClass(className = "com.oracle.truffle.nfi.impl.LibFFIType", onlyWith = TruffleNFIFeature.IsEnabled.class)
Expand All @@ -34,7 +32,7 @@ final class Target_com_oracle_truffle_nfi_impl_LibFFIType {
@Alias protected int alignment;
@Alias protected int objectCount;

@Alias @RecomputeFieldValue(kind = Kind.Custom, declClass = NativeReferenceField.class) protected long type;
@Alias protected long type;
}

@TargetClass(className = "com.oracle.truffle.nfi.impl.LibFFIType", innerClass = "StringType", onlyWith = TruffleNFIFeature.IsEnabled.class)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,9 +48,3 @@ static void free(long pointer) {
@Alias @RecomputeFieldValue(kind = Kind.FromAlias) //
static final AtomicReference<Thread> gcThread = new AtomicReference<>(null);
}

@TargetClass(className = "com.oracle.truffle.nfi.impl.NativeAllocation", innerClass = "FreeDestructor", onlyWith = TruffleNFIFeature.IsEnabled.class)
final class Target_com_oracle_truffle_nfi_impl_NativeAllocation_FreeDestructor {

@Alias @RecomputeFieldValue(kind = Kind.Custom, declClass = NativeReferenceField.class) long address;
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,6 @@
package com.oracle.svm.truffle.nfi;

import com.oracle.svm.core.annotate.Alias;
import com.oracle.svm.core.annotate.RecomputeFieldValue;
import com.oracle.svm.core.annotate.RecomputeFieldValue.Kind;
import com.oracle.svm.core.annotate.TargetClass;

@TargetClass(className = "com.oracle.truffle.nfi.impl.NativePointer", onlyWith = TruffleNFIFeature.IsEnabled.class)
Expand All @@ -33,6 +31,4 @@ final class Target_com_oracle_truffle_nfi_impl_NativePointer {
@Alias
Target_com_oracle_truffle_nfi_impl_NativePointer(@SuppressWarnings("unused") long pointer) {
}

@Alias @RecomputeFieldValue(kind = Kind.Custom, declClass = NativeReferenceField.class) long nativePointer;
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,16 +25,14 @@
import org.graalvm.word.WordFactory;

import com.oracle.svm.core.annotate.Alias;
import com.oracle.svm.core.annotate.RecomputeFieldValue;
import com.oracle.svm.core.annotate.RecomputeFieldValue.Kind;
import com.oracle.svm.core.annotate.Substitute;
import com.oracle.svm.core.annotate.TargetClass;
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;

@TargetClass(className = "com.oracle.truffle.nfi.impl.NativeString", onlyWith = TruffleNFIFeature.IsEnabled.class)
final class Target_com_oracle_truffle_nfi_impl_NativeString {

@Alias @RecomputeFieldValue(kind = Kind.Custom, declClass = NativeReferenceField.class) long nativePointer;
@Alias long nativePointer;

@Substitute
@TruffleBoundary
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,5 +56,6 @@ public List<Class<? extends Feature>> getRequiredFeatures() {
@Override
public void duringSetup(DuringSetupAccess access) {
ImageSingletons.add(TruffleNFISupport.class, new TruffleNFISupport());
access.registerObjectReplacer(new NativeObjectReplacer(access));
}
}

0 comments on commit 5d4b884

Please sign in to comment.