PropertyNamedValue(DebuggerSession session, LanguageInfo language, TruffleObject object, Map<Object, Object> map, String name, DebugScope scope) { this(session, language, ForeignAccess.sendKeyInfo(Message.KEY_INFO.createNode(), object, name), map, name, scope); }
@Override protected Object executeImpl(Object receiver, Object[] args) { String key = (String) args[1]; int keyInfo = ForeignAccess.sendKeyInfo(keyInfoNode, (TruffleObject) receiver, key); return KeyInfo.isExisting(keyInfo); }
PropertyNamedValue(Debugger debugger, LanguageInfo language, TruffleObject object, Map<Object, Object> map, String name, DebugScope scope) { this(debugger, language, ForeignAccess.sendKeyInfo(Message.KEY_INFO.createNode(), object, name), map, name, scope); }
PropertyValue(Debugger debugger, LanguageInfo language, TruffleObject object, Map.Entry<Object, Object> property, DebugScope scope) { this(debugger, language, ForeignAccess.sendKeyInfo(Message.KEY_INFO.createNode(), object, property.getKey()), property, scope); }
PropertyValue(DebuggerSession session, LanguageInfo language, TruffleObject object, Map.Entry<Object, Object> property, DebugScope scope) { this(session, language, ForeignAccess.sendKeyInfo(Message.KEY_INFO.createNode(), object, property.getKey()), property, scope); }
protected abstract Object executeImpl(int keyInfo); }
@Override protected Object executeImpl(PolyglotLanguageContext languageContext, TruffleObject receiver, Object[] args) { Object key = args[ARGUMENT_OFFSET]; if (isValidKey(receiver, key)) { return KeyInfo.isReadable(sendKeyInfo(keyInfo, receiver, key)); } return false; }
@Override protected Object executeImpl(Object languageContext, TruffleObject receiver, Object[] args, int offset) { Object key = args[offset]; if (isValidKey(receiver, key)) { return KeyInfo.isReadable(sendKeyInfo(keyInfo, receiver, key)); } return false; }
@Override Object execute(TruffleObject[] scopes, int length, Object[] arguments, int offset) throws InteropException { String identifier = expectIdentifier(arguments, offset, Message.KEY_INFO); int keyInfo = KeyInfo.NONE; for (int i = 0; i < length; i++) { TruffleObject scopeObject = scopes[i]; int currentInfo = ForeignAccess.sendKeyInfo(keyInfoNode, scopeObject, identifier); if (KeyInfo.isExisting(currentInfo)) { keyInfo = currentInfo; break; } else if (KeyInfo.isInsertable(currentInfo)) { keyInfo = currentInfo; } } return keyInfo; }
@Override Object execute(TruffleObject[] scopes, int length, Object[] arguments, int offset) throws InteropException { String identifier = expectIdentifier(arguments, offset, Message.KEY_INFO); int keyInfo = KeyInfo.NONE; for (int i = 0; i < length; i++) { TruffleObject scopeObject = scopes[i]; int currentInfo = ForeignAccess.sendKeyInfo(keyInfoNode, scopeObject, identifier); if (KeyInfo.isExisting(currentInfo)) { keyInfo = currentInfo; break; } else if (KeyInfo.isInsertable(currentInfo)) { keyInfo = currentInfo; } } return keyInfo; }
@Override public boolean contains(Object o) { if (!(o instanceof String)) { return false; } Object prev = languageContext.enter(); try { int keyInfo = ForeignAccess.sendKeyInfo(keyInfoNode, receiver, o); return KeyInfo.isExisting(keyInfo); } catch (Throwable e) { throw wrapGuestException(languageContext, e); } finally { languageContext.leave(prev); } }
@Override public boolean contains(Object o) { if (!(o instanceof String)) { return false; } Object prev = languageContext.context.enterIfNeeded(); try { int keyInfo = ForeignAccess.sendKeyInfo(cache.keyInfoNode, receiver, o); return KeyInfo.isExisting(keyInfo); } catch (Throwable e) { throw PolyglotImpl.wrapGuestException(languageContext, e); } finally { languageContext.context.leaveIfNeeded(prev); } }
@Override protected Object executeImpl(PolyglotLanguageContext languageContext, TruffleObject receiver, Object[] args) { Object key = args[ARGUMENT_OFFSET]; Object result = null; if (isValidKey(receiver, key) && KeyInfo.isReadable(sendKeyInfo(keyInfo, receiver, key))) { try { result = toHost.execute(sendRead(read, receiver, key), cache.valueClass, cache.valueType, languageContext); } catch (ClassCastException | NullPointerException e) { // expected exceptions from casting to the host value. throw e; } catch (UnknownIdentifierException e) { return null; } catch (UnsupportedMessageException e) { // be robust for misbehaving languages return null; } } return result; }
@Override protected Object executeImpl(Object languageContext, TruffleObject receiver, Object[] args, int offset) { Object key = args[offset]; Object result = null; if (isValidKey(receiver, key) && KeyInfo.isReadable(sendKeyInfo(keyInfo, receiver, key))) { try { result = toHost.execute(sendRead(read, receiver, key), cache.valueClass, cache.valueType, languageContext); } catch (ClassCastException | NullPointerException e) { // expected exceptions from casting to the host value. throw e; } catch (UnknownIdentifierException e) { return null; } catch (UnsupportedMessageException e) { // be robust for misbehaving languages return null; } } return result; }
Object lookupGuest(String symbolName) { ensureInitialized(null); Iterable<?> topScopes = VMAccessor.instrumentAccess().findTopScopes(env); for (Object topScope : topScopes) { Scope scope = (Scope) topScope; TruffleObject variables = (TruffleObject) scope.getVariables(); int symbolInfo = ForeignAccess.sendKeyInfo(keyInfoNode, variables, symbolName); if (KeyInfo.isExisting(symbolInfo) && KeyInfo.isReadable(symbolInfo)) { try { return ForeignAccess.sendRead(readNode, variables, symbolName); } catch (InteropException ex) { throw new AssertionError(symbolName, ex); } } } return null; }
@Override Object execute(TruffleObject[] scopes, int length, Object[] arguments, int offset) throws UnknownIdentifierException, UnsupportedMessageException { String identifier = expectIdentifier(arguments, offset, Message.READ); if (isConstantSingleLength()) { return ForeignAccess.sendRead(readNode, scopes[0], identifier); } else if (length > 0) { for (int i = 0; i < length; i++) { TruffleObject scopeObject = scopes[i]; if (KeyInfo.isReadable(ForeignAccess.sendKeyInfo(keyInfoNode, scopeObject, identifier))) { return ForeignAccess.sendRead(readNode, scopeObject, identifier); } } } throw UnknownIdentifierException.raise(identifier); }
@Override Object execute(TruffleObject[] scopes, int length, Object[] arguments, int offset) throws UnknownIdentifierException, UnsupportedMessageException { String identifier = expectIdentifier(arguments, offset, Message.READ); if (isConstantSingleLength()) { return ForeignAccess.sendRead(readNode, scopes[0], identifier); } else if (length > 0) { for (int i = 0; i < length; i++) { TruffleObject scopeObject = scopes[i]; if (KeyInfo.isReadable(ForeignAccess.sendKeyInfo(keyInfoNode, scopeObject, identifier))) { return ForeignAccess.sendRead(readNode, scopeObject, identifier); } } } throw UnknownIdentifierException.raise(identifier); }
@Override Object execute(TruffleObject[] scopes, int length, Object[] arguments, int offset) throws InteropException { String identifier = expectIdentifier(arguments, offset, Message.WRITE); Object value = arguments[offset + 1]; if (isConstantSingleLength()) { return ForeignAccess.sendWrite(writeNode, scopes[0], identifier, value); } else if (length > 0) { for (int i = 0; i < length; i++) { TruffleObject scopeObject = scopes[i]; if (KeyInfo.isWritable(ForeignAccess.sendKeyInfo(keyInfoNode, scopeObject, identifier))) { return ForeignAccess.sendWrite(writeNode, scopeObject, identifier, value); } } } throw UnsupportedMessageException.raise(Message.WRITE); }
@Override Object execute(TruffleObject[] scopes, int length, Object[] arguments, int offset) throws InteropException { String identifier = expectIdentifier(arguments, offset, Message.WRITE); Object value = arguments[offset + 1]; if (isConstantSingleLength()) { return ForeignAccess.sendWrite(writeNode, scopes[0], identifier, value); } else if (length > 0) { for (int i = 0; i < length; i++) { TruffleObject scopeObject = scopes[i]; if (KeyInfo.isWritable(ForeignAccess.sendKeyInfo(keyInfoNode, scopeObject, identifier))) { return ForeignAccess.sendWrite(writeNode, scopeObject, identifier, value); } } } throw UnsupportedMessageException.raise(Message.WRITE); }
@Override Object execute(TruffleObject[] scopes, int length, Object[] arguments, int offset) throws InteropException { String identifier = expectIdentifier(arguments, offset, Message.REMOVE); if (isConstantSingleLength()) { return ForeignAccess.sendRemove(removeNode, scopes[0], identifier); } else if (length > 0) { for (int i = 0; i < length; i++) { TruffleObject scopeObject = scopes[i]; int keyInfo = ForeignAccess.sendKeyInfo(keyInfoNode, scopeObject, identifier); if (KeyInfo.isRemovable(keyInfo)) { return ForeignAccess.sendRemove(removeNode, scopeObject, identifier); } else if (KeyInfo.isExisting(keyInfo)) { CompilerDirectives.transferToInterpreter(); throw UnsupportedMessageException.raise(Message.REMOVE); } } } CompilerDirectives.transferToInterpreter(); throw UnknownIdentifierException.raise(identifier); }