@Override Object execute(TruffleObject[] scopes, int length, Object[] arguments, int offset) throws InteropException { if (length == 0) { return VariableNamesObject.EMPTY; } else if (length == 1) { return ForeignAccess.sendKeys(keysNode, scopes[0]); } else { return collectKeys(scopes); } }
@Override Object execute(TruffleObject[] scopes, int length, Object[] arguments, int offset) throws InteropException { if (length == 0) { return VariableNamesObject.EMPTY; } else if (length == 1) { return ForeignAccess.sendKeys(keysNode, scopes[0]); } else { return collectKeys(scopes); } }
static Map<Object, Object> asMap(MessageNodes nodes, TruffleObject object) { TruffleObject keys; try { keys = ForeignAccess.sendKeys(nodes.keys, object, true); boolean hasSize = ForeignAccess.sendHasSize(nodes.hasSize, keys); if (!hasSize) { return null; } } catch (UnsupportedMessageException ex) { return null; } return new ObjectMap(nodes, object, keys); }
static Map<Object, Object> asMap(MessageNodes nodes, TruffleObject object) { TruffleObject keys; try { keys = ForeignAccess.sendKeys(nodes.keys, object, true); boolean hasSize = ForeignAccess.sendHasSize(nodes.hasSize, keys); if (!hasSize) { return null; } } catch (UnsupportedMessageException ex) { return null; } return new ObjectMap(nodes, object, keys); }
@TruffleBoundary private Object collectKeys(TruffleObject[] scopes) throws UnsupportedMessageException { // unfortunately we cannot do much butter as scopes might have // overlapping keys. So we need to make the set unique. Set<String> keySet = new HashSet<>(); for (TruffleObject scope : scopes) { TruffleObject keys = ForeignAccess.sendKeys(keysNode, scope); int size = ((Number) ForeignAccess.sendGetSize(getSizeNode, keys)).intValue(); for (int i = 0; i < size; i++) { try { keySet.add((String) ForeignAccess.sendRead(readNode, keys, i)); } catch (UnknownIdentifierException e) { } } } return new DefaultScope.VariableNamesObject(keySet); }
@TruffleBoundary private Object collectKeys(TruffleObject[] scopes) throws UnsupportedMessageException { // unfortunately we cannot do much butter as scopes might have // overlapping keys. So we need to make the set unique. Set<String> keySet = new HashSet<>(); for (TruffleObject scope : scopes) { TruffleObject keys = ForeignAccess.sendKeys(keysNode, scope); int size = ((Number) ForeignAccess.sendGetSize(getSizeNode, keys)).intValue(); for (int i = 0; i < size; i++) { try { keySet.add((String) ForeignAccess.sendRead(readNode, keys, i)); } catch (UnknownIdentifierException e) { } } } return new DefaultScope.VariableNamesObject(keySet); }
private static boolean hasKeys(TruffleObject object) { try { TruffleObject keys = ForeignAccess.sendKeys(Message.KEYS.createNode(), object); if (keys == null) { return false; } return ForeignAccess.sendHasSize(Message.HAS_SIZE.createNode(), keys); } catch (UnsupportedMessageException ex) { return false; } }
private static boolean hasKeys(TruffleObject object) { try { TruffleObject keys = ForeignAccess.sendKeys(Message.KEYS.createNode(), object); if (keys == null) { return false; } return ForeignAccess.sendHasSize(Message.HAS_SIZE.createNode(), keys); } catch (UnsupportedMessageException ex) { return false; } }
@Override public Set<String> getMemberKeys(Object receiver) { Object prev = languageContext.context.enterIfNeeded(); try { try { final Object keys = ForeignAccess.sendKeys(cache.keysNode, (TruffleObject) receiver, false); if (!(keys instanceof TruffleObject)) { return Collections.emptySet(); } return new MemberSet((TruffleObject) receiver, (TruffleObject) keys); } catch (UnsupportedMessageException e) { return Collections.emptySet(); } } catch (Throwable e) { throw PolyglotImpl.wrapGuestException(languageContext, e); } finally { languageContext.context.leaveIfNeeded(prev); } }
@Override public Set<String> getMemberKeys(Object receiver) { Object prev = languageContext.enter(); try { try { final Object keys = ForeignAccess.sendKeys(keysNode, (TruffleObject) receiver, false); if (!(keys instanceof TruffleObject)) { return Collections.emptySet(); } return new MemberSet((TruffleObject) receiver, (TruffleObject) keys); } catch (UnsupportedMessageException e) { return Collections.emptySet(); } } catch (Throwable e) { throw wrapGuestException(languageContext, e); } finally { languageContext.leave(prev); } }
@Override @SuppressWarnings("unchecked") protected Object executeImpl(PolyglotLanguageContext languageContext, TruffleObject receiver, Object[] args) { List<?> keys = null; int keysSize = 0; int elemSize = 0; PolyglotMap<Object, Object> originalMap = (PolyglotMap<Object, Object>) args[ARGUMENT_OFFSET]; if (cache.memberKey && sendHasKeys(hasKeys, receiver)) { TruffleObject truffleKeys; try { truffleKeys = sendKeys(keysNode, receiver); } catch (UnsupportedMessageException e) { CompilerDirectives.transferToInterpreter(); return Collections.emptySet(); } keys = PolyglotList.create(languageContext, truffleKeys, false, String.class, null); keysSize = keys.size(); } else if (cache.numberKey && sendHasSize(hasSize, receiver)) { try { elemSize = ((Number) sendGetSize(getSize, receiver)).intValue(); } catch (UnsupportedMessageException e) { elemSize = 0; } } return originalMap.new LazyEntries(keys, keysSize, elemSize); }
@Override @SuppressWarnings("unchecked") protected Object executeImpl(Object languageContext, TruffleObject receiver, Object[] args, int offset) { List<?> keys = null; int keysSize = 0; int elemSize = 0; TruffleMap<Object, Object> originalMap = (TruffleMap<Object, Object>) args[offset]; boolean includeInternal = (boolean) args[offset + 1]; if (cache.memberKey && sendHasKeys(hasKeys, receiver)) { TruffleObject truffleKeys; try { truffleKeys = sendKeys(keysNode, receiver, includeInternal); } catch (UnsupportedMessageException e) { CompilerDirectives.transferToInterpreter(); return Collections.emptySet(); } keys = TruffleList.create(languageContext, truffleKeys, false, String.class, null); keysSize = keys.size(); } else if (cache.numberKey && sendHasSize(hasSize, receiver)) { try { elemSize = ((Number) sendGetSize(getSize, receiver)).intValue(); } catch (UnsupportedMessageException e) { elemSize = 0; } } return originalMap.new LazyEntries(keys, keysSize, elemSize); }
/** * Sends an {@link Message#HAS_KEYS HAS_KEYS message} to the foreign receiver object by * executing the <code>hasKeysNode</code>. If the object does not support the message, a * {@link Message#KEYS} message is sent to test the presence of keys. * * @param hasKeysNode the createNode created by {@link Message#createNode()} * @param receiver foreign object to receive the message passed to {@link Message#createNode()} * method * @return return value, if any * @throws ClassCastException if the createNode has not been created by * {@link Message#createNode()} method. * @since 0.30 */ public static boolean sendHasKeys(Node hasKeysNode, TruffleObject receiver) { try { return (boolean) ((InteropAccessNode) hasKeysNode).execute(receiver); } catch (UnsupportedMessageException ex) { CompilerDirectives.transferToInterpreter(); try { sendKeys(Message.KEYS.createNode(), receiver, true); return true; } catch (UnsupportedMessageException uex) { return false; } } catch (InteropException e) { CompilerDirectives.transferToInterpreter(); throw new AssertionError("Unexpected exception caught.", e); } }
/** * Sends an {@link Message#HAS_KEYS HAS_KEYS message} to the foreign receiver object by * executing the <code>hasKeysNode</code>. If the object does not support the message, a * {@link Message#KEYS} message is sent to test the presence of keys. * * @param hasKeysNode the createNode created by {@link Message#createNode()} * @param receiver foreign object to receive the message passed to {@link Message#createNode()} * method * @return return value, if any * @throws ClassCastException if the createNode has not been created by * {@link Message#createNode()} method. * @since 0.30 */ public static boolean sendHasKeys(Node hasKeysNode, TruffleObject receiver) { try { return (boolean) ((InteropAccessNode) hasKeysNode).execute(receiver); } catch (UnsupportedMessageException ex) { CompilerDirectives.transferToInterpreter(); try { sendKeys(Message.KEYS.createNode(), receiver, true); return true; } catch (UnsupportedMessageException uex) { return false; } } catch (InteropException e) { CompilerDirectives.transferToInterpreter(); throw new AssertionError("Unexpected exception caught.", e); } }
keys = ForeignAccess.sendKeys(Message.KEYS.createNode(), tObj); } catch (UnsupportedMessageException e) { throw new AssertionError("Invalid node object: must support the KEYS message.", e);
keys = ForeignAccess.sendKeys(Message.KEYS.createNode(), tObj); } catch (UnsupportedMessageException e) { throw new AssertionError("Invalid node object: must support the KEYS message.", e);