Skip to content

Commit

Permalink
Disable interrupt handler during polyglot eval
Browse files Browse the repository at this point in the history
This way, polyglot eval behaves similar to BlockClosure>>#valueNoContextSwitch
  • Loading branch information
fniephaus committed Dec 21, 2018
1 parent e6875e7 commit c0744c4
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ protected int execute(final Context.Builder contextBuilder) {
return 0;
} else {
context.eval(Source.newBuilder(getLanguageId(), new File(imagePath)).internal(true).mimeType(SqueakLanguageConfig.MIME_TYPE).build()).execute();
throw abort("A Squeak/Smalltalk image cannot return a result as it can only exit.");
throw abort("A Squeak/Smalltalk image cannot return a result, it can only exit.");
}
} catch (PolyglotException e) {
if (e.isExit()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import com.oracle.truffle.api.source.Source.LiteralBuilder;
import com.oracle.truffle.api.source.Source.SourceBuilder;

import de.hpi.swa.graal.squeak.exceptions.ProcessSwitch;
import de.hpi.swa.graal.squeak.exceptions.PrimitiveExceptions.PrimitiveFailed;
import de.hpi.swa.graal.squeak.image.SqueakImageContext;
import de.hpi.swa.graal.squeak.model.AbstractSqueakObject;
Expand Down Expand Up @@ -66,11 +67,11 @@ protected PrimEvalStringNode(final CompiledMethodObject method) {
}

@TruffleBoundary
@Specialization(guards = {"languageIdOrMimeTypeObj.isByteType()", "source.isByteType()"})
protected final Object doParseAndCall(@SuppressWarnings("unused") final Object receiver, final NativeObject languageIdOrMimeTypeObj, final NativeObject source) {
@Specialization(guards = {"languageIdOrMimeTypeObj.isByteType()", "sourceObject.isByteType()"})
protected final Object doParseAndCall(@SuppressWarnings("unused") final Object receiver, final NativeObject languageIdOrMimeTypeObj, final NativeObject sourceObject) {
PrimGetLastErrorNode.unsetLastError();
final String languageIdOrMimeType = languageIdOrMimeTypeObj.asString();
final String sourceText = source.asString();
final String sourceText = sourceObject.asString();
final Env env = code.image.env;
try {
final boolean mimeType = isMimeType(languageIdOrMimeType);
Expand All @@ -79,7 +80,9 @@ protected final Object doParseAndCall(@SuppressWarnings("unused") final Object r
if (mimeType) {
newBuilder = newBuilder.mimeType(languageIdOrMimeType);
}
return code.image.wrap(env.parse(newBuilder.build()).call());
final Source source = newBuilder.build();
final Object result = code.image.runWithoutInterrupts(() -> env.parse(source).call());
return code.image.wrap(result);
} catch (RuntimeException e) {
CompilerDirectives.transferToInterpreter();
PrimGetLastErrorNode.setLastError(code, e);
Expand Down

0 comments on commit c0744c4

Please sign in to comment.