Index: src/wasm/asm-wasm-builder.cc |
diff --git a/src/wasm/asm-wasm-builder.cc b/src/wasm/asm-wasm-builder.cc |
index 691cc374694e0773ac4791b7c0b145698c0d9fc7..6c4550107f7baf8f2a2dd92f5f6f3fa76d0d9be8 100644 |
--- a/src/wasm/asm-wasm-builder.cc |
+++ b/src/wasm/asm-wasm-builder.cc |
@@ -27,7 +27,8 @@ namespace wasm { |
class AsmWasmBuilderImpl : public AstVisitor { |
public: |
- AsmWasmBuilderImpl(Isolate* isolate, Zone* zone, FunctionLiteral* literal) |
+ AsmWasmBuilderImpl(Isolate* isolate, Zone* zone, FunctionLiteral* literal, |
+ Handle<Object> foreign) |
: local_variables_(HashMap::PointersMatch, |
ZoneHashMap::kDefaultHashMapCapacity, |
ZoneAllocationPolicy(zone)), |
@@ -44,6 +45,7 @@ class AsmWasmBuilderImpl : public AstVisitor { |
literal_(literal), |
isolate_(isolate), |
zone_(zone), |
+ foreign_(foreign), |
cache_(TypeCache::Get()), |
breakable_blocks_(zone), |
block_size_(0), |
@@ -559,6 +561,24 @@ class AsmWasmBuilderImpl : public AstVisitor { |
void VisitAssignment(Assignment* expr) { |
bool in_init = false; |
if (!in_function_) { |
+ BinaryOperation* binop = expr->value()->AsBinaryOperation(); |
+ if (binop != nullptr) { |
+ Property* prop = binop->left()->AsProperty(); |
+ DCHECK(prop != nullptr); |
+ LoadInitFunction(); |
+ is_set_op_ = true; |
+ RECURSE(Visit(expr->target())); |
+ DCHECK(!is_set_op_); |
+ if (binop->op() == Token::MUL) { |
+ VisitForeignVariable(true, prop); |
+ } else if (binop->op() == Token::BIT_OR) { |
+ VisitForeignVariable(false, prop); |
+ } else { |
+ UNREACHABLE(); |
+ } |
+ UnLoadInitFunction(); |
+ return; |
+ } |
// TODO(bradnelson): Get rid of this. |
if (TypeOf(expr->value()) == kAstStmt) { |
Property* prop = expr->value()->AsProperty(); |
@@ -610,6 +630,34 @@ class AsmWasmBuilderImpl : public AstVisitor { |
void VisitThrow(Throw* expr) { UNREACHABLE(); } |
+ void VisitForeignVariable(bool is_float, Property* expr) { |
+ VariableProxy* var_proxy = expr->obj()->AsVariableProxy(); |
+ DCHECK(var_proxy != nullptr); |
+ Variable* var = var_proxy->var(); |
+ DCHECK(var->location() == VariableLocation::PARAMETER && var->index() == 1); |
+ Literal* key_literal = expr->key()->AsLiteral(); |
+ DCHECK(key_literal != nullptr); |
+ double val = 0.0; |
+ if (!key_literal->value().is_null() && !foreign_.is_null()) { |
aseemgarg
2016/02/09 02:38:55
Not sure of these constructs. @Ben, can you review
bradnelson
2016/02/09 04:55:23
Yes please!
|
+ Handle<Name> name = |
+ i::Object::ToName(isolate_, key_literal->value()).ToHandleChecked(); |
+ MaybeHandle<Object> maybe_value = i::Object::GetProperty(foreign_, name); |
+ if (!maybe_value.is_null()) { |
+ Handle<Object> value = maybe_value.ToHandleChecked(); |
+ if (!value.is_null() && value->IsNumber()) { |
+ val = static_cast<double>(value->Number()); |
+ } |
+ } |
+ } |
+ if (is_float) { |
+ byte code[] = {WASM_F64(val)}; |
+ current_function_builder_->EmitCode(code, sizeof(code)); |
+ } else { |
+ byte code[] = {WASM_I32(static_cast<int32_t>(val))}; |
+ current_function_builder_->EmitCode(code, sizeof(code)); |
+ } |
+ } |
+ |
void VisitProperty(Property* expr) { |
Expression* obj = expr->obj(); |
DCHECK(obj->bounds().lower == obj->bounds().upper); |
@@ -1173,6 +1221,7 @@ class AsmWasmBuilderImpl : public AstVisitor { |
FunctionLiteral* literal_; |
Isolate* isolate_; |
Zone* zone_; |
+ Handle<Object> foreign_; |
TypeCache const& cache_; |
ZoneVector<std::pair<BreakableStatement*, bool>> breakable_blocks_; |
int block_size_; |
@@ -1188,13 +1237,13 @@ class AsmWasmBuilderImpl : public AstVisitor { |
}; |
AsmWasmBuilder::AsmWasmBuilder(Isolate* isolate, Zone* zone, |
- FunctionLiteral* literal) |
- : isolate_(isolate), zone_(zone), literal_(literal) {} |
+ FunctionLiteral* literal, Handle<Object> foreign) |
+ : isolate_(isolate), zone_(zone), literal_(literal), foreign_(foreign) {} |
// TODO(aseemgarg): probably should take zone (to write wasm to) as input so |
// that zone in constructor may be thrown away once wasm module is written. |
WasmModuleIndex* AsmWasmBuilder::Run() { |
- AsmWasmBuilderImpl impl(isolate_, zone_, literal_); |
+ AsmWasmBuilderImpl impl(isolate_, zone_, literal_, foreign_); |
impl.Compile(); |
WasmModuleWriter* writer = impl.builder_->Build(zone_); |
return writer->WriteTo(zone_); |