Skip to content

Commit

Permalink
[Truffle] Refactor primitives, rename param
Browse files Browse the repository at this point in the history
  • Loading branch information
Brandon Fish committed Sep 14, 2016
1 parent ecc8c49 commit ffbfc89
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 48 deletions.
66 changes: 23 additions & 43 deletions truffle/src/main/java/org/jruby/truffle/core/VMPrimitiveNodes.java
Expand Up @@ -256,78 +256,58 @@ public boolean vmObjectKindOf(Object object, DynamicObject rubyClass) {

}

@Primitive(name = "vm_object_respond_to", needsSelf = false)
public static abstract class VMObjectRespondToPrimitiveNode extends PrimitiveArrayArgumentsNode {
@Primitive(name = "vm_method_is_basic", needsSelf = false)
public static abstract class VMMethodIsBasicNode extends PrimitiveArrayArgumentsNode {

@Child private KernelNodes.RespondToNode respondToNode;

public VMObjectRespondToPrimitiveNode(RubyContext context, SourceSection sourceSection) {
public VMMethodIsBasicNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
respondToNode = KernelNodesFactory.RespondToNodeFactory.create(context, sourceSection, null, null, null);
}

@Specialization
public boolean vmObjectRespondTo(VirtualFrame frame, Object object, Object name, boolean includePrivate) {
return respondToNode.executeDoesRespondTo(frame, object, name, includePrivate);
public boolean vmMethodIsBasic(VirtualFrame frame, DynamicObject method) {
return Layouts.METHOD.getMethod(method).isBuiltIn();
}

}

@Primitive(name = "vm_object_respond_to_no_built_in", needsSelf = false)
public static abstract class VMObjectRespondToNoBuiltInPrimitiveNode extends PrimitiveArrayArgumentsNode {
@Primitive(name = "vm_method_lookup", needsSelf = false)
public static abstract class VMMethodLookupNode extends PrimitiveArrayArgumentsNode {

@Child NameToJavaStringNode nameToJavaStringNode;
@Child LookupMethodNode lookupMethodNode;

public VMObjectRespondToNoBuiltInPrimitiveNode(RubyContext context, SourceSection sourceSection) {
public VMMethodLookupNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
nameToJavaStringNode = NameToJavaStringNode.create();
lookupMethodNode = LookupMethodNodeGen.create(context, sourceSection, true, false, null, null);
}

@Specialization
public boolean vmObjectRespondToNoBuiltIn(VirtualFrame frame, Object object, Object name, boolean includePrivate) {
// Used in place for this pattern:
// method_entry_get(klass, mid, &defined_class);
// if (!me || METHOD_ENTRY_BASIC(me))

final String nameString = nameToJavaStringNode.executeToJavaString(frame, name);
final InternalMethod method = ModuleOperations.lookupMethod(coreLibrary().getMetaClass(object), nameString);

// If no method was found, use #method_missing
public DynamicObject vmMethodLookup(VirtualFrame frame, Object self, Object name) {
// TODO BJF Sep 14, 2016 Handle private
final String normalizedName = nameToJavaStringNode.executeToJavaString(frame, name);
InternalMethod method = lookupMethodNode.executeLookupMethod(frame, self, normalizedName);
if (method == null) {
return false;
}

// Check for methods that are explicitly undefined
if (method.isUndefined()) {
return false;
}

if(method.isBuiltIn()){
return false;
return nil();
}

return true;
return Layouts.METHOD.createMethod(coreLibrary().getMethodFactory(), self, method);
}

}

@Primitive(name = "vm_check_funcall_callable", needsSelf = false)
public static abstract class VMObjectFuncallCallablePrimitiveNode extends PrimitiveArrayArgumentsNode {
@Primitive(name = "vm_object_respond_to", needsSelf = false)
public static abstract class VMObjectRespondToPrimitiveNode extends PrimitiveArrayArgumentsNode {

@Child NameToJavaStringNode nameToJavaStringNode;
@Child LookupMethodNode lookupMethodNode;
@Child private KernelNodes.RespondToNode respondToNode;

public VMObjectFuncallCallablePrimitiveNode(RubyContext context, SourceSection sourceSection) {
public VMObjectRespondToPrimitiveNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
nameToJavaStringNode = NameToJavaStringNode.create();
lookupMethodNode = LookupMethodNodeGen.create(context, sourceSection, true, false, null, null);
respondToNode = KernelNodesFactory.RespondToNodeFactory.create(context, sourceSection, null, null, null);
}

@Specialization
public boolean vmCheckFuncallCallable(VirtualFrame frame, Object self, Object name) {
final String nameString = nameToJavaStringNode.executeToJavaString(frame, name);
final InternalMethod method = lookupMethodNode.executeLookupMethod(frame, self, nameString);
return method != null;
public boolean vmObjectRespondTo(VirtualFrame frame, Object object, Object name, boolean includePrivate) {
return respondToNode.executeDoesRespondTo(frame, object, name, includePrivate);
}

}
Expand Down
11 changes: 6 additions & 5 deletions truffle/src/main/ruby/core/type.rb
Expand Up @@ -83,12 +83,13 @@ def self.object_respond_to?(obj, name, include_private = false)
end

def self.object_respond_to_no_built_in?(obj, name, include_private = false)
Truffle.invoke_primitive :vm_object_respond_to_no_built_in, obj, name, include_private
meth = Truffle.invoke_primitive :vm_method_lookup, obj, name
!meth.nil? && !(Truffle.invoke_primitive :vm_method_is_basic, meth)
end

def self.check_funcall_callable(obj, meth)
def self.check_funcall_callable(obj, name)
# TODO BJF Review rb_method_call_status
Truffle.invoke_primitive :vm_check_funcall_callable, obj, meth
!(Truffle.invoke_primitive :vm_method_lookup, obj, name).nil?
end

def self.object_equal(a, b)
Expand Down Expand Up @@ -229,10 +230,10 @@ def self.rb_check_convert_type(obj, cls, meth)
v
end

def self.convert_type(obj, cls, meth, raise)
def self.convert_type(obj, cls, meth, raise_on_error)
r = check_funcall(obj, meth)
if undefined.equal?(r)
if raise
if raise_on_error
raise TypeError, "can't convert #{obj} into #{cls} with #{meth}"
end
return nil
Expand Down

0 comments on commit ffbfc89

Please sign in to comment.